4

我正在模拟基于处理器的设计,其中程序存储器内容保存在 BRAM 中。我正在使用 VHDL(推断 BRAM)实现程序存储器。我试图避免使用 CoreGen,因为我想保持设计的可移植性。最终,该设计将用于 FPGA。

我想看看是否有办法使用 VHDL 泛型初始化 BRAM 的内存内容?我知道 Coregen 使用 COE 文件来初始化 BRAM,但我们是否有基于 VHDL 代码的方法来执行此操作?

让我知道你的替代建议。

4

2 回答 2

10

是的,这当然是可能的。查看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;
于 2012-05-11T18:07:57.990 回答
1

或者,不要费心使用泛型或读取文件;只需在包中声明一个常量数组。将它放在一个包而不是主架构中,您甚至可以使用脚本自动编写包(例如,读取汇编器输出或文本文件)。

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;

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

于 2013-02-01T23:52:08.420 回答