原创 PC_CFR的FPGA实现

2014-6-26 02:59 3988 19 30 分类: 通信

        CFR(Crest Factor Reduction),俗称削峰,就是降低信号峰均比的一种算法。现在业界比较流行的、易于实现的CFR算法是PC-CFR。PC-CFR的核心思想是:用频率响应在待削峰信号频带内的滤波器的冲击响应,直接去对消信号峰值的最大点,随着主要矛盾的解决、次要矛盾也就相应解决了。

        今天终于调试通过CFR,CFR的时延尽可能的少了,CFR模块都没复位信号(个人觉得一个工程里面99%的复位信号都是可以省略的,如果全面考虑这点,会给整个设计腾出时序余量)。

        因为原有的CFR模块的时延比较大,看别人的程序、理解别人的程序是比较痛苦的一件事,还有乘法器、RAM、CORDIC等调用了IP,通用性不够好,所以决定自己写一个。

 

第一步就是分析XILINX的PC-CFR,System Generator搭建的 IP (pc_cfr_virtex5_v1_1.mdl)。不清楚PC-CFR算法是不是XILINX最早提出来的,反正个人觉得ALTERA的CFR算法肯定是参考XILINX写的呵呵,感觉XILINX在无线通信这块还是要较ALTERA强一些。pc_cfr_virtex5_v1_1.mdl一同有8个子模块:

        1.cordic_mag_sin_cos模块:采用cordic算法计算信号的模值,信号的正弦、余弦值。模块的时延是10个信号采样周期。

        2.peak_scale模块:计算信号峰值与削峰门限差值的正弦、余弦值。模块的时延是3个信号采样周期。

        3.peak_detect模块:找峰值,要等到信号模值下降到门限下面才能确定前面的峰值是真正的峰值,而且超过门限的一批信号中,如果有多于一个的山峰,那么最大的那个峰才判定为真正的峰值。模块的时延是3+peak_delay个信号采样周期,peak_delay由peak_detect模块给出。

        4.peak_align模块:峰值延时模块,让找到的峰值有固定35个信号采样周期的延时。模块的时延是32-peak_delay个信号采样周期,peak_delay由peak_detect模块给出。所以峰值的固定延时等于3+peak_delay+32-peak_delay=35个个信号采样周期

        5.peak_scale_delay模块:peak_scale延时模块。模块的时延是35个信号采样周期,因为由前面可知信号的峰值也是延迟35个信号采样周期才给出的。

        6.c_pulses模块:四个CPG模块采用时分复用的方式工作。PC-CFR滤波器的冲击响应与信号峰值去对消的时候,滤波器的IQ信号大小是受信号峰值与门限的距离决定的,本模块实现滤波器与信号峰值与门限的差值相乘。模块的时延是6个信号采样周期。

        7.data_in_delay模块:输入信号要经过延时与滤波器相应点对齐了之后再相减,才能消去相应的峰值。延时包括两块:一是滤波器的延时(如果PC-CFR滤波器的阶数为N,则延时(N-1)/2个信号采样周期),二是前面几个模块处理的延时一共54个信号采样周期(10(cordic_mag_sin_cos)+3(peak_scale)+35(peak_delay)+6(c_pulses))。

        8.subtract模块:经过延时的信号与经过缩放的PC-CFR滤波器相减。

 

分析完XILINX的PC-CFR IP 之后,就开始动手自己的PC-CFR。方案基本参考XILINX算法(必须的呵呵,本人也不可能提出更牛逼的算法),有两个地方做了修改:

        1.XILINX的算法各个处理模块的时延都是跟信号采样周期有关系的,要想减少时延,必须在信号高速率下面做CFR,带来的问题就是滤波器的阶数要相应的增加(原因就不说了,做这块的都清楚哈)。而本人经过仿真,内插的过程中信号的峰值是不会再生的。所以CFR建议还是在信号低速率下面做(可以减少滤波器的阶数,可以让CFR的工作时钟工作在低速率下面从而容易满足时序要求),然后再对信号进行内插。我的设计上面的处理模块的延时都是跟CFR的工作时钟相关的,就是如果信号的采样率没变,而工作时钟提高的话,处理模块的时延就相应的减少了。

        2.XILINX的算法找峰值模块,要等到信号模值下降到门限下面才能确定前面的峰值是真正的峰值,找到峰值有个固定的35个信号采样周期的延时,这一块的延时还是满大的。本人的设计里面信号峰值出现信号开始下降沿的时候,等N个信号采样周期没有出现更大的峰值的时候确认峰值有效 ,N可设置范围2~128。经过测试N设置为2 ,CFR就能正常工作了。所以这块就减少了33个信号采样周期的延时。

 

