Low pass FIR FILTER



我被分配制作低通fir滤波器。这是分配给我的问题:

编写一个模块,将作为低通FIR滤波器。输入和输出信号应为16位并带符号。添加一个示例时钟输入和另一个更快的时钟以保持运行。通过在输入端产生一个方形信号并观察输出信号,在模拟中测试操作。在演示文稿中展示您的实现和模拟结果。

这是我现在的代码:

module Fir_filter(
input clk, //ura
input rst, //reset if high
input signed [15:0] vhodni_signal, //16 bitni predznačen vhodni signal
output signed [15:0] izhodni_signal, // izhod signal, kateri bo tudi rezultat
);
reg signed [35:0] vmesni_rezultati; // pomnožen vhod + signal
wire  signed [19:0] A[0:8]; // register namenjen koeficientom
reg signed [8:0] rezultat;
reg signed [15:0] vhodni_signal_shiftan;

assign A0 = -62;
assign A1 = 396;
assign A2 = 5020;
assign A3 = 14346;
assign A4 = 19660;
assign A5 = 14346;
assign A6 = 5020;
assign A7 = 396;
assign A8 = -62;
always @(posedge clk)
begin
vmesni_rezultati = A0 * vhodni_signal[0] + A1 * vhodni_signal[1] + A2 * vhodni_signal[2] + A3 * vhodni_signal[3] + A4 * vhodni_signal[4] + A5 * vhodni_signal[5] + A6 * vhodni_signal[6] + A7 * vhodni_signal[7] + A8 * vhodni_signal[8];
rezultat[0] = vmesni_rezultati[31:16];


end

endmodule

请记住,分配A0-A8显然是为fir系数。我确实用fir滤波器计算器得到了这些数字。数字乘以65536和四舍五入

我的问题是什么?我已经将输入信号与系数相乘,并将其存储在rezultat中。现在我要再做8次来乘以整个输入信号。(在我的逻辑中,我目前只做了1个样本)我不知道如何采取输入信号的下一个样本并将其与系数相乘。如果有人能帮我一个大忙,我会问你是否能写模拟代码。

我使用的是vivado 2021.1-Verliog语言。

我已经在之前的问题中报告过了。

张贴的代码试图将一个样本*系数的单个位相乘。
这不是FIR的工作方式。
FIR将整个样本乘以一个系数,然后将另一个整个样本乘以一个不同的系数,然后将乘积求和。

该设计需要一个9个采样移位寄存器来实现9个FIR延迟/分接。
每个抽头乘以一个系数,所有的乘积相加,形成输出。

module Fir_filter(
input  clk,
input  rst, 
input      signed [15:0] input_sample,
output reg signed [35:0] filter_output
);
reg signed [15:0] filter_taps[8:0];
reg signed [15:0] A0,A1,A2,A3,A4,A5,A6,A7,A8;

assign A0 = -62;
assign A1 = 396;
assign A2 = 5020;
assign A3 = 14346;
assign A4 = 19660;
assign A5 = 14346;
assign A6 = 5020;
assign A7 = 396;
assign A8 = -62;
integer i;
always @(posedge clk)
if(rst) 
for(i = 0;i < 9;i=i+1) 
filter_taps[i] <= 0;
end
else begin :sync_proc_block
// input drives first tap
filter_taps[0] <= input_sample;
// shift reg
for(i = 1; i < 9; i=i+1) 
filter_taps[i] <= filter_taps[i - 1];

end :sync_proc_block
always @ (*) 
filter_output =
A0 * filter_taps[0] +
A1 * filter_taps[1] +
A2 * filter_taps[2] +
A3 * filter_taps[3] +
A4 * filter_taps[4] +
A5 * filter_taps[5] +
A6 * filter_taps[6] +
A7 * filter_taps[7] +
A8 * filter_taps[8];
endmodule

请参阅如何编写基本测试平台的答案。
谁能帮我创建一个Verilog测试平台?

最新更新