串行 FIR 濾波器設計
◆設計說明
設計參數不變,與并行 FIR 濾波器參數一致。即,輸入頻率為 7.5 MHz 和 250 KHz 的正弦波混合信號,經過 FIR 濾波器后,高頻信號 7.5MHz 被濾除,只保留 250KMHz 的信號。
輸入頻率: 7.5MHz 和 250KHz
采樣頻率: 50MHz
阻帶: 1MHz-6MHz
階數: 15 (N=15)
串行設計,就是在 16 個時鐘周期內對 16 個延時數據分時依次進行乘法、加法運算,然后在時鐘驅動下輸出濾波值。考慮到 FIR 濾波器系數的對稱性,計算一個濾波輸出值的周期可以減少到 8 個。串行設計時每個周期只進行一次乘法運算,所以設計中只需一個乘法器即可。此時數據需要每 8 個時鐘周期有效輸入一次,但是為了保證輸出信號頻率的正確性,工作時鐘需要為采樣頻率的 8 倍,即 400MHz。這種方法的優點是資源耗費少,但是工作頻率要求高,數據不能持續輸出。
◆串行設計
設計中使用到的乘法器模塊代碼,可參考之前流水線式設計的乘法器。
為方便快速仿真,也可以直接使用乘號 “*” 完成乘法運算,設計中加入宏定義 SAFE_DESIGN 來選擇使用哪種乘法器。
FIR 濾波器系數可由 matlab 生成,具體見附錄。
/**********************************************************
>> Description : fir study with serial tech
>> V190403 : Fs:50Mhz, fstop:1-6Mhz, order:16, sys clk:400MHz
***********************************************************/
`define SAFE_DESIGN
module fir_serial_low(
input rstn,
input clk, // 系統工作時鐘,400MHz
input en , // 輸入數據有效信號
input [11:0] xin, // 輸入混合頻率的信號數據
output valid, // 輸出數據有效信號
output [28:0] yout // 輸出數據
);
//delay of input data enable
reg [11:0] en_r ;
always @(posedge clk or negedge rstn) begin
if (!rstn) begin
en_r[11:0] <= 'b0 ;
end
else begin
en_r[11:0] <= {en_r[10:0], en} ;
end
end
//fir coeficient
wire [11:0] coe[7:0] ;
assign coe[0] = 12'd11 ;
assign coe[1] = 12'd31 ;
assign coe[2] = 12'd63 ;
assign coe[3] = 12'd104 ;
assign coe[4] = 12'd152 ;
assign coe[5] = 12'd198 ;
assign coe[6] = 12'd235 ;
assign coe[7] = 12'd255 ;
//(1) 輸入數據移位部分
reg [2:0] cnt ;
integer i, j ;
always @(posedge clk or negedge rstn) begin
if (!rstn) begin
cnt <= 3'b0 ;
end
else if (en || cnt != 0) begin
cnt <= cnt + 1'b1 ; //8個周期計數
end
end
reg [11:0] xin_reg[15:0];
always @(posedge clk or negedge rstn) begin
if (!rstn) begin
for (i=0; i16; i=i+1) begin
xin_reg[i] <= 12'b0;
end
end
else if (cnt == 3'd0 && en) begin //每8個周期讀入一次有效數據
xin_reg[0] <= xin ;
for (j=0; j15; j=j+1) begin
xin_reg[j+1] <= xin_reg[j] ; // 數據移位
end
end
end
//(2) 系數對稱,16個移位寄存器數據進行首位相加
reg [11:0] add_a, add_b ;
reg [11:0] coe_s ;
wire [12:0] add_s ;
wire [2:0] xin_index = cnt>=1