높은 처리량의 저역 통과 필터 만들기

11845 단어 FPGAVerilog

이전



기계 학습도 높은 처리량이되었습니다. FPGA는 신경망계에서 각 레이어에 파이프라인을 짜 수 있기 때문에 높은 스루풋을 실현하고 있습니다. 이러한 시스템을 위해 높은 처리량의 저역 통과 필터를 설계했습니다.

필터부



1000Hz 이후의 신호 전력을 저감하는 필터를 고정 소수점 Q30으로 만들었습니다. 왜 쓸데없이 큰 사이즈로 만들었는가 하면, 필터 파라미터에 대한 수치 표현력을 올리는데 적당히 크게 해 두었습니다. 입력은 바이너리, 클럭 100MHz로 대기 시간 20ns, 출력 속도는 100MHz입니다.

ht_lpf.vhd

module ht_lpf(input wire clk, input wire in, output wire [31:0] out);

//Unsigned Q30 format

//Filter parameters
    //cutoff:gpd=1000*2pi (1000 Hz),sampling time:Ts=10e-9 (100 MHz)
localparam [31:0] n1=32'h000083c4; //(Ts*gpd)/(2.0+Ts*gpd);
localparam [31:0] n2=32'h3FFEF899; //(2.0-Ts*gpd)/(Ts*gpd+2.0);

reg inz1=1'b0;
reg [33:0] mv=1'b0;
reg [63:0] ar=1'b0;
reg [31:0] res=1'b0;

always@(posedge clk)
begin
    inz1<=in;
    //res=n1*(in+inz1)+n2*resz1;
    mv <= n1*{in&inz1,in^inz1}; //in+inz1
    ar <= n2*res;
    res <=mv[31:0]+ar[61:30];
end

assign out=res;

endmodule


동작 확인



필터 입력에 백색 잡음을 넣습니다. 백색 잡음으로서 25차의 M계열 신호(의사 백색)를 생성했습니다.

mseq.vhd

module mseq(input wire clk,output wire out);

// Irreducible polynomial: x^25+x^3+1
reg [24:0] seq=25'b0110100101101101100101101;
always@(posedge clk) seq<={seq[24]^seq[2],seq[24:1]};
assign out=seq[24];

endmodule


테스트 벤치는 다음과 같이 작성.

tb.vhd

module tb();

parameter cycle=10;
reg clk=1'b0;

always#(cycle/2) clk<=~clk;

wire z;
mseq mseq_u0(.clk(clk),.out(z));

wire [31:0] out;
ht_lpf ht_lpf_u0(.clk(clk),.in(z),.out(out));

integer fd;

initial
begin
    fd=$fopen("output.dat","w");
    repeat(1000000)
    begin
        $fdisplay(fd,"%b %d",z,out);
        #cycle;
    end
    $fclose(fd);
    $finish;
end

endmodule


이 생성 잡음에 대한 저역 통과 필터의 출력은 다음과 같습니다. M 계열이 바이너리이므로 평균값은 0.5로 수렴.



M 계열 신호와 필터 출력의 파워는 다음과 같습니다. 필터 출력은 1000Hz에서 파워가 감쇠했습니다. 저역의 파워가 M 계열보다 높은 것은 고정 소수점수를 사용해 표현력을 떨어뜨린 것에 기인한다고 생각합니다.

좋은 웹페이지 즐겨찾기