4

プログラムメモリの内容がBRAMに保持されるプロセッサベースの設計をシミュレートしています。VHDL(推論BRAM)を使用してプログラムメモリを実現しています。デザインをポータブルに保ちたいので、CoreGenを避けようとしています。最終的に、このデザインはFPGAに移行します。

VHDLジェネリックを使用してBRAMのメモリコンテンツを初期化する方法があるかどうかを調べていますか?CoregenがCOEファイルを使用してBRAMを初期化することを理解していますが、これを行うためのVHDLコードベースの方法はありますか?

別の提案も教えてください。

4

2 に答える 2

10

はい、もちろん可能です。Xilinx Synthesis Tool (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 に答える