0

私はある種のキャッシュを作成しており、std_logic_vectors で構成されるエンティティ内でいくつかのテーブル (大きなもの) を使用しており、Quartus 2 Web 版でそれを行っています。

シミュレーションではすべて正常に動作しますが、合成しようとすると、ラッチ、AND および OR コンポーネントでのみ実行されます。

これらの組み合わせ要素の代わりに、これらのテーブルにメモリ モジュールを使用するように Quartus を指定する方法はありますか? または、VHDL コード自体から何かを実行できるかもしれません。

library ieee;
use ieee.std_logic_1164.all;

package UTIL_PACK is
    type matrix16x8 is array (0 to 15) of std_logic_vector(0 to 7);
    type matrix2p4x8 is array (0 to 2**4) of matrix16x8;
end package;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.util_pack.all;

entity  RAM16B is

    port(
        signal RD: in std_logic;
        signal WR: in std_logic;
        signal CLK: in std_logic;
        signal A: in std_logic_vector(7 downto 0);
        signal D: inout matrix16x8;
        signal FC: out std_logic 
    );

end entity ;

architecture RAM16B_IMPL of RAM16B is
    signal memory: matrix2p4x8 := ((others => (others => (others => 'Z')))); 
begin 

run:process(clk)is
    variable slot:integer range 0 to 15 :=0;
    begin
        if(clk='1') then
            slot := TO_INTEGER(unsigned(A)) rem 16;
            if(rd = '1')then
                FC<='0';
                for i in 0 to 3 loop
                    D(i) <= memory(i)(slot);
                end loop;
                FC<='1';
            elsif(wr = '1')then
                FC<='0';
                for i in 0 to 3 loop
                    memory(i)(slot) <= D(i);
                end loop;
                FC<='1';
            else 
                FC <= 'Z';
                D <= ( others => ( others => 'Z' ));
            end if;
        else
            FC <= 'Z';
            D <= ( others => ( others => 'Z' ));
        end if;
    end process;

end architecture RAM16B_IMPL;

RAM は 16 ブロックのメモリで構成され、各ブロックは 16 バイトです。より多くのデータを並行して読み込もうとしているので、1 サイクルあたり 16 バイトのデータを読み書きしています。スロットは、読み取り/書き込みが行われているブロックを定義します。

4

2 に答える 2

1

はい、VHDL コードから実行できます。Quartus がメモリをモデリングしていることを確実に理解するには、アルテラの推奨 HDL コーディング スタイルガイドで説明されているようにコーディングする必要があります。Inferring Memory Functions from HDL Code ( http://www.altera.com/literature/hb/qts/qts_qii51007.pdf )というセクションを参照し、それに応じてコードを変更してください。

アルテラが提案した正確なメモリ モデルから開始し、Quartus が FPGA の専用メモリ ビットを使用してデザインを合成することを確認することは、おそらく良い考えです。次に、モデルを徐々に変更して目的の動作を実装し、常に合成してコンパイル レポートを調べて、変更が Quartus がメモリ ブロックとして推測するものから逸脱していないことを確認します。

于 2013-10-20T13:21:30.390 に答える
1

ハード メモリ ブロックを確実に使用したい場合は、メガファンクション ウィザードを使用してカスタム ram コンポーネントを作成するか、ライブラリから altsyncram コンポーネントを直接インスタンス化し、ジェネリックを使用して必要に応じて構成する必要があります (オプションに精通していない場合、これは難しい場合があります)。これにより移植の問題が発生しますが、RAM を推測するときはいつでも、とにかく移植の問題が発生します。カスタム ライブラリ コンポーネントを使用すると、何か他のものに移行する必要が生じた場合に、問題が発生する可能性のある場所を非常に明確かつ簡単に特定できます。

特定の実装に関しては、ラッチをエッジ駆動デバイスであるハード RAM ブロックに自動的に移行する方法はありません。これを修正するには、プロセスでclk='1'の代わりにrising_edge(clk)を使用してください。

また、チップ内部のトライステート動作はサポートされていないため、独立したデータ入力ポートとデータ出力ポートが必要です。および & またはゲートがトライステート バスをエミュレートするために使用されているため (および上記のラッチの問題により)、多くの個別のロジックが得られます。

于 2013-10-20T14:57:09.163 に答える