0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA数字信号处理之verilog实现混频器

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-12-09 10:15 次阅读
混频:两个不同频率之间的混合,得到第三个频率。数字信号处理中用来完成频谱搬移求和,是数字信号处理中的基本元件之一。例如通信中的混频合路:ea69cb86-7761-11ed-8abf-dac502259ad0.png常见的数字混频器结构如下,由移频模块和求和模块组成。比如信号A、B是输入的两个单音信号,B是上一节讲到的NCO信号,使用复乘将A、B信号进行搬移,然后求和。ea7aa906-7761-11ed-8abf-dac502259ad0.png

频谱搬移的过程如下,输入信号Data_in,与NCO产生的单音信号进行复乘得到Data_out;

ea99f982-7761-11ed-8abf-dac502259ad0.png

将Data_in与Data_out的频谱放到一起如下,可以看到频谱搬移的过程。

eab480e0-7761-11ed-8abf-dac502259ad0.png

频谱搬移在计算上就是复乘:(i+q*j)*(cos+sin*j)=(cos*i-sin*q)+(sin*i+cos*q)*j,用xilinx片子实现的话我们还是选择DSP48,其结构如下:

eae2ff42-7761-11ed-8abf-dac502259ad0.png

其中用到了dsp的级联,可以参考之前dsp48e1详细讲解的文章:FPGA的底层资源之DSP48E1和Xilinx DSP48E1仿真。这里不再详细描述。

代码实现如下:

首先的端口声明:

// ============================================================
// File Name: cm_mix
// VERSION  : V1.0
// DATA     : 2022/11/6
// Author   : FPGA干货分享
// ============================================================
// 功能:数字混频器  (i+q*j)*(cos+sin*j) = (cos*i - sin*q) + (sin*i + cos*q)*j
// delay  
// ============================================================


`timescale 1ns/1ps
module cm_mix #(
        parameter           C_DATA_WITH     = 16 ) // 
    (
        input  wire                     I_sys_clk    , // 输入时钟
        input  wire                     I_rst_in     , // 输入复位 高有效
        input  wire [6:0]               I_phase      , // 初始相位
        input  wire [7:0]               I_freq       , // 频率,步进,1代表1M
        input  wire [C_DATA_WITH-1:0]   I_data_in_i  , // 输入数据 实部I
        input  wire [C_DATA_WITH-1:0]   I_data_in_q  , // 输入除数 虚部Q
        output reg  [C_DATA_WITH-1:0]   O_data_out_i , // 输出数据 实部I
        output reg  [C_DATA_WITH-1:0]   O_data_out_q );// 输出除数 虚部Q
        
// ============================================================
// 内部参数
// ============================================================


// ============================================================
// 变量
// ============================================================
wire       [10:0]               S_sin_out       ;
wire       [10:0]               S_cos_out       ;
reg        [C_DATA_WITH-1:0]    S_data_in_q     ;
reg        [10:0]               S_sin_out_d     ;
reg        [10:0]               S_cos_out_d     ;


wire       [47:0]               S_pcout_cos_i   ;
wire       [47:0]               S_dsp_out_i     ;
wire       [47:0]               S_pcout_sin_i   ;
wire       [47:0]               S_dsp_out_q     ;

然后调用上一篇文章中的NCO模块FPGA数字信号处理之verilog实现NCO(代码及仿真):

cm_nco_100 cm_nco_100 (
    .I_sys_clk      (I_sys_clk     ) , /// 工作时钟 100M
    .I_rst_n        (!I_rst_in     ) , /// 复位信号,用来清相位
    .I_phase        (I_phase       ) , /// 初始相位
    .I_freq         (I_freq        ) , /// 频率,步进,1代表1M
    .O_sin_out      (S_sin_out     ) , /// 输出正弦值
    .O_cos_out      (S_cos_out     )   /// 输出余弦值
);

接着打拍并调用乘法器:


always @(posedge I_sys_clk )
    if(I_rst_in)
        begin
            S_data_in_q <= 'd0 ;
            S_sin_out_d <= 'd0 ;
            S_cos_out_d <= 'd0 ;
        end
    else
        begin
            S_data_in_q <= I_data_in_q ;
            S_sin_out_d <= S_sin_out   ;
            S_cos_out_d <= S_cos_out   ;
        end
    
// ============================================================
// (cos*i - sin*q)
// ============================================================
//cos*i
cm_dsp48e1 #(
    .C_DATA_WITH_A      (C_DATA_WITH     ),
    .C_DATA_WITH_B      (11              ),
    .C_DATA_WITH_C      (48              ),
    .C_DATA_WITH_D      (25              )
)
U0_cm_dsp48e1(
    .I_CLK              (I_sys_clk      ) , // clk
    .I_RST              (I_rst_in       ) , // RST
    .I_A                (I_data_in_i    ) , // [29:0] 
    .I_B                (S_cos_out      ) , // [17:0] 
    .I_C                (48'd0          ) , // [47:0] 
    .I_D                (25'd0          ) , // [24:0] 
    .I_PCIN             (48'd0          ) , // [47:0] 只能直连PCOUT
    .I_ALUMODE          (4'd0           ) , // [3:0] 
    .I_INMODE           (5'b00101       ) , // [4:0] 
    .I_OPMODE           (7'b0000101     ) , // [6:0] 
    .O_P                (               ) , // [47:0]
    .O_PCOUT            (S_pcout_cos_i  )   // [47:0] 只能直连PCIN
    );


//Pcin - sin*q
cm_dsp48e1 #(
    .C_DATA_WITH_A      (C_DATA_WITH     ),
    .C_DATA_WITH_B      (11              ),
    .C_DATA_WITH_C      (48              ),
    .C_DATA_WITH_D      (25              )
)
U1_cm_dsp48e1(
    .I_CLK              (I_sys_clk      ) , // clk
    .I_RST              (I_rst_in       ) , // RST
    .I_A                (S_data_in_q    ) , // [29:0] 
    .I_B                (S_sin_out_d    ) , // [17:0] 
    .I_C                (48'd0          ) , // [47:0] 
    .I_D                (25'd0          ) , // [24:0] 
    .I_PCIN             (S_pcout_cos_i  ) , // [47:0] 只能直连PCOUT
    .I_ALUMODE          (4'b0011        ) , // [3:0] 
    .I_INMODE           (5'b00101       ) , // [4:0] 
    .I_OPMODE           (7'b0010101     ) , // [6:0] 
    .O_P                (S_dsp_out_i    ) , // [47:0]
    .O_PCOUT            (               )   // [47:0] 只能直连PCIN
    );
    
    
// ============================================================
// (sin*i + cos*q)
// ============================================================
//sin*i
cm_dsp48e1 #(
    .C_DATA_WITH_A      (C_DATA_WITH     ),
    .C_DATA_WITH_B      (11              ),
    .C_DATA_WITH_C      (48              ),
    .C_DATA_WITH_D      (25              )
)
U2_cm_dsp48e1(
    .I_CLK              (I_sys_clk      ) , // clk
    .I_RST              (I_rst_in       ) , // RST
    .I_A                (I_data_in_i    ) , // [29:0] 
    .I_B                (S_sin_out      ) , // [17:0] 
    .I_C                (48'd0          ) , // [47:0] 
    .I_D                (25'd0          ) , // [24:0] 
    .I_PCIN             (48'd0          ) , // [47:0] 只能直连PCOUT
    .I_ALUMODE          (4'd0           ) , // [3:0] 
    .I_INMODE           (5'b00101       ) , // [4:0] 
    .I_OPMODE           (7'b0000101     ) , // [6:0] 
    .O_P                (               ) , // [47:0]
    .O_PCOUT            (S_pcout_sin_i  )   // [47:0] 只能直连PCIN
    );


//Pcin + cos*q
cm_dsp48e1 #(
    .C_DATA_WITH_A      (C_DATA_WITH     ),
    .C_DATA_WITH_B      (11              ),
    .C_DATA_WITH_C      (48              ),
    .C_DATA_WITH_D      (25              )
)
U3_cm_dsp48e1(
    .I_CLK              (I_sys_clk      ) , // clk
    .I_RST              (I_rst_in       ) , // RST
    .I_A                (S_data_in_q    ) , // [29:0] 
    .I_B                (S_cos_out_d    ) , // [17:0] 
    .I_C                (48'd0          ) , // [47:0] 
    .I_D                (25'd0          ) , // [24:0] 
    .I_PCIN             (S_pcout_sin_i  ) , // [47:0] 只能直连PCOUT
    .I_ALUMODE          (4'b0000        ) , // [3:0] 
    .I_INMODE           (5'b00101       ) , // [4:0] 
    .I_OPMODE           (7'b0010101     ) , // [6:0] 
    .O_P                (S_dsp_out_q    ) , // [47:0]
    .O_PCOUT            (               )   // [47:0] 只能直连PCIN
    );

最后四舍五入后输出:

/// 四合五入输出
always @(posedge I_sys_clk )
    if(I_rst_in)
        begin
            O_data_out_i <= 'd0;
            O_data_out_q <= 'd0;
        end
    else
        begin
            O_data_out_i <= S_dsp_out_i[10+:C_DATA_WITH] + S_dsp_out_i[9];
            O_data_out_q <= S_dsp_out_q[10+:C_DATA_WITH] + S_dsp_out_q[9];
        end


endmodule

对代码的详细讲解参考B站视频

【FPGA数字信号处理之verilog实现数字混频器】 https://www.bilibili.com/video/BV1hg411B7Rb/?share_source=copy_web&vd_source=9736f43bc2eebc284f4fbbe5805247a7


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21326

    浏览量

    593230
  • 数字信号处理

    关注

    15

    文章

    519

    浏览量

    45302
  • 混频器
    +关注

    关注

    10

    文章

    667

    浏览量

    45132

原文标题:FPGA数字信号处理之verilog实现混频器

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    数字信号处理DSP库文件的使用方法和功能实现

    本文首先介绍数字信号处理(DSP),是指将连续的模拟信号转换为不连续、离散的数字信号并进行处理以提取所需的
    的头像 发表于 04-03 14:09 1211次阅读
    <b class='flag-5'>数字信号</b><b class='flag-5'>处理</b>DSP库文件的使用方法和功能<b class='flag-5'>实现</b>

    双/三平衡混频器,如果LO不做谐波滤波处理,对混频后输出的IF性能有何影响?

    (square wave),这样能获得更好的互调指标。 我的问题是:双/三平衡混频器,如果LO不做谐波滤波处理,对混频后输出的IF性能有何影响?(IMD失真产物、高频phase noise?),谢谢
    发表于 01-10 06:22

    混频器属于什么调制方法?

    混频器属于什么调制方法? 混频器属于非线性调制方法,是一种电路设计技术,在广泛的通信和信号处理应用中使用。混频器主要用于将不同的
    的头像 发表于 11-06 10:26 415次阅读

    有源混频器和无源混频器的区别

    有源混频器和无源混频器是两种常见的混频器类型,它们在结构和工作原理上有一些区别。
    的头像 发表于 11-03 09:18 489次阅读

    数字信号处理fft的verilog应用程序

    在学习了数字信号处理之后,在底部使用verilog实现了FFT的应用
    发表于 09-28 06:49

    数字信号处理MATLAB版资料分享

    的核心内容。如果仅仅用数字滤波器代替某个系统中的模拟滤波,则还不能充分发挥数字技术的特长。事实上,对信号进行调制,滤波,变换.增强、压缩、检测、估计、识别等,都是
    发表于 09-28 06:34

    数字信号处理—理论、算法与实现

    与解调、反卷积、SVD、独立分量分析及同太民滤波等)、平稳随机信号的基本概念、经典功率谱估计、参数模型功率谱估计、数字信号处理中的有限字长问题及数字信号
    发表于 09-19 08:01

    数字信号处理FPGA实现

    FPGA正在掀起一场数字信号处理的变革。本书旨在讲解前端数字信号处理算法的高效实现。首先概述了当
    发表于 09-19 06:38

    数字信号处理器概论

    作为数字信号处理的一个实际任务就是要求能够快速、高效、实时完成处理任务,这就要通过通用或专用的数字信号处理器来完成。因此,
    的头像 发表于 08-07 16:58 684次阅读

    PNA网分测试混频器介绍

    混频器(Mixer)也可称为“变频器”或者“频率转换器”,可以将将输入信号的频率转换成另一个频率。如图所示,混频器有3个端口RF,IF和LO,其中两个为输入端口,一个为输出端口。混频器
    的头像 发表于 07-31 18:01 555次阅读
    PNA网分测试<b class='flag-5'>混频器</b>介绍

    浅谈混频器的输出信号

    混频器的输出信号取决于两个或更多输入信号的频率关系。混频器将输入信号进行混合,产生包含原始频率和它们之差的新频率成分。
    的头像 发表于 06-30 09:20 840次阅读

    IQ混频器的使用优势

    实现高精度:由于IQ混频器信号处理成正交的两路,可以实现信号相位和幅度的精确控制,并且可以通
    的头像 发表于 06-28 09:37 581次阅读

    FPGA数字信号处理:重写FIR逻辑以满足时序要求

    在上一篇文章中(FPGA数字信号处理Verilog 实现简单的 FIR 滤波器)演示了在 Veri
    的头像 发表于 06-09 09:39 610次阅读
    <b class='flag-5'>FPGA</b>的<b class='flag-5'>数字信号</b><b class='flag-5'>处理</b>:重写FIR逻辑以满足时序要求

    数字信号处理的基础知识

    本文是本系列的第一篇,参考杜勇老师的数字滤波器MATLAB和Verilog实现以及一些网文博客,更新顺序参考杜勇老师的书籍目录。本文主要介绍关于数字信号的一些基础知识。
    的头像 发表于 05-22 16:11 3432次阅读
    <b class='flag-5'>数字信号</b><b class='flag-5'>处理</b>的基础知识

    什么是无源混频器

    最常见的混频器类型是无源混频器。此类混频器有不同的设计样式,如单端、单平衡、双平衡和三平衡等。
    的头像 发表于 05-09 14:37 718次阅读