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呵呵),一般情况都是自己设计的问题。没有无缘无故的问题,有果必有因,不要放过任何一个问题,把在做设计的过程中所有的问题、现象都搞清楚了才能慢慢成为高手。
用户1833811 2015-4-2 10:55
1
用户377235 2015-2-5 17:20
用户1429847 2014-6-19 00:25
用户491884 2014-6-18 14:21
用户1429847 2012-12-7 09:54
用户1429847 2012-12-6 10:51
举个例子,如果一个工程里面您用了一万个寄存器,有一万条信号路径的setup、hold需要满足,如果每个寄存器都有复位信号,那么就多出了一万条复位信号的路径的时序需要满足,即使是异步复位信号也是要分析你解复位的时候的建立、保持时间(recovery、removal)的。而这一万条复位信号可能90%是可以不用的,那么在你工程布线的时候是不是可以省下来布线资源,软件可以少分析时序路径,给整个工程留出时序余量呢,而且工程跑的时间更短?我的另一篇文章:Quartus综合有符号数乘加运算的一个问题 里面的verilog例子可以看到所有的寄存器都是没必要加复位信号的。
用户424825 2012-11-7 11:22
用户226122 2012-9-5 09:20
用户226122 2012-9-5 09:19
用户377235 2012-9-5 09:17
牛贴必须要顶,牛人必须要有人注水,祝浪情海边再浪一层楼!