数字中频的基本原理和FPGA的实现_第1页
数字中频的基本原理和FPGA的实现_第2页
数字中频的基本原理和FPGA的实现_第3页
数字中频的基本原理和FPGA的实现_第4页
数字中频的基本原理和FPGA的实现_第5页
已阅读5页,还剩5页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数字中频的基本原理和 FPGA 的实现1基本原理数字中频主要分两部分,数字上变频(DUC)和数字下变频(DDC)。它们的主要功能是相反,但原理和实现的方法是十分相似。在 R8905 项目中由于采用了零中频技术,数字上变频和下变频有一些差别,数字上变频没有了 NCO 模块。另外为了降低输出信号的峰均比又加入了削峰模块 CFR,而 CGC 模块的引入则是补偿削峰所引起的功率损失。2倍内插         CFR 

2、;      HBCPRI接口处理RCF2倍内插CIC54倍内插3.84M7.68M15.36M61.44MCGC图 1 数字上变频模块框图在数字下变频中 RSSI 模块是信号的功率检测模块,它配合 AGC 电路将信号的输出功率稳定在一定范围内。NCO              CIC54倍抽取HB2倍抽取RRC  &

3、#160;              AGCcpri61.44M15.36M7.68MRSSI图 2 数字下变频模块框图在 DDC 和 DUC 中主要使用 3 种滤波器分别是 RRC,HB 和 CIC,它们个自有个自的特点。RRC 滤波器一般来讲阶数比较多,多用于低频处。由于它的阶数比较多,所以可以得到比较锐利的带通特性,但它所用的乘法器

4、比较多。CIC 滤波器不需要乘法器,但它的带内不是很平坦,适合用在高频处。而HB 滤波器的特性正好在它们之间,它有约一半的系数是 0 可以讲乘法器的个数减少一半。削峰模块 CFR 实际上也是一组滤波器,它的功能是将 CDMA 信号中的峰值信号减小一些,以减小输出信号的峰均比,使射频功率放大器的效率更高。削峰的模块框图如图 3图 3 单级削峰示意图削峰的原理是这样的一个复信号(I,Q)如果它的模大于某个门限,就将其减去这个门限得到一个复信号(dI,dQ),否则(dI,dQ)(0,0)。将

5、(dI,dQ)送到 fir 滤波器中,fir 滤波器是一个低通滤波器将峰值限定在一定的带宽内,防止影响临道。将原信号(I,Q)减去滤波后的信号(fir_i,fir_q)就得到了削峰的值。如果有必要这这样的削峰可以连续做几次,在 R8905 设计中削峰用了两次。2 滤波器的设计由于在滤波的同时还有内插和抽取,所以充分利用这一特性可以减少 FPGA 使用的资源。另外滤波器的系数一般都是对称的,可以将头和尾的数相加再乘滤波器的系数,这样可以大大减少乘法器的使用。以 R8905 中的上变频 R

