当前位置:   article > 正文

基于matlab FPGA verilog的DUC/DDC设计_fpga实现duc

fpga实现duc

1、一个完整的DUC功能框图如下:

 

基于matlab <wbr>FPGA <wbr>verilog的DUC/DDC设计(原创)

一个实时信号是由两个分量组成:I(n(同相分量))和Q(n)(正交分量)。这两个分量频率相等,相位相差90度。相关的理论可以参考参考资料的Quadrature_signals.pdf文件。欧拉公式:

基于matlab <wbr>FPGA <wbr>verilog的DUC/DDC设计(原创)


 

基于matlab <wbr>FPGA <wbr>verilog的DUC/DDC设计(原创)



 

基于matlab <wbr>FPGA <wbr>verilog的DUC/DDC设计(原创)


 

2、由三角公式 cos(α+β)=cosα·cosβ-sinα·sinβ,假设代表两个信号的频率,要FPGA实现上变频,只需实现公式cosα·cosβ-sinα·sinβ,令频率分量代表输入信号,频率分量代表本振,FPGA实现上变频功能框图:

基于matlab <wbr>FPGA <wbr>verilog的DUC/DDC设计(原创)

分量

基于matlab <wbr>FPGA <wbr>verilog的DUC/DDC设计(原创)

和分量

基于matlab <wbr>FPGA <wbr>verilog的DUC/DDC设计(原创)

都有DDS产生(见DDS模块),实现上变频。

3、modelsim仿真和输出频谱分析

(1) 分量频率=0.1MHz, 分量=0.1MHz

基于matlab <wbr>FPGA <wbr>verilog的DUC/DDC设计(原创)



 

基于matlab <wbr>FPGA <wbr>verilog的DUC/DDC设计(原创)


 

图中可以看到,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的代码和视频教程请查看

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号