0

したがって、2つの異なるセレクター信号に基づいて読み取り/書き込みできるようにしたい4つのRAMモジュールの配列があります。現在、中間信号を使用してRAMをインスタンス化しています。

    genvar i;
    generate
    for (i = 0; i < regnum; i=i+1) begin: regs    
         rfram_generic rf (clk,rst,ce_a_int[i],addr_a_int[i],do_a_int[i],
                               ce_b_int[i],addr_b_int[i],do_b_int[i],
                               ce_w_int[i],we_w_int[i],addr_w_int[i],
                               di_w_int[i]);
    end
    endgenerate

headそして、またはtail信号(2ビットベクトル)のいずれかを使用して使用するRAMを選択したいと思います。これを行う方法はありますか?

4

3 に答える 3

2

私はここで新しく、まだ質問にコメントすることはできませんが、マーティに応えて:ほとんどのFPGA合成ツールは、可能な場合、トライステート値を持つ内部マルチソース信号をMUXのようなロジックに変換します。たとえば、私には正確に聞こえる古いトライステートからロジックへの動作の説明を参照してください

Adamへの推奨事項として、トライステートを使用するよりも、自分でマスキングを実行して、コードでこれを明示的にする方がよいでしょう。これにより、移植性が向上し、より予測可能な結果が得られ、誰かがコードを再検討する必要がある場合に自己文書化として機能します。

ただし、ソリューションに基づいて推測すると、書き込みポートのクロックイネーブルをマスクして、読み取りポートの出力を多重化するのがおそらく理にかなっています。例えば:

reg [WIDTH-1:0] do_a,do_b;
always @(*) do_a = do_a_int[head];
always @(*) do_b = do_b_int[tail];
generate
   genvar i;
   for (i = 0; i < regnum; i=i+1) begin: regs    
      rfram_generic rf (clk,rst,
                        ce_a,addr_a,do_a_int[i],
                        ce_b,addr_b,do_b_int[i],
                        ce_w,head==i?we_w:1'b0,addr_w,di_w);
   end
endgenerate

これにより、ソリューションよりも複雑でないロジック(つまり、より良い領域と遅延)が得られる可能性があります。

于 2009-12-11T19:23:23.823 に答える
0

私はそれを理解したと思います、生成ステートメントを使用する必要があります:

genvar i;
generate 
    for (i = 0; i < regnum; i=i+1) begin: sigassign
        //read from the checkpoint in progress
        assign ce_a_int[i] = (head == i) ? ce_a : 'bz;
        assign addr_a_int[i] = (head == i) ? addr_a : 'bz;
        assign do_a = (head == i) ? do_a_int[i] : 'bz;
        //write to the checkpoint in progress
        assign ce_w_int[i] = (head == i) ? ce_w : 'bz;
        assign we_w_int[i] = (head == i) ? we_w : 'bz;
        assign addr_w_int[i] = (head == i) ? addr_w : 'bz;
        assign di_w_int[i] = (head == i) ? di_w : 'bz;
        //read from the last stable checkpoint
        assign ce_b_int[i] = (tail == i) ? ce_b : 'bz;
        assign addr_b_int[i] = (tail == i) ? addr_b : 'bz;
        assign do_b = (tail == i) ? do_b_int[i] : 'bz;
    end
endgenerate
于 2009-10-30T19:33:09.307 に答える
0

あなたがあなたの問題の解決策を見つけたと聞いてうれしいです。私はあなたが何をしているのかを完全には理解していなかったことを認めなければなりませんが、1つのコメントとして、ifinside generateステートメントを使用して、さまざまなモジュールをインスタンス化したり、に応じてさまざまな信号を使用したりすることもできますgenvar

generate
    genvar i;
    for (i = 0; i < regnum; i=i+1) begin: regs
        if (i == head) begin
            rfram_generic_a rf(...);
        end else if (i == tail) begin
            rfram_generic_b rf(...);
        end else begin
            rfram_generic_c rf(...);
        end
    end
endgenerate
于 2009-11-02T09:52:48.653 に答える