2017-08-24 1 views
1

私はVerilogの初心者です。プロジェクトの作業を開始したばかりです。開始したコードが実行可能であることを確認しようとしています。以下のコードスニペットは、FIFOを8ビットレジスタのベクトルにアンロードしています。各クロックサイクルで、FIFOからバイトをアンロードし、それをレジスタチェーンの最後に配置し、他のすべてのバイトをチェーンの下にシフトします。発生したシフトを含むFIFOからのレジスタベクトルの埋め込み

reg [ 7:0]   mac_rx_regs [0 : 1361]; 
generate for (ii=0; ii<1361; ii=ii+1) 
    begin: mac_rx_regs_inst    
    always @(posedge rx_clk_int, posedge tx_reset) 
    if (tx_reset) begin 
     mac_rx_regs[ii] <= 8'b0; 
     mac_rx_regs[1361] <= 8'b0; 
    end else begin 
     if (rx_data_valid_r) begin 
     mac_rx_regs[ii] <= mac_rx_regs[ii+1]; 
     mac_rx_regs[1361] <= rx_data_r; 
     end 
    end 
    end 
    endgenerate 

これを行うには、これが良い方法かどうかをご確認ください。 FIFOを読み込むバイト数でレジスタ・ベクタをアドレスするだけで済みます。私は、これは常に生成されたブロックが実行される順序が指定されていないという点で決定的なものではなく、あるレジスタから別のレジスタへデータを移動するために多くの不要なロジックが作成されるようです。

答えて

1

まず、通常は常にステートメントの数を心配する必要はありません。それらがすべて同じクロックを使用してリセットされている場合、プロセス間の相互作用に関連して予想される動作が得られます。 私が行うことの1つは、他のどのスタイルよりもスタイルに関するものです。#FDを下に示すようにフロップの割り当てに追加して、シミュレーションを少し良くしています。

また、これは単一のプロセスとしてコード化できるほど簡単です。

parameter FD = 1; 
reg [1361*8-1:0] mac_rx_regs; // Arrays are good if you are trying to 
           // infer memory, but if you are okay 
           // with registers, just declare a vector. 
always @ (posedge clk or posedge reset) 
begin 
    if (reset) 
     mac_rx_regs <= #FD 1361*8'h0; 
    else 
     // This next statement shifts in a new 8 bits when rx_data_valid_r is asserted. 
     // It will assign max_rx_regs to max_rx_regs (nop) when deasserted. 
     mac_rx_regs <= #FD rx_data_valid_r ? {mac_rx_regs[1361*8-9:0],rx_data_r} : 
              mac_rx_regs; 
end 
+0

答えをありがとう。私があなたを正しく理解していれば、私の元のコードはうまくいくはずですが、あなたのバージョンははるかに良くなります。はるかにクリーンで機能はより明白です。 – JMF

関連する問題