2017-10-29 7 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

당신의 delay_clk 가정하면 코드 S를 시도 할 수 귀하의 mic_i N, 요 U의 동일한 샘플링 속도이다 20kHz의입니다 이하.

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으로 재설정됩니다.