原创 【博客大赛】【原创】信号去直流方法

2012-8-22 09:24 6921 21 4 分类: FPGA/CPLD 文集: xilinx FPGA

         利用FPGA进行数字信号处理时,信号中的直流分量通常需要去除,而直流分量在AD前段就存在,如果采用模拟电路去除直流分量比较复杂,因此通常在AD后端数字域去除直流分量。在FPGA中,常规去直流的方法是先对信号进行累加,然后对累加值进行移位即可得到直流分量,如累加8192个数据,则直流分量可由累加值右移13位得到。

        本文介绍一种根据Xilinx FPGA中DSP48E1资源设计的去直流模块,其基本原理采用一阶滤波器,如图1所示,通过一个一阶RC电路,在V0端可等效一个低通滤波器,得到直流分量。

snap1.jpg

图1

 

e1.gif

         由上式可推导出e2.gif,定义系数e3.gif,由此可得到下式:

e4.gif

         由上式可得到如图2所示结构:

snap2.jpg

图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,基本可满足常规处理。

snap3.jpg

图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

 

         以下是得到的综合报告,主要就使用了1个DSP48E1资源,并且最高时钟频率高达552MHz,可满足通信系统中频数据处理。

Selected Device : 7k325tfbg676-3

Slice Logic Utilization:

   Number of Slice LUTs :                16  out of  203800     0% 

   Number used as Logic:                16  out of  203800     0% 

   Number of DSP48E1s:                  1  out of    840     0% 

Timing Summary:

   Minimum period: 1.811ns (Maximum Frequency: 552.273MHz)

   Minimum input arrival time before clock: 0.694ns

   Maximum output required time after clock: 0.568ns

snap4.jpg

图4

         如图4所示为去直流模块的仿真波形,输入为有直流偏置的正弦波,从图中可看出输出直流分量随着滤波数据的增加慢慢收敛,而这个收敛速度取决于系数k,根据k的表达式 可得,k的值取决于采样周期 和RC值,如果采样频率固定为245.76MHz,则RC值决定了k的取值。

         根据多次仿真的到k的不同取值对模块的影响:

         k取值越大,DC值收敛得越快;k取值越小,DC值越稳定、越平滑。因此,不是k取值越大越好,收敛快但是波动比较大,如图5所示,这样直流分量肯定是滤不干净的。

snap5.jpg

图5

         究其原因,得从原理上着手,翻看了一下信号与系统书(这些基本概念长时间不用都还给老师了,平时还得多注意复习一下基础知识),原来k的值决定了这个低通滤波器的截止频率,输出直流分量的波动性不仅仅跟k值有关,还与输入信号频率和采样频率有关,在本文实例中,输入信号频率为5MHz,采样频率为245.76MHz,在图4中k=0x85,图5中k=0x400,如图6所式为k的两个取值得到滤波器的幅频特性,并且标出了输入信号所在频点(5MHz/245.76*2=0.04068)的幅度特性,分别为-29.98dB和-12.6dB,相差了近20dB。因此在设计去直流模块时应根据实际应用情况决定k的取值。

snap6.jpg

图6

         本文介绍了一种信号去直流的新方法,但不是所有场合都试用,如果FPGA平台DSP资源比较少,如SPARTAN系列,建议采用常规累加+移位的方法。而本文实例中采用Kintex7系列FPGA,有丰富的DSP资源,而采用此方法整个模块只需要1个DSP48E1,并且能高速处理,因此非常适用。

参考文献

Xilinx White Paper: WQ279 Digitally Removing a DC Offset: DSP Without Mathematics

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

bitao1983_395643617 2015-1-4 10:48

能不能把查考文献Xilinx White Paper: WQ279 Digitally Removing a DC Offset: DSP Without Mathematics发给我一份,我的邮箱是bitao1983@163.com,谢了!!!

用户437005 2013-9-23 14:48

这种方法非常妙,但如果是脉冲信号,会产生振荡。
相关推荐阅读
Hoki 2017-01-11 17:35
LX9开发板呼吸灯实现
对LX9开发板硬件评测后,从这一节开始真正进入FPGA开发的世界。很多开发板的例程中必有跑马灯实验,老跑马也没意思,咱来把新潮的,整一个呼吸灯。 呼吸灯最初是出现在apple公司的笔记本产品中,当合上...
Hoki 2017-01-11 16:47
LX9的microblaze配置
虽然XC6SLX9芯片资源比较少,但是嵌一个microblaze还是搓搓有余的,这一节就来评测一下在XC6SLX9上microblaze的配置。 有两种方法配置microblaze,一是在ISE软件中...
Hoki 2017-01-11 16:32
zynq评测
Zynq芯片是业界第一款在FPGA中集成ARM核的芯片,由FPGA的发明者xilinx公司推出的。Zynq严格来说不能以FPGA来定义它,因为其是以处理器为中心的平台,能够在单芯片上提供软、硬件和 I...
Hoki 2017-01-11 16:19
u-boot
Zyny芯片启动加载分为3步: 1. 芯片上电启动,首先读取BootROM中的程序,初始化一些必要的外设,然后根据专用引脚电平判断该从何处启动first stage Bootloader(FSBL),...
Hoki 2017-01-11 16:09
基于zynq的交叉编译平台
Zynq芯片的最大特点是其集成了双ARM Cortex-A9处理器,因此zynq的应用基本是以这个ARM核为核心,再配合FPGA逻辑作为协处理器,几乎能实现所有较复杂的应用。并且在ARM上可以跑操作系...
Hoki 2017-01-11 15:54
u-boot image生成
这节介绍一下如何生成u-boot image文件,在SDK软件中点击Xilinx Tools→Create Boot Image工具即可生成,但是生成image文件需要首先集齐3个文件:u-boot....
EE直播间
更多
我要评论
2
21
关闭 站长推荐上一条 /3 下一条