前言
本文介紹了設(shè)計(jì)濾波器的FPGA實(shí)現(xiàn)步驟,并結(jié)合杜勇老師的書籍中的并行FIR濾波器部分進(jìn)行一步步實(shí)現(xiàn)硬件設(shè)計(jì),對(duì)書中的架構(gòu)做了復(fù)現(xiàn)以及解讀,并進(jìn)行了仿真驗(yàn)證。
并行FIR濾波器FPGA實(shí)現(xiàn)
FIR濾波器的結(jié)構(gòu)形式時(shí),介紹了直接型、級(jí)聯(lián)型、頻率取樣型和快速卷積型4種。在FPGA實(shí)現(xiàn)時(shí),最常用的是最簡(jiǎn)單的直接型結(jié)構(gòu)。FPGA實(shí)現(xiàn)直接型結(jié)構(gòu)的FIR濾波器,可以采用串行結(jié)構(gòu)、并行結(jié)構(gòu)等不同中的結(jié)構(gòu)設(shè)計(jì),上文根據(jù)書中提供的架構(gòu)完成了串行 FIR濾波器的實(shí)現(xiàn),本文沿用上文的基本代碼結(jié)構(gòu),按照并行FIR濾波器的架構(gòu)完成電路描述。
FIR濾波器需求
設(shè)計(jì)一個(gè)15階(長(zhǎng)度為16)的低通線性相位FIR濾波器,采用窗函數(shù)設(shè)計(jì),截止頻率為500 Hz,采樣頻率為2 000 Hz;采用FPGA實(shí)現(xiàn)并行結(jié)構(gòu)的濾波器,系數(shù)的量化位數(shù)為12比特,輸入數(shù)據(jù)位寬為12比特,輸出數(shù)據(jù)位寬為29比特,系統(tǒng)時(shí)鐘為16 kHz。
濾波器系數(shù)確定與量化
確定濾波器的結(jié)構(gòu)后,就根據(jù)濾波器進(jìn)行設(shè)計(jì)代碼仿真,這里引用書中的仿真設(shè)計(jì),并將濾波器參數(shù)系數(shù)量化。確定濾波器系數(shù)的方法有很多,可以使用MATLAB中豐富的函數(shù)實(shí)現(xiàn),或者使用相關(guān)濾波器設(shè)計(jì)的軟件工具,定制滿足當(dāng)前需求的窗函數(shù)的濾波器系數(shù)。具體量化系數(shù)確定可參考上文《數(shù)字信號(hào)處理-09-串行FIR濾波器MATLAB與FPGA實(shí)現(xiàn)》中的相關(guān)內(nèi)容,或者參考杜勇老師的書中的內(nèi)容。
硬件架構(gòu)
下圖為杜勇老師的《數(shù)字濾波器的MATLAB與FPGA實(shí)現(xiàn)》實(shí)現(xiàn)的并行FIR濾波器的結(jié)構(gòu)圖。因?yàn)镕IR濾波器參數(shù)對(duì)稱,所以同時(shí)計(jì)算相應(yīng)的對(duì)稱結(jié)構(gòu)的值,將對(duì)稱系數(shù)的X(n)相加后,可調(diào)用8個(gè)乘法器,完成對(duì)濾波器的乘法運(yùn)算,所以針對(duì)并行濾波器的架構(gòu)數(shù)據(jù)的輸入速率和時(shí)鐘可以相同,每一個(gè)時(shí)鐘周期流水輸出一個(gè)濾波后的信號(hào)值。圖中的8輸入的加法器,可以替換成N/2;這樣就得到了一個(gè)通用化的并行FIR濾波器結(jié)構(gòu)圖。
并行FIR濾波器
并行實(shí)現(xiàn)FIR濾波器,雖然浪費(fèi)了加法器和乘法器的資源,但是提升了整個(gè)濾波器實(shí)現(xiàn)的性能,當(dāng)濾波器的系數(shù)長(zhǎng)度N增大時(shí),數(shù)據(jù)的吞吐速率不變(暫且不考慮面積增大對(duì)性能的影響),但帶來(lái)的壞處就是會(huì)用掉相應(yīng)倍數(shù)的邏輯資源和運(yùn)算資源,速度和面積本來(lái)就是魚和熊掌的關(guān)系,在實(shí)際應(yīng)用中應(yīng)當(dāng)做相應(yīng)的權(quán)衡和割舍。
根據(jù)架構(gòu)描述電路
根據(jù)杜勇老師書中提供的架構(gòu),對(duì)電路進(jìn)行描述,同樣沿用了前文的通用化的模板,后期可根據(jù)參數(shù)輸入來(lái)適配不同濾波器長(zhǎng)度的設(shè)計(jì)。
實(shí)現(xiàn)模塊框圖
接口描述如下:
接口描述
參數(shù)描述如下:
參數(shù)描述
代碼如下:
`timescale 1ns / 1ps
module Fir_Parallel(
input clk,//!系統(tǒng)時(shí)鐘
input rst,//!復(fù)位信號(hào)
input signed [SIGN_IN_WIDTH-1:0] signal_in,//!信號(hào)輸入
output signed [SIGN_OUT_WIDTH-1:0] signal_out//!信號(hào)輸出,信號(hào)輸出速度和輸入速度相同
);
//
parameter integer SIGN_IN_WIDTH = 12 ;//!信號(hào)輸入位寬
parameter integer SIGN_OUT_WIDTH = 29 ;//!信號(hào)輸出位寬
parameter integer FIR_COE_WIDTH = 12 ;//!濾波器系數(shù)位寬
parameter integer FIR_COE_NUM = 16 ;//!濾波器長(zhǎng)度
localparam integer FIR_WIDTH_DIV_2 = FIR_COE_NUM/2 ;
function [FIR_COE_WIDTH-1:0] coe_data;
input [FIR_WIDTH_DIV_2-1:0] index;
begin
case(index)
'd0:coe_data='h000;
'd1:coe_data='hffd;
'd2:coe_data='h00f;
'd3:coe_data='h02e;
'd4:coe_data='hf8b;
'd5:coe_data='hef9;
'd6:coe_data='h24e;
'd7:coe_data='h7ff;
endcase
end
endfunction
integer i;
genvar j;
//!濾波器系數(shù)加載
wire signed [FIR_COE_WIDTH-1:0] coe[FIR_WIDTH_DIV_2-1:0];
generate
for (j=0; j
運(yùn)行仿真后,根據(jù)設(shè)計(jì)的濾波器系數(shù)進(jìn)行仿真,發(fā)現(xiàn)可以正常濾波除去高頻分量。
濾波仿真效果
仿真激勵(lì)文件編寫
`timescale 1ns / 1ps
module Fir_Parallel_tb;
// Parameters
localparam integer SIGN_IN_WIDTH = 12;
localparam integer SIGN_OUT_WIDTH = 29;
localparam integer FIR_COE_WIDTH = 12;
localparam integer FIR_COE_NUM = 16;
// Ports
reg clk = 1;
reg rst = 1;
reg [SIGN_IN_WIDTH-1:0] signal_in;
wire [SIGN_OUT_WIDTH-1:0] signal_out;
Fir_Parallel #(
.SIGN_IN_WIDTH(SIGN_IN_WIDTH ),
.SIGN_OUT_WIDTH(SIGN_OUT_WIDTH ),
.FIR_COE_WIDTH(FIR_COE_WIDTH ),
.FIR_COE_NUM (FIR_COE_NUM )
)Fir_Parallel_dut (
.clk (clk ),
.rst (rst ),
.signal_in (signal_in ),
.signal_out ( signal_out)
);
reg [11:0] mem [0:99];
reg [9:0] addr ;
// reg [11:0]data_out ;
always #(10*1)
begin
if(rst==0)
addr = addr + 10'd1;
signal_in = mem[addr][11:0];
end
always
#5 clk = ! clk ;
initial
begin
signal_in =0;
$readmemh("sin_data.txt",mem);
addr = 10'd0;
#10;
rst = 0;
end
endmodule
運(yùn)行仿真,查看波形可見(jiàn),濾波效果和仿真結(jié)果一致。
仿真波形
延遲分析
該架構(gòu)的數(shù)據(jù)輸入后,每四個(gè)時(shí)鐘周期后輸出一個(gè)數(shù)據(jù),其中,一個(gè)時(shí)鐘周期用于X(n)的加和,一個(gè)時(shí)鐘周期用于計(jì)算信號(hào)和濾波器系數(shù)相乘的結(jié)果,一個(gè)時(shí)鐘周期用于乘法輸出后的數(shù)據(jù)做累加處理,一個(gè)時(shí)鐘用于讀取累加后的結(jié)果。
延時(shí)分析