2017-10-29 8 views
0
module my_delay_mod(
    input [11:0]audio, 
    input delay_clk, 
    output [11:0]delay_out 
    ); 

    integer i; 
    reg [11:0]memory[0:4999]; 

    always @ (posedge delay_clk) begin 

     memory[0]<=audio; 
     for (i=0; i<4999; i=i+1) begin 
      memory[i+1]<=memory[i]; 
     end 

    end 

    assign delay_out = memory[4999]; 

endmodule 

答えて

0

間違っている部分はよく分かりません以下。

integer ee; 
reg [11:0] memory[0:2020]; 

always @ (posedge delay_clk) begin 

    memory[0]<=audio; 
    for (ee = 0; ee < 2020; ee = ee+1) begin 
     memory[ee+1]<=memory[ee]; 
    end 

    delay_out <= memory[2020]; 
end 

これはいくつかのサンプルコードですが、値が正しくない可能性があります。これは正しい方向を指しているはずです。

1

あなたのコードは合成が難しいでしょう。合成可能なコードが必要な場合は、RAMベースのシフトレジスタを使用することをお勧めします。ベンダーで入手可能なIPを使用することができます(私はザイリンクスがCoregenに持っていることを知っています)か、独自の(複雑ではない)ものを作ることができます。

RAMベースのシフトレジスタでは、クロックサイクルごとにすべてのデータを実際にシフトするわけではありません。しかし、あなたは異なる読み書きポインターを持っています。これらのポインタの値は、(クロックサイクルの数に関して)遅延値によって分離される。

手順は、

  1. は+ 2深遅延でRAMを作成することになります。
  2. すべてのクロックサイクルでRAMに書き込みを続け、アドレスをインクリメントします。
  3. 書き込みアドレスがの遅延の場合は、アドレス0以降のデータの読み出しを続けます。これからは、読み書きはすべてのクロックサイクルで行われます。
  4. RAMの終わりに達するたびに、書き込みアドレスまたは読み出しアドレスが0にリセットされます。
関連する問題