6、RC 为例来说明:设 a(n)为 RRC 滤波器的系数而 x(n)为 3.84M 输入数据则考虑了内插后的滤波器的数学表达式为y=a(0)*x(n)+a(1)*0+a(2)*x(n-1)+.+a(n-1)*0+a(0)*x(0)=a(0)*(x(n)+x(0) +a(2)*( x(n-1)+x(1).其 FPGA 实现的逻辑框图如下图 4 DUC RRC 滤波器实现逻辑图其中使用了 4 个乘法器和四个 RAM

7、0;以及一个 ROM 来存数据。RRC_CTR_6144 模块控制这些乘法器和 ROM。参考代码如下:/ Date: Sat Jul 21 10:51:51 2007/ Author: duan chenghong/ Company: zte/ Description :/RRC 滤波器用了 4 个 RAM 和 4 个乘法器完成 IQ 两

8、路的滤波功能,/I,Q 的处理方法完全相同。数据同时写入 4 个 RAM 中,但读的地址不/同,由于 RRC 滤波器的系数是对称的所以读 RAM 的地址也是对称的,将地址/对称的 RAM 读出数相加再和 RRC 滤波器系数相成再累加就可以得到最后的结果/modulerrc_ctr_6144 (waddr,raddr0, raddr1, raddr2, raddr3, clk, reset,data_en,&

9、#160;dat0_out, dat1_out, dat2_out, dat3_out, coef,raddr_coef, ih, il, qh, ql, coef_h, coef_l, mih, mil, mqh, mql, idat,qdat, rrc_en);output 5:0 waddr  reg 5:0 waddr output 5:0 

10、;raddr0  wire 5:0 raddr0 output 5:0 raddr1  wire 5:0 raddr1 output 5:0 raddr2  wire 5:0 raddr2 output 5:0 raddr3  wire 5:0 raddr3 input clk  wire clk&

11、#160;input reset  wire reset input data_en  wire data_en input 31:0 dat0_out  wire 31:0 dat0_out input 31:0 dat1_out  wire 31:0 dat1_out input 31:0 dat2_out  wi

12、re 31:0 dat2_out input 31:0 dat3_out  wire 31:0 dat3_out input 31:0 coef  wire 31:0 coef output 3:0 raddr_coef  wire 3:0 raddr_coef output 16:0 ih  reg 16:

13、0 ih output 16:0 il  reg 16:0 il output 16:0 qh  reg 16:0 qh output 16:0 ql  reg 16:0 ql output 15:0 coef_h  wire 15:0 coef_h output 15:0 co

14、ef_l  wire 15:0 coef_l input 32:0 mih  wire 32:0 mih input 32:0 mil  wire 32:0 mil input 32:0 mqh  wire 32:0 mqh input 32:0 mql  wire 32:0 m

15、ql output 15:0 idat  reg 15:0 idat output 15:0 qdat  reg 15:0 qdat output rrc_en  reg rrc_en assign coef_h=coef31:16;assign coef_l=coef15:0;reg 3:0 cnt;always(posedge clk 

16、;or negedge reset)if(reset)waddr<=0;elseif(data_en)waddr<=waddr+1'b1;always(posedge clk or negedge reset)if(reset)cnt<=0;elseif(data_en)cnt<=0;elsecnt<=cnt+1'b1;assign raddr_coef = cnt3?cnt-3:cnt-1'b1;/系数的地址assign raddr0

17、60;=cnt3?waddr-23+cnt2:0:waddr-23+cnt2:0-1;assign raddr1 =cnt3?waddr-23+cnt2:0+6:waddr-23+cnt2:0+6-1;assign raddr2 =cnt3?waddr-cnt2:0-1:waddr-cnt2:0-1 assign raddr3 =cnt3?waddr-cnt2:0-6-1:waddr-cnt2:0-6-1 / 4 个 RAM 的读地址always(posedge c

18、lk or negedge reset)if(reset)ih<=0;elseih<=dat0_out31,dat0_out31:16+dat2_out31,dat2_out31:16;always(posedge clk or negedge reset)if(reset)il<=0;elseil<=dat1_out31,dat1_out31:16+dat3_out31,dat3_out31:16;always(posedge clk or negedge r

19、eset)if(reset)qh<=0;elseqh<=dat0_out15,dat0_out15:0+dat2_out15,dat2_out15:0;always(posedge clk or negedge reset)if(reset)ql<=0;elseql<=dat1_out15,dat1_out15:0+dat3_out15,dat3_out15:0;/为防止相加溢出,补一位wire 35:0 ex_mih,ex_mil,ex_mqh,ex_mql;assign ex_mih=mih32?

20、 3'b111,mih:3'b000,mih;assign ex_mil=mil32? 3'b111,mil:3'b000,mil;assign ex_mqh=mqh32? 3'b111,mqh:3'b000,mqh;assign ex_mql=mql32? 3'b111,mql:3'b000,mql;/为防止累加溢出,补 3 位reg 35:0 sum_ih,sum_il,sum_qh,sum_ql;always(pos

21、edge clk or negedge reset)if(reset)sum_ih<=0;elseif(cnt2:0=3'b001)sum_ih<=0;elsesum_ih<=sum_ih+ex_mih;always(posedge clk or negedge reset)if(reset)sum_il<=0;elseif(cnt2:0=3'b001)sum_il<=0;elsesum_il<=sum_il+ex_mil;always(posedge 

22、clk or negedge reset)if(reset)sum_qh<=0;elseif(cnt2:0=3'b001)sum_qh<=0;elsesum_qh<=sum_qh+ex_mqh;always(posedge clk or negedge reset)if(reset)sum_ql<=0;elseif(cnt2:0=3'b001)sum_ql<=0;elsesum_ql<=sum_ql+ex_mql;always(posedge clk o

23、r negedge reset)if(reset)rrc_en<=0;elseif(cnt2:0=3'b000)rrc_en<=1'b1;elserrc_en<=0;/产生 RRC 滤波器输出数据使能信号always(posedge clk or negedge reset)if(reset)idat<=0;elseif(cnt2:0=3'b000)idat<=(sum_ih+sum_il)>>13)+1'b1)>>1;alway

24、s(posedge clk or negedge reset)if(reset)qdat<=0;elseif(cnt2:0=3'b000)qdat<=(sum_qh+sum_ql)>>13)+1'b1)>>1;/产生 I,Q 两路数据并对末位进行四舍五入endmodule如果是半带滤波器,考虑到内插在奇数拍时有y=a(0)*x(n)+0*0+a(2)*x(n-1)+.+0*0+a(0)*x(0)=a(0)*(x(n)+x(0) +a(2)*( x(n-1)+x(1

25、).而在偶数拍有y=a(0)*0+0*x(n-1)+a(2)*0+.+a(m)x(m)+0.+0;及只有中间项有数,其他各项不是系数为 0,就是数据为 0,且中间项的系数一般是 0.5,利用这一点可以减少 FPGA 的资源。HB 滤波器的设计和 RRC 十分相似,如下图图 5 HB 滤波器设计框图而 CIC 滤波器相对简单些,它实际上就是一些加法和一些减法,其设计框图如图 6 所示图 6 CIC 滤波器设计框图在&#

26、160;CIC 滤波器中需要注意的是 d1clk 模块,它只是为了调整时序。3.设计对时序要求的满足:完成代码设计后除了要保证仿真正确同时也要保证电路的时序能够满足设计的要求。从图1 可以看到信号的频率随着每一次内插而变高,那各个滤波器的工作时钟是不是也要逐步提高呢?实际上比较好的方法是时钟始终工作在最高频率 61.44M 上而用使能信号来标识数据。当数据的速率是 3.84M 时就每 16 个 61.44M 时钟产生一个使能,而当速率是 7.68M 时就每 8 个 61.44M 时钟产生一个使能。这样整个 DUC 电路只有一个时钟,便于时钟的时序分析。如果我们使用 Xilinx 的 ISE 进行编译,建议综合工具使用 synplify Pro 而不要使用 ISE本身的 XST。选用 synplify Pro 的方法如图 7图 7 在 ISE 

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论