높은 처리량의 저역 통과 필터 만들기
이전
기계 학습도 높은 처리량이되었습니다. 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 계열보다 높은 것은 고정 소수점수를 사용해 표현력을 떨어뜨린 것에 기인한다고 생각합니다.
Reference
이 문제에 관하여(높은 처리량의 저역 통과 필터 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/wcrvt/items/5245f601194da6dd9c23텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)