2012-05-11 21 views
4

我正在模擬基於處理器的設計,其中程序存儲器內容保存在BRAM中。我正在使用VHDL實現程序內存(推斷BRAM)。我試圖避免CoreGen,因爲我想保持設計的便攜性。最終,這種設計將轉至FPGA。VHDL中的BRAM_INIT

我正在查看是否有一種方法來初始化使用VHDL泛型的BRAM的內存內容?據我所知,Coregen使用COE文件初始化BRAM,但是我們是否有基於VHDL代碼的方式來執行此操作?

讓我知道你的替代建議。

回答

9

是的,這當然是可以的。請看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; 
+0

感謝。我設法使它使用一個通用的字符串作爲文件名。 – boffin

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; 

真正的程序可以更長,但是這示出了圖案