1

背景

この LUT には、幅 32、深さ 256 が必要です。

そのため、IP コアによって作成された LUT があります。今度は、自分でインスタンス化して sim で動作させたいと思います (これは、すべてのパラメーターを自分で学習するのにも役立ちます)。FIFO に対してこれを何度も実行しましたが、これまで LUT を作成したことがないので、実行した内容が正しいかどうかを確認してください。値の LUT を作成し、それらを読み戻せるようにしたいだけです。これにはRAMのブロックを使用しました。

次の2つの異なるコンピューターで試しました:

QuestaSim-64 10.2c_5
ModelSim SE-64 10.1b

問題

だから私はコードをコンパイルすることができます。開こうとすると:

vsim work.top

IDE が開き、次の場所でフリーズします。

# Loading unisim.rb36_internal_vhdl(rb36_internal_vhdl_v)#1

私が削除した場合:

INIT_FILE => "lut.coe",

その後、正常にロードされます。だから私はその行がそれをクラッシュさせることを知っています。

LUT:

私は LUT を持っていますが、これは正しいように見えますか? .coe ファイルを使用して LUT をインスタンス化する他の方法はありますか?

lut : RAMB36E1 
generic map(
    INIT_FILE => "lut.coe",
    READ_WIDTH_A => 36
    )
port map
    (
    addrardaddr => addr_lut,
    addrbwraddr => X"0000",
    cascadeina => '0',
    cascadeinb => '0',
    clkardclk => clk_i,
    clkbwrclk => clk_i,
    diadi => X"00000000",
    dibdi => X"00000000",
    dipadip => X"0",
    dipbdip => X"0",
    doado => data_lut,
    enarden => '1',
    enbwren => '0',
    injectdbiterr => '0',
    injectsbiterr => '0' ,
    regceb => '0',
    regcearegce => '1',
    rstramarstram => rst_i,
    rstramb => rst_i,
    rstregarstreg => rst_i ,
    rstregb => rst_i,
    wea => X"0",
    webwe =>  X"00"   
    );

上記を 18kb RAM に交換しようとしましたが、同じエラーが発生しました:

# Loading unisim.rb18_internal_vhdl(rb18_internal_vhdl_v)#2

LUT:

lut : RAMB18E1 -- Simple Duel Port mode, 512 deep
generic map(
    INIT_FILE => "lut.coe",
    RAM_MODE => "SDP"
    )
port map
    (
    addrardaddr => addr_lut,
    addrbwraddr => "00000000000000",
    clkardclk => clk_i,
    clkbwrclk => clk_i,
    diadi => X"0000",
    dibdi => X"0000",
    dipadip => "00",
    dipbdip => "00",
    doado => data_lut_b,
    dobdo => data_lut_a,
    enarden => '1',
    enbwren => '0',
    regceb => '0',
    regcearegce => '1',
    rstramarstram => rst_i,
    rstramb => rst_i,
    rstregarstreg => rst_i ,
    rstregb => rst_i,
    wea => "00",
    webwe =>  X"0"   
    );
4

2 に答える 2

2

ザイリンクス ツールで *.mem または *.hex ファイルを VHDL で直接読み取る簡単な方法があります。ファイルの内容は、ブロック RAM の初期化としてシミュレーションおよび合成で使用できます。

ザイリンクスは、124 ページのUG901でコーディング例を提供しています。

type RamType is array(0 to 7) 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");

例は RAM の場合ですが、書き込みポートを削除して信号を定数に置き換えると、簡単に ROM (LUT) に変換できます。

より高度な実装は、たとえばPoC.mem.ocrom.spにあります。この実装は、csn が *.mif ファイルを読み取るアルテラの sltsyncrams でも機能します。

于 2015-07-30T22:13:06.187 に答える
2

真剣に。IP コアと COE ファイルを破棄します。((データがそこにしかない場合は、実際に捨てないでください!)

Subtype Data_Word is std_logic_vector(31 downto 0);
Type Lut_Type is Array(0 to 255) of Data_Word;
Constant Lut : Lut_Type := (
 0 => X"00000001",
 1 => X"00000002",
...
17 => X"DEADBEEF",
others => (others => 'X') );

もちろん、独自の係数に置き換えてください。おまけとして、スクリプトまたは C または VHDL プログラムを使用して COE ファイルを読み取り、上記の VHDL のチャンクを書き込みます。

ジョブ完了。

合成可能、シミュレーション可能で、他の FPGA に移植できます。

(IMO 移植性の問題は、ほとんどのベンダーの IP コアの本当の理由です。ただし、PCIe や DDR メモリ インターフェイスなどの複雑なコアについては例外とします。)

于 2015-07-30T19:02:21.620 に答える