EDN China > 设计实例 > 可编程器件 > FPGA > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

基于FPGA的QPSK信号源的设计与实现

2008年08月08日 ?? 收藏0

  时钟管理单元,使用XILINX的DCM实现倍频,由60MHz变为120MHz。

  dcm60 dcmclk60 (

  .CLKIN_IN(clk_in),

  .RST_IN(~reset),

  .CLKIN_IBUFG_OUT(clk_ibufg_out),

  .CLK0_OUT(clk_0),

  .CLK2X_OUT(clk_2x),

  .LOCKED_OUT(locked_out60) );

  单口只读ROM,使用IP核,实现正弦查找表,数据宽度为14位,深度为16384字(14地址位)。ROM核接收的数据文件为COE文件,然后转换为mif二进制文件格式,COE文件可通过C语言或MATLAB生成。ROM核的实现如下:

  rom16384 rom16384(

  .addr(DDS_addr),

  .clk(clk_2x),

  .dout(dds_data),

  .sinit(~reset),);

  相位累加器位数设置为32位,系统时钟120MHz,这样可实现小于0.03Hz的频率分辨率,查找表相位截取低14位。累加器进程如下:

  always@(posedge clk_2x)

  begin

  if(dds_countT ==1'b0) //dds_countT为脉冲宽度计数器,时钟为clk_2x。

  dds_start<=1'b1;

  else

  dds_start<=1'b0;

  if(dds_stop=1'b0 && dds_stop_set=1'b0) //dds_stop是周期起停标志,dds_stop_set是上位机控制起停标志

  begin

  if(dds_start==1'b1 )

  case (psk)

  2'b00:dds_acc<=phase1;

  2'b01:dds_acc<=phase2;

  2'b10:dds_acc<=phase3;

  2'b11:dds_acc<=phase4;

  endcase;

  else

  dds_acc<=dds_acc + dds_freq_add;//dds_freq_add对于设置的QPSK载波频率。

  end;

  if(dds_countT<=countF_set && dds_countT>1) // countF_set为设置的QPSK脉冲宽度对应的数值。

  dds_addr<=dds_acc[31:18] ;

  else

  dds_addr<=14'b00000000000000;

  end;

  end;

  DDS信号的控制实现

  上位机通过PCI总线实现信号参数的读写控制。因本系统中只需PCI实现信号参数的控制,数据量不大,故配置PCI9054为PCI的从目标(Slave),C模式。

  在FPGA中实现参数寄存器,实时读取PCI总线的数据并更新。FPGA本地总线的读写通过三态门控制。实现代码如下:

  assign data_inout=(enout)? data_out:32'bzzzzzzzz;

  always@(clk)

  begin

  data_in<=data_inout;

  end

  读写实现通过状态机程序实现,读写状态流程图如图3。

读写状态流程图

  上位机程序设计

  上位机安装Windows系统,传统上,PCI的驱动通过微软的DDK实现WDM驱动程序,本信号源设计中采用Windriver软件,可方便地读写主机给PCI9054系统板分配的内存及I/O资源,并可生成inf文件和基于VC等开发环境的程序文件。

  结论

  试验表明,以本文所介绍的方法产生的信号源具有很好的性能,5MHz时连续波点频的杂散SFDR达到70dB以上,输出信号的频率覆盖短波波段,可达30MHz以上。在实际应用中,还可以加上线性调频等其他信号形式。若信号频段在超短波以上,可用DDS产生固定中频,经数字上变频和DAC芯片(如AD公司的AD9857)上变频后输出,该方法具有很强的可扩展性。


上一页12下一页
?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

FPGA? 信号源? ASIC? QPSK?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