2

ISE 13.4 を使用する Virtex-5 のブロック RAM に格納したいベクターの配列があります。1 つの BRAM に収まるはずの 32Kb ですが、すべてロジックに格納されています。私のシステムは AMBA APB バスを使用しているので、select ラインと enable ラインをチェックします。このコードが BRAM を推論しない理由を理解してください。注: これはダミーの例であり、理解しやすく、他のコードで役立つはずです。

architecture Behavioral of top is
type memory_array is array (63 downto 0) of std_logic_vector(31 downto 0);
signal memory : memory_array;

attribute ram_style: string;
attribute ram_style of memory : signal is "block";

begin

process(Clk)
begin
    if(rising_edge(Clk)) then
        if(Sel and Wr_en and Enable) = '1' then
            memory(to_integer(Paddr(5 downto 0))) <= Data_in;
        elsif(Sel and not Wr_en and Enable) = '1' then
            Data_out <= memory(to_integer(Paddr(5 downto 0)));
        end if;
    end if;
end process;

end Behavioral;

ram_style配列を次のように宣言しますblockが、XST レポートには次のように記載されています。WARNING:Xst:3211 - Cannot use block RAM resources for signal <Mram_memory>. Please check that the RAM contents is read synchronously.

問題は read_enable 状態にあるようですが、Virtex 5 ユーザー ガイドでは BRAM ハード ブロックにenableとがあるように見えます。write_enable私は常に出力を駆動することができましたが、私はしたくありません。それは電力を浪費します。他のアイデアはありますか?

4

3 に答える 3

2

ロジックがデバイスの BRAM の動作と一致しない場合があります (デバイスによってさまざまな制限があります)。通常、data_out「書き込みしていないとき」だけでなく、RAMが有効になっているクロックサイクルごとに更新されます-これを試してください:

process(Clk)
begin
    if(rising_edge(Clk)) then
        if(Sel and Enable) = '1' then
            Data_out <= memory(to_integer(Paddr(5 downto 0)));
            if wr_en = '1' then
                memory(to_integer(Paddr(5 downto 0))) <= Data_in;
            end if;
        end if;
    end if;
end process;

Data_out 割り当てを「上」に移動して、「古い」値を取得することを明確にしました。これは BRAM のデフォルトの動作ですが、他のスタイルも設定できます。

selまたは、1 つのステートメント内のandenablewriteallによってツールが混乱している可能性があります。ifこれは、BRAM を推論するときに、ツールが主に「関数マッチング」ではなく「テンプレート マッチング」であるためです。「enable if」と「write if」を分離するだけで (上で行ったように)、残りの機能を同じに保ちながら、シンセサイザーに必要なことをさせるのに十分であることに気付くかもしれません。

ザイリンクスの XST を使用している場合は、ドキュメントで RAM の推論に関するすべてを読むことができます (私の XST ユーザー ガイドの 204 ページ以降 - この章は「RAM HDL コーディング手法」と呼ばれます)。

于 2012-06-21T08:59:07.253 に答える
1

私は多くの異なる組み合わせを試しました、そしてここに私が働かなければならなかった唯一のものがあります:

en_BRAM <= Sel and Enable;

process(Clk)
begin
    if(rising_edge(Clk)) then       
        if(en_BRAM = '1')then
                if(Wr_en = '1') then
                    icap_memory(to_integer(Paddr(5 downto 0))) <= Data_in;
                else
                    Data_out <= icap_memory(to_integer(Paddr(5 downto 0)));         
                end if;
        end if;
    end if;
end process;

したがって、イネーブルはRAM全体で行う必要があり、1つの信号のみにすることができると思います。その場合、書き込みイネーブルも1つのシグナルのみであり、読み取りはelseステートメントのみである必要があります(ではありませんif/elsif)。これにより、Windows764ビット上のISE13.3のXSTに従ってBRAMがインスタンス化されます。

于 2012-06-21T18:36:01.273 に答える
1

デバイスの BRAM ブロックに適切なマクロを使用しますか? ばかげていない合成ツールに頼るよりもはるかにうまく機能することがわかりました。

于 2012-06-21T02:33:56.760 に答える