赞
踩
1、一个完整的DUC功能框图如下:
一个实时信号是由两个分量组成:I(n(同相分量))和Q(n)(正交分量)。这两个分量频率相等,相位相差90度。相关的理论可以参考参考资料的Quadrature_signals.pdf文件。欧拉公式:
2、由三角公式 cos(α+β)=cosα·cosβ-sinα·sinβ,假设代表两个信号的频率,要FPGA实现上变频,只需实现公式cosα·cosβ-sinα·sinβ,令频率分量代表输入信号,频率分量代表本振,FPGA实现上变频功能框图:
分量
和分量
都有DDS产生(见DDS模块),实现上变频。
3、modelsim仿真和输出频谱分析
(1) 分量频率=0.1MHz, 分量=0.1MHz
图中可以看到,DUC的输出为0.2MHz,为本振和信号频率相加,-0.2MHz为镜像频率。
部分代码:
//Filename :duc_block.v
//modulename:duc_block
//Author :a fei
//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 ;//本振频率控制字
output reg signed[7:0] o_duc ;//上变频输出
.........................................
.........................................
........................................
//=======================================================
// 上变频
//=========================================================
//======cosα*cosβ
reg signed[15:0] sub_data1 ;
always@(posedge i_clk or negedge 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 ;
always@(posedge i_clk or negedge 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 ;
always@(posedge i_clk or negedge i_rst_n)
if(!i_rst_n)
sub_result<=16'b0 ;
else
sub_result<=sub_data1-sub_data2 ;
//========================================================
// 截位输出
//========================================================
always@(posedge i_clk or negedge i_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
更多的CIC滤波器、FIR滤波器、DDC、DUC、DDS的代码和视频教程请查看
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。