Embedded VHDL语言中的BRAM_INIT

Embedded VHDL语言中的BRAM_INIT,embedded,vhdl,fpga,xilinx,Embedded,Vhdl,Fpga,Xilinx,我正在模拟一种基于处理器的设计,其中程序内存内容保存在BRAM中。我正在使用VHDL(推断BRAM)实现程序内存。我尽量避免使用CoreGen,因为我想保持设计的可移植性。最终,该设计将应用于FPGA 我想看看是否有一种方法可以使用VHDL泛型初始化BRAM的内存内容?我知道Coregen使用COE文件来初始化BRAM,但我们有基于VHDL代码的方法来实现这一点吗 请告诉我您的其他建议。是的,这当然是可能的。看看这本书,特别是187页 他们建议执行此操作的代码复制如下。他们在用户指南中有关于将要

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

我想看看是否有一种方法可以使用VHDL泛型初始化BRAM的内存内容?我知道Coregen使用COE文件来初始化BRAM,但我们有基于VHDL代码的方法来实现这一点吗


请告诉我您的其他建议。

是的,这当然是可能的。看看这本书,特别是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;
--
--从外部数据文件初始化块RAM
--
图书馆ieee;
使用ieee.std_logic_1164.all;
使用ieee.std_logic_unsigned.all;
使用std.textio.all;
实体rams_20c是
端口(时钟:在标准逻辑中;
我们:在标准逻辑中;
地址:标准逻辑向量(5到0);
din:标准逻辑向量(31到0);
dout:out标准逻辑向量(31到0);
端部闸板(20c);
rams_20c的架构syn为
类型RamType是位_向量(31到0)的数组(0到63);
不纯函数InitRamFromFile(RamFileName:in string)返回的RamType为
文件RamFile:文本在RamFileName中;
变量RamFileLine:line;
可变RAM:RamType;
开始
对于RamType'范围循环中的I
readline(RamFile,RamFileLine);
读取(RamFileLine,RAM(I));
端环;
回程闸板;
末端功能;
信号RAM:RamType:=InitRamFromFile(“rams_20c.data”);
开始
过程(clk)
开始
如果clk'事件和clk='1',则
如果我们='1',那么

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


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

谢谢。我设法使它使用一个通用字符串作为文件名。
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;