-->

BRAM_INIT在VHDL(BRAM_INIT in VHDL)

2019-09-17 04:48发布

我模拟基于处理器的设计,其中程序存储器的内容,在BRAM举行。 我意识到使用VHDL(推断BRAMs)程序存储器。 我试图避免CoreGen,因为我想保持设计便于携带。 最终,这样的设计会去的FPGA。

我想看看是否有一种方法来初始化使用VHDL泛型BRAMs的存储内容? 据我所知,Coregen使用COE文件来初始化BRAM但我们有一个基于VHDL代码的方式来做到这一点?

让我知道您的备选建议,以及。

Answer 1:

是的,它当然是可能的。 看看在Xilinx综合工具(XST)用户指南 ,特别是187页。

他们建议要做到这一点的代码如下转载。 他们有用户指南中关于将要读取的文件的格式说明。 请注意,这个代码不直接使用泛型,但我可以想像,你可能设置固定或通用持有的文件名的名称...

--
-- Initializing Block RAM from external data file
--
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use std.textio.all;

entity rams_20c is
port(clk : in std_logic;
   we : in std_logic;
   addr : in std_logic_vector(5 downto 0);
   din : in std_logic_vector(31 downto 0);
   dout : out std_logic_vector(31 downto 0));
end rams_20c;
architecture syn of rams_20c is
   type RamType is array(0 to 63) of bit_vector(31 downto 0);
   impure function InitRamFromFile (RamFileName : in string) return RamType is
      FILE RamFile : text is in RamFileName;
      variable RamFileLine : line;
      variable RAM : RamType;
   begin
      for I in RamType’range loop
         readline (RamFile, RamFileLine);
         read (RamFileLine, RAM(I));
      end loop;
      return RAM;
   end function;
signal RAM : RamType := InitRamFromFile("rams_20c.data");
begin
   process (clk)
   begin
      if clk’event and clk = ’1’ then
         if we = ’1’ then
            RAM(conv_integer(addr)) <= to_bitvector(din);
         end if;
         dout <= to_stdlogicvector(RAM(conv_integer(addr)));
      end if;
   end process;
end syn;


Answer 2:

另外,不要打扰使用泛型或读取文件; 只需要声明的封装中的恒定阵列。 把它放在一个包,而不是主要的架构,甚至可以自动使用脚本(比如,阅读汇编输出或文本文件)写的包。

library ieee;
use ieee.std_logic_1164.all;

package ProgMem is

type Word is std_logic_vector(7 downto 0);

constant ROM : array (0 to 3) of Word := 
    (
         X"C3",
         X"00",
         X"00",
         "UUUUUUUU" );         

end package Progmem;

真正的程序可能会更长,但是这说明了模式



文章来源: BRAM_INIT in VHDL