微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 基于FPGA的QPSK信号源的设计与实现

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

时间:11-03 来源:互联网 点击:
软件设计

QPSK信号的生成

QPSK信号产生的原理在前面已作详述,FPGA的外接60MHz时钟通过内部的时钟管理器倍频实现120MHz时钟,通过Block RAM 资源实现只读ROM,然后通过累加器进程、读QPSK码字进程、重复周期计数进程等实现DDS功能,通过乘法器还可实现输出信号的幅度控制。以下是部分源程序,采用Verilog HDL语言编写。

时钟管理单元,使用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)上变频后输出,该方法具有很强的可扩展性。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top