总结:做设计不仅要清楚要做什么,还必须知道为什么要这么做。做FPGA、做逻辑,画的时序图跟仿真出现的结果和你想要的结果是一样的,才OK了。如果FPGA硬件跑出来的结果跟预想的不一样,千万不要一开始就怀疑人家芯片、软件的问题(虽然Xilinx、Altera有时候还是有bug呵呵),一般情况都是自己设计的问题。没有无缘无故的问题,有果必有因,不要放过任何一个问题,把在做设计的过程中所有的问题、现象都搞清楚了才能慢慢成为高手。

 

 

文章评论11条评论)

登录后参与讨论

用户1833811 2015-4-2 10:55

用户377235 2015-2-5 17:20

谢谢分享!

用户1429847 2014-6-19 00:25

不客气

用户491884 2014-6-18 14:21

牛人啊,感谢你的支持!

用户1429847 2012-12-7 09:54

兄弟可以看下: Xilinx White Paper《 Get Smart About Reset:Think Local, Not Global》里面写了很多复位的缺点

用户1429847 2012-12-6 10:51

举个例子,如果一个工程里面您用了一万个寄存器,有一万条信号路径的setup、hold需要满足,如果每个寄存器都有复位信号,那么就多出了一万条复位信号的路径的时序需要满足,即使是异步复位信号也是要分析你解复位的时候的建立、保持时间(recovery、removal)的。而这一万条复位信号可能90%是可以不用的,那么在你工程布线的时候是不是可以省下来布线资源,软件可以少分析时序路径,给整个工程留出时序余量呢,而且工程跑的时间更短?我的另一篇文章:Quartus综合有符号数乘加运算的一个问题 里面的verilog例子可以看到所有的寄存器都是没必要加复位信号的。

用户424825 2012-11-7 11:22

拜读了您的大作,请问您能否解释一下,为什么不建议每个D触发器都带有复位信号呢?我们这边单位的硬性规定是所有D触发器必须有高电平异步复位信号"always @ (posedge CLK or posedge RST) ",而且,在FPGA的逻辑单元里面的D触发器也都是带有CLR端的。所以对您的做法不太理解,请赐教。

用户226122 2012-9-5 09:20

牛人必须要追随!祝浪情海边再浪一层楼!

用户226122 2012-9-5 09:19

牛贴必须要顶!

用户377235 2012-9-5 09:17

牛贴必须要顶,牛人必须要有人注水,祝浪情海边再浪一层楼!

相关推荐阅读
用户1429847 2014-06-26 03:01
FPGA创新 FPGA合作
本人住杭州,自认为是个合格的FPGA工程师。 熟悉xilinx altera系列FPGA的开发流程。带领团队量产过5-6个以FPGA为核心的产品。 如果您有好的想法,或者掌握算法,需要FP...
用户1429847 2013-02-17 11:30
时序分析TimeQuest之多周期约束
时序分析TimeQuest之多周期约束.         网上有很多讲ALTERA时序约束(TimeQuest)的文章,其中关于多周期约束set_multicycle_path的,有一...
用户1429847 2013-01-07 13:11
Goertzel算法解析
不能有效编辑,贴图了 呵呵           ...
用户1429847 2012-12-07 10:57
Quartus综合有符号数乘加运算的一个问题
  昨晚项目调试的时候遇到一个问题:   输入IQ交织、有符号的复信号,时序是: iq_data           :I Q I Q I Q I Q iq_data_fsy...
我要评论
11
19
关闭 站长推荐上一条 /2 下一条