标题: 基于matlab FPGA verilog的DUC/DDC设计 [打印本页]
作者: yuyang911220 时间: 2015-8-30 22:03 标题: 基于matlab FPGA verilog的DUC/DDC设计
1、一个完整的DUC功能框图如下:
FPGA verilog的DUC/DDC设计(原创)" title="基于matlab FPGA verilog的DUC/DDC设计(原创)" height="297" width="690">
一个实时信号是由两个分量组成:I(n(同相分量))和Q(n)(正交分量)。这两个分量频率相等,相位相差90度。相关的理论可以参考参考资料的Quadrature_signals.pdf文件。欧拉公式:
FPGA verilog的DUC/DDC设计(原创)" title="基于matlab FPGA verilog的DUC/DDC设计(原创)" height="59" width="598">
FPGA verilog的DUC/DDC设计(原创)" title="基于matlab FPGA verilog的DUC/DDC设计(原创)" height="82" width="690">
FPGA verilog的DUC/DDC设计(原创)" title="基于matlab FPGA verilog的DUC/DDC设计(原创)" height="64" width="690">
2、由三角公式 cos(α+β)=cosα·cosβ-sinα·sinβ,假设代表两个信号的频率,要FPGA实现上变频,只需实现公式cosα·cosβ-sinα·sinβ,令频率分量代表输入信号,频率分量代表本振,FPGA实现上变频功能框图:
FPGA verilog的DUC/DDC设计(原创)" title="基于matlab FPGA verilog的DUC/DDC设计(原创)" height="196" width="395">
分量FPGA verilog的DUC/DDC设计(原创)" title="基于matlab FPGA verilog的DUC/DDC设计(原创)" height="16" width="17">和分量FPGA verilog的DUC/DDC设计(原创)" title="基于matlab FPGA verilog的DUC/DDC设计(原创)" height="23" width="17">都有DDS产生(见DDS模块),实现上变频。
3、modelsim仿真和输出频谱分析
(1) 分量频率=0.1MHz, 分量=0.1MHz
FPGA verilog的DUC/DDC设计(原创)" title="基于matlab FPGA verilog的DUC/DDC设计(原创)" height="356" width="690">
FPGA verilog的DUC/DDC设计(原创)" title="基于matlab FPGA verilog的DUC/DDC设计(原创)" height="564" width="670">
图中可以看到,DUC的输出为0.2MHz,为本振和信号频率相加,-0.2MHz为镜像频率。
部分代码:
//Filename :duc_block.v
//modulename:duc_block
//Author :afei
//Date :2012-5-29
//Description :数字上变频,i_nco1控制信号频率,i_nco2控制本振频率
//Uesedfor
//Taobao :
//E-mail :2352517093@qq.com
//==========================================================================
`timescale 1ns/1ps
module duc_block(
i_clk ,
i_rst_n ,
i_nco1 ,
i_nco2 ,
o_duc
);
input i_clk ;//25MHz
input i_rst_n ;
input [8:0] i_nco1 ;//信号频率控制字
input [8:0] i_nco2 ;//本振频率控制字
outputreg signed[7:0]o_duc ;//上变频输出
.........................................
.........................................
........................................
//=======================================================
// 上变频
//=========================================================
//======cosα*cosβ
reg signed[15:0] sub_data1 ;
[email=always@%28posedge]always@(posedge[/email] i_clk ornegedge i_rst_n)
if(!i_rst_n)
sub_data1<=16'b0 ;
else
sub_data1<=signal_i*vco_i ;
//=====sinα*sinβ
reg signed[15:0] sub_data2 ;
[email=always@%28posedge]always@(posedge[/email] i_clk ornegedge i_rst_n)
if(!i_rst_n)
sub_data2<=16'b0;
else
sub_data2<=signal_q*vco_q;
//=======cosα*cosβ-sinα*sinβ
reg signed[15:0] sub_result;
[email=always@%28posedge]always@(posedge[/email] i_clk or negedgei_rst_n)
if(!i_rst_n)
sub_result<=16'b0;
else
sub_result<=sub_data1-sub_data2;
//========================================================
// 截位输出
//========================================================
[email=always@%28posedge]always@(posedge[/email] i_clk or negedgei_rst_n)
if(!i_rst_n)
o_duc<=8'b0;
else
o_duc<=(sub_result[14:0]+{!sub_result,{6{sub_result[14]}}})>>7;//四舍五入
endmodule
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |