我正在模擬基於處理器的設計,其中程序存儲器內容保存在BRAM中。我正在使用VHDL實現程序內存(推斷BRAM)。我試圖避免CoreGen,因爲我想保持設計的便攜性。最終,這種設計將轉至FPGA。VHDL中的BRAM_INIT
我正在查看是否有一種方法來初始化使用VHDL泛型的BRAM的內存內容?據我所知,Coregen使用COE文件初始化BRAM,但是我們是否有基於VHDL代碼的方式來執行此操作?
讓我知道你的替代建議。
我正在模擬基於處理器的設計,其中程序存儲器內容保存在BRAM中。我正在使用VHDL實現程序內存(推斷BRAM)。我試圖避免CoreGen,因爲我想保持設計的便攜性。最終,這種設計將轉至FPGA。VHDL中的BRAM_INIT
我正在查看是否有一種方法來初始化使用VHDL泛型的BRAM的內存內容?據我所知,Coregen使用COE文件初始化BRAM,但是我們是否有基於VHDL代碼的方式來執行此操作?
讓我知道你的替代建議。
是的,這當然是可以的。請看Xilinx Synthesis Tool (XST) User guide,特別是第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;
另外,使用泛型不要打擾或閱讀文件;只需在包中聲明一個常量數組即可。把它放在一個軟件包而不是主要的體系結構中,甚至可以使用腳本自動編寫軟件包(比如讀取彙編輸出或文本文件)。
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;
真正的程序可以更長,但是這示出了圖案
感謝。我設法使它使用一個通用的字符串作爲文件名。 – boffin