Xilinx PC-CFR算法verilog实现
希望对你有用:
第一步就是分析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呵呵),一般情况都是自己设计的问题。没有无缘无故的问题,有果必有因,不要放过任何一个问题,把在做设计的过程中所有的问题、现象都搞清楚了才能慢慢成为高手。
谢谢! 这个博客之前也有看过! 现在也就是根据Xilinx的PG文件,一块一块的实现功能吧!