利用FPGA進行數字信號處理時,信號中的直流分量通常需要去除,而直流分量在AD前段就存在,如果采用模擬電路去除直流分量比較復雜,因此通常在AD后端數字域去除直流分量。在FPGA中,常規去直流的方法是先對信號進行累加,然后對累加值進行移位即可得到直流分量,如累加8192個數據,則直流分量可由累加值右移13位得到。
本文介紹一種根據Xilinx FPGA中DSP48E1資源設計的去直流模塊,其基本原理采用一階濾波器,如圖1所示,通過一個一階RC電路,在V0端可等效一個低通濾波器,得到直流分量。
圖1
由上式可推導出,定義系數,由此可得到下式:
由上式可得到如圖2所示結構:
圖2
仔細觀察發現圖2中結構與Xilinx FPGA的DSP48E1結構十分相似,如圖3所示,兩個結構做了類比,其中Vi - Vo的減法可由DSP48E1中的Pre-Adder實現,k*(vi - vo)的乘法可由DSP48E1中的Multipler實現,而Vo + k*(vi - vo)加法可由DSP48E1中的Accumulator實現。因此實現這個去直流模塊只需1個DSP48E1資源,并且在Xilinx 7系列FPGA中,DSP48E1最大支持25-bit的Pre-adder、25*18-bit的Multipler和48-bit的Accumulator,基本可滿足常規處理。
圖3
具體實現:
在ISE的HDL language template中可以找到DSP48的宏定義,這邊需要用到ADDMACC_MACRO,只需要將這個宏模板拷貝到程序中直接例化即可調用DSP48,去直流模塊的DSP48E1實現代碼如下所示:
module DCOff_DSP(
input clk,
input rst,
input [15:0] din,
output [15:0] dc
);
wire signed [31:0] PRODUCT;
wire signed [15:0] K;
wire signed [31:0] ACOUT;
assign K=16'h0085;
ADDMACC_MACRO #(
.DEVICE("7SERIES"), // Target Device: "VIRTEX6", "SPARTAN6", "7SERIES"
.LATENCY(4), // Desired clock cycle latency, 0-4
.WIDTH_PREADD(16), // Pre-adder input width, 1-25
.WIDTH_MULTIPLIER(16), // Multiplier input width, 1-18
.WIDTH_PRODUCT(32) // MACC output width, 1-48
) ADDMACC_MACRO_inst (
.PRODUCT(PRODUCT), // MACC result output, width defined by WIDTH_PRODUCT parameter
.CARRYIN(1'b0), // 1-bit carry-in input
.CLK(clk), // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.LOAD(1'b1), // 1-bit accumulator load input
.LOAD_DATA(PRODUCT), // Accumulator load data input, width defined by WIDTH_PRODUCT parameter
.MULTIPLIER(K), // Multiplier data input, width defined by WIDTH_MULTIPLIER parameter
.PREADD2(-PRODUCT[31:16]), // Preadder data input, width defined by WIDTH_PREADD parameter
.PREADD1(din), // Preadder data input, width defined by WIDTH_PREADD parameter
.RST(rst) // 1-bit active high synchronous reset
);
assign dc=PRODUCT[31:16];
endmodule
評論