2012-05-11 17 views
4

私は、プログラムメモリの内容がBRAMに保持されているプロセッサベースのデザインをシミュレートしています。私はVHDL(推論BRAMs)を使用してプログラムのメモリを実現しています。私は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; 

本当のプログラムが長くなることがありますが、これは、パターン