基于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)上变频后输出,该方法具有很强的可扩展性。
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)上变频后输出,该方法具有很强的可扩展性。
无线电 电子 电路 FPGA 总线 滤波器 DAC CMOS 电压 电流 放大器 PCB 看门狗 场效应管 Verilog C语言 相关文章:
- 基于DSP的单兵作战用机器人控制系统设计(07-25)
- 应用处理器连接汽车和消费电子两大领域(02-26)
- TMS320C6000嵌入式系统优化编程的研究(04-08)
- TI首席科学家展望2020年处理器架构和DSP的发展(10-24)
- 基于JTAG接口实现ARM的FPGA在线配置(04-24)
- 数字信号处理器的市场竞争及技术发展趋势(06-24)
