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
    +关注

    关注

    1664

    文章

    22502

    浏览量

    639180
  • 数字信号处理

    关注

    16

    文章

    580

    浏览量

    47896
  • 混频器
    +关注

    关注

    11

    文章

    885

    浏览量

    50085

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LTC5593:高性能双路下变频混频器的卓越

    LTC5593:高性能双路下变频混频器的卓越选 在无线通信和微波系统的设计中,混频器作为核心组件之一,其性能直接影响着整个系统的表现。今天,我们就来深入了解一款高性能的双路下变频混频器
    的头像 发表于 04-24 17:40 137次阅读

    LTC5562:低功耗宽带有源混频器的卓越

    LTC5562:低功耗宽带有源混频器的卓越选 在电子设计领域,混频器是至关重要的组件,它在信号处理和通信系统中扮演着关键角色。今天,我们来
    的头像 发表于 04-24 17:15 153次阅读

    LTC5553:高性能微波混频器的卓越

    LTC5553:高性能微波混频器的卓越选 在微波领域,混频器实现频率转换的关键器件,其性能直接影响到整个系统的性能表现。今天,我们就来深入了解一款高性能的微波
    的头像 发表于 04-24 17:00 216次阅读

    LTC5548:高性能微波混频器的卓越

    LTC5548:高性能微波混频器的卓越选 在微波通信和雷达系统的设计中,混频器是至关重要的组件,它直接影响着系统的性能和稳定性。今天,我们就来深入了解一款高性能的微波混频器——LTC
    的头像 发表于 04-24 16:55 205次阅读

    LT5579:高性能上变频混频器的卓越

    下载: LT5579.pdf 一、产品概述 LT5579是一款专为1.5GHz至3.8GHz频率范围优化的高性能上变频混频器。它具有诸多出色的特性,为各类无线通信应用提供了强大的支持。 1. 产品特性 高输出IP3 :在2.14GHz时,输出IP3高达+27.3dBm,这意味着它能够
    的头像 发表于 04-24 16:55 226次阅读

    LT5527:高性能下变频混频器的卓越

    LT5527:高性能下变频混频器的卓越选 在无线通信领域,混频器作为关键的射频前端器件,其性能直接影响着整个系统的表现。今天,我们就来深入探讨一下 Linear Technology 公司
    的头像 发表于 04-24 16:40 139次阅读

    LT5525:高性能低功耗下变频混频器的卓越

    LT5525:高性能低功耗下变频混频器的卓越选 在电子工程领域,混频器是射频系统中至关重要的组件,其性能直接影响到整个系统的信号处理能力。
    的头像 发表于 04-24 16:40 148次阅读

    LT5521:高性能线性混频器的卓越

    LT5521:高性能线性混频器的卓越选 在电子工程师的设计工作中,混频器是射频系统里极为关键的组件。今天就来深入探讨一款高性能的线性混频器——LT5521,看看它有哪些独特之处,能为
    的头像 发表于 04-24 16:35 135次阅读

    探索 HMC - MDB218 GaAs MMIC 亚谐波 IRM 混频器:54 - 64 GHz 领域的卓越

    探索 HMC - MDB218 GaAs MMIC 亚谐波 IRM 混频器:54 - 64 GHz 领域的卓越选 在高频电子设计领域,混频器是至关重要的组件,它能实现
    的头像 发表于 04-24 14:30 79次阅读

    HMC - MDB171 GaAs MMIC I/Q 混频器:35 - 45 GHz 频段的卓越

    HMC - MDB171 GaAs MMIC I/Q 混频器:35 - 45 GHz 频段的卓越选 在高频电子设计领域,混频器是至关重要的元件,它能够实现
    的头像 发表于 04-24 14:30 78次阅读

    HMC - MDB172 GaAs MMIC I/Q混频器:19 - 33 GHz的理想

    应用场景 HMC - MDB172具有广泛的应用场景,适用于多种通信和雷达系统: 点到点无线电 :在点到点的通信链路中,该混频器能够高效地处理信号,确保信号的稳定传输。
    的头像 发表于 04-24 14:30 74次阅读

    HMC - C014 GaAs MMIC 混频器模块:16 - 32 GHz 频段的理想

    HMC - C014 GaAs MMIC 混频器模块:16 - 32 GHz 频段的理想选 在电子工程领域,混频器作为重要的射频器件,广泛应用于各种通信和雷达系统中。今天我们要介绍的 HMC
    的头像 发表于 04-23 17:55 927次阅读

    HMC339 GaAs MMIC亚谐波泵浦混频器:33 - 42 GHz的卓越

    HMC339 GaAs MMIC亚谐波泵浦混频器:33 - 42 GHz的卓越选 在微波和通信领域,混频器实现信号频率转换的关键器件。今
    的头像 发表于 04-23 16:35 51次阅读

    IQ混频器为何能抑制镜像频率

    IQ混频器是一种基于正交架构的混频器,通过将输入信号分解为同相(I)和正交(Q)两路信号,并分别进行混频运算,
    发表于 09-08 09:43

    数字信号处理的基本组成及其特点?

    的以数字信号处理器为核心部件的数字信号处理系统框图,此系统既可处理数字信号,也可
    的头像 发表于 06-18 09:02 1534次阅读
    <b class='flag-5'>数字信号</b><b class='flag-5'>处理</b>的基本组成及其特点?