2019年10月7日19:13:37 待提升:分布式计算研究(参考:http://www.elecfans.com/d/782268.html) 以及各种改进实现思路的论文: 基本型FIR实现: 需要具备的应用: 1)乘法器; 2)加法器; 3)延
2019年10月7日19:13:37
待提升:分布式计算研究(参考:http://www.elecfans.com/d/782268.html)
以及各种改进实现思路的论文:

基本型FIR实现:

需要具备的应用:
1)乘法器;
2)加法器;
3)延时器;
以6阶FIR举例——
对应code
`timescale 1ns / 1ps
module fir_6tap(
input Clk,
input signed [15:0] Xin,
output reg signed [23:0] Yout
);
//Internal variables.
wire signed [7:0] H0,H1,H2,H3,H4,H5;
wire signed [23:0] MCM0,MCM1,MCM2,MCM3,MCM4,MCM5,add_out1,add_out2,add_out3,add_out4,add_out5;
wire signed [23:0] Q1,Q2,Q3,Q4,Q5;
//filter coefficient initializations.
//H = [-2 -1 3 4] 8bits
assign H0 = -15;
assign H1 = 19 ;
assign H2 = 123;
assign H3 = 123;
assign H4 = 19;
assign H5 = -15;
//Multiple constant multiplications.
assign MCM5 = H5*Xin;
assign MCM4 = H4*Xin;
assign MCM3 = H3*Xin;
assign MCM2 = H2*Xin;
assign MCM1 = H1*Xin;
assign MCM0 = H0*Xin;
//adders
assign add_out1 = Q1 + MCM4;
assign add_out2 = Q2 + MCM3;
assign add_out3 = Q3 + MCM2;
assign add_out4 = Q4 + MCM1;
assign add_out5 = Q5 + MCM0;
//flipflop instantiations (for introducing a delay).
DFF dff1 (.Clk(Clk),.D(MCM5),.Q(Q1));
DFF dff2 (.Clk(Clk),.D(add_out1),.Q(Q2));
DFF dff3 (.Clk(Clk),.D(add_out2),.Q(Q3));
DFF dff4 (.Clk(Clk),.D(add_out3),.Q(Q4));
DFF dff5 (.Clk(Clk),.D(add_out4),.Q(Q5));
//Assign the last adder output to final output.
[email protected] (posedge Clk)
Yout <= add_out5;
endmodule
对于任意阶:
module fir6Tap(clk, rst, xin, yout);
/******************** PARAMETER ********************/
parameter DATINWIDTH = 16;
parameter COEFWIDTH = 8;
parameter DATOUTWIDTH = COEFWIDTH + DATINWIDTH ;
parameter FIRTAPS = 6;
/******************** INPUT OUTPUT ********************/
input clk;
input rst;
input signed [DATINWIDTH - 1:0] xin;
output reg signed [DATOUTWIDTH - 1:0] yout;
/******************** FIR ********************/
wire signed [COEFWIDTH - 1:0] firCoef [FIRTAPS - 1:0] = {
-8‘d15,
8‘d19,
8‘d123,
8‘d123,
8‘d19,
-8‘d15
};
wire signed [DATOUTWIDTH - 1:0] dataMult [FIRTAPS - 1:0];
reg signed [DATOUTWIDTH - 1:0] dataDelay [FIRTAPS - 2:0];
wire signed [DATOUTWIDTH - 1:0] dataOut [FIRTAPS - 2:0];
genvar ii;
generate
for(ii = 0; ii < FIRTAPS - 1; ii = ii + 1) begin
assign dataMult[ii] = firCoef[ii] * xin;
assign dataOut[ii] = dataDelay[ii] + dataMult[FIRTAPS - 2 - ii];
end
endgenerate
assign dataMult[FIRTAPS - 1] = firCoef[FIRTAPS - 1] * xin;
genvar jj;
generate
for (jj = 1; jj < FIRTAPS - 1; jj = jj + 1)
always @(posedge clk) begin
dataDelay[jj] <= dataOut[jj - 1];
end
endgenerate
always @(posedge clk) begin
dataDelay[0] <= dataMult[FIRTAPS - 1];
end
always @(posedge clk) begin
yout <= dataOut[FIRTAPS - 2];
end
endmodule
