数字信号处理----数字上变频和下变频都FPGA实现

本文介绍了数字上变频器(DUC)和数字下变频器(DDC)在通信系统中的应用,阐述了它们的基本原理,并详细说明了如何在FPGA中实现DUC和DDC,包括DDS产生、乘法模块、FIR滤波等步骤。通过1MHz和5MHz的Output Frequency进行仿真,展示了FPGA实现的数字上下变频过程。
摘要由CSDN通过智能技术生成

一、 任务介绍

数字上变频器(DUC)和数字下变频器(DDC)广泛应用于通信系统,用于信号采样速率的转换。当信号从基带转换至中频( IF )带,需要使用数字上变频器。而数字下变频器是用于将信号从中频( IF )带转换为基带。DUC和DDC通常包括使用混频器进行频率转换,此外还有采样率转换。DUC或DDC的结构主要取决于所需要的转换率。例如,WiMAX (全球互通微波接入)系统典型的转换率为8—10阶。对于如此低的转换率,DUC和DDC只需采用FIR滤波器架构。如果需要更高的转换率,DDC / DUC结构中需要使用级联积分梳状(CIC)滤波器。

二、基本原理

2.1 数字上变频和数字下变频的基本原理



在这里插入图片描述

2.2 数字上变频(Digital Up Conversion,DUC)

以余弦信号的上下变频为例,余弦信号经过正交变频后,将信号调制到一个高频部分:

第二部分图片来源:(https://blog.csdn.net/qq_41332806/article/details/108457397)

在这里插入图片描述
在这里插入图片描述

2.3 数字下变频(Direct Digital Controller,DDC)

DDC即在数字系统中对信号进行下变频,实现从射频(中频)信号到基带信号的转变。用一个严格同频同相的载波,得到一个高频分量和低频分量,用一个低通滤波器对信号进行滤波即可将信号解调出来。

图片为网上资料,若是侵权,请联系博主进行删除
DUC & DDC
在这里插入图片描述

三、基于FPGA实现DUC&DDC

3.1数字上下变频部分

FPGA实现过程基于实数形式的信号流图,主要涉及到DDS产生两路正交本振,ROM存储待下变频信号,乘法模块,FIR滤波,时域抽取等,大部分有现成IP核可供调用。

本次Output Frequency使用 1MHz 与 5MHz。

3.1.1相关IP核配置(未出现的页面使用默认设置)

1.DDS Compiler(6.0)
在这里插入图片描述
2.Multiplier(12.0)
根据输入进来的A & B 调整 Input Option,不同的输入调整不同的值。
在这里插入图片描述
在这里插入图片描述

3.Adder/Subtracter(12.0)
在这里插入图片描述
在Control 页面 将 Clock Enable(CE) 取消勾选。
4.slice(1.0)
---------------截频
在这里插入图片描述
5.FIR Compiler(7.2)
滤波部分
在这里插入图片描述
选择 COE File,配置Coefficient File,其中.coe文件在代码区;打开Channels Specification 配置Input Sampling Frequency 和Clock Frequency 分别为 100 和 100,其他设置默认。

veirilog HDL 代码:

//Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.
//--------------------------------------------------------------------------------
//Tool Version: Vivado v.2020.2 (win64) Build 3064766 Wed Nov 18 09:12:45 MST 2020
//Date        : Tue Mar  1 14:42:00 2022
//Host        : DESKTOP-CGJL7H3 running 64-bit major release  (build 9200)
//Command     : generate_target DDC_DUC_wrapper.bd
//Design      : DDC_DUC_wrapper
//Purpose     : IP block netlist
//--------------------------------------------------------------------------------
`timescale 1 ps / 1 ps

module DDC_DUC_wrapper
   (P_0,
    P_1,
    P_2,
    P_3,
    S_cos6MHz,
    aclk_0,
    cos_1MHz,
    cos_5MHz,
    fir_out_data,
    fir_out_data_1,
    s_axis_data_tvalid_0,
    s_axis_data_tvalid_1,
    sin_1MHz,
    sin_5MHz);
  output [31:0]P_0;
  output [31:0]P_1;
  output [47:0]P_2;
  output [47:0]P_3;
  output [31:0]S_cos6MHz;
  input aclk_0;
  output [15:0]cos_1MHz;
  output [15:0]cos_5MHz;
  output [39:0]fir_out_data;
  output [39:0]fir_out_data_1;
  input s_axis_data_tvalid_0;
  input s_axis_data_tvalid_1;
  output [15:0]sin_1MHz;
  output [15:0]sin_5MHz;

  wire [31:0]P_0;
  wire [31:0]P_1;
  wire [47:0]P_2;
  wire [47:0]P_3;
  wire [31:0]S_cos6MHz;
  wire aclk_0;
  wire [15:0]cos_1MHz;
  wire [15:0]cos_5MHz;
  wire [39:0]fir_out_data;
  wire [39:0]fir_out_data_1;
  wire s_axis_data_tvalid_0;
  wire s_axis_data_tvalid_1;
  wire [15:0]sin_1MHz;
  wire [15:0]sin_5MHz;

  DDC_DUC DDC_DUC_i
       (.P_0(P_0),
        .P_1(P_1),
        .P_2(P_2),
        .P_3(P_3),
        .S_cos6MHz(S_cos6MHz),
        .aclk_0(aclk_0),
        .cos_1MHz(cos_1MHz),
        .cos_5MHz(cos_5MHz),
        .fir_out_data(fir_out_data),
        .fir_out_data_1(fir_out_data_1),
        .s_axis_data_tvalid_0(s_axis_data_tvalid_0),
        .s_axis_data_tvalid_1(s_axis_data_tvalid_1),
        .sin_1MHz(sin_1MHz),
        .sin_5MHz(sin_5MHz));
endmodule

仿真:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/03/01 14:37:41
// Design Name:Born_toward 
// Module Name: dds2_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module dds_duc_2_tb();
  reg aclk_0;
  reg s_axis_data_tvalid_0;
  reg s_axis_data_tvalid_1;
  wire [15:0]cos_1MHz;
  wire [15:0]sin_1MHz;
  wire [15:0]cos_5MHz; 
  wire [15:0]sin_5MHz; 
  wire [31:0]P_0;       //cos1MHz*cos5MHz
  wire [31:0]P_1;       //sin1MHz*sin5MHz
  wire [31:0]S_cos6MHz; //cos(1+5) MHz
  wire [47:0]P_2;       //cos(1+5)MHz * cos5MHz
  wire [47:0]P_3;       //sin(1+5)MHz * sin5MHz
  wire [39:0]fir_out_data;      //滤波后的I路 -> cos(1+5)MHz * cos5MHz
  wire [39:0]fir_out_data_1;    //滤波后的Q路 -> sin(1+5)MHz * sin5MHz

initial begin
    aclk_0 = 0;
    s_axis_data_tvalid_0 = 1'b1;    // 此外为了方便接受数据,此处将准备接受数据标志位s_axis_data_tvalid一直置为1
    s_axis_data_tvalid_1 = 1'b1;    // 此外为了方便接受数据,此处将准备接受数据标志位s_axis_data_tvalid_1一直置为1
    
    #500000;
    $stop;
end

always #5 aclk_0 = ~aclk_0;     //10ns 周期 100MHz

DDC_DUC_wrapper DDC_DUC_wrapper_A
       (.P_0(P_0),
        .P_1(P_1),
        .P_2(P_2),
        .P_3(P_3),
        .S_cos6MHz(S_cos6MHz),
        .aclk_0(aclk_0),
        .cos_1MHz(cos_1MHz),
        .cos_5MHz(cos_5MHz),
        .fir_out_data(fir_out_data),
        .fir_out_data_1(fir_out_data_1),
        .s_axis_data_tvalid_0(s_axis_data_tvalid_0),
        .s_axis_data_tvalid_1(s_axis_data_tvalid_1),
        .sin_1MHz(sin_1MHz),
        .sin_5MHz(sin_5MHz));
endmodule

FIR_BPF_99_1_5M.coe 文件:

Radix=16;
Coefficient_Width=16;
CoefData=0000 0001 0003 0005 0008 0009 0006 fffe ffef ffd8 ffba ff98 ff76 ff5b ff4e ff57 ff7f ffcb 003e 00d5 0187 0244 02f7 0385 03cf 03b8 0325 0206 0056 fe21 fb87 f8ba f601 f3b0 f225 f1be f2d5 f5af fa7b 0144 09f2 1442 1fcc 2c06 384e 43f4 4e49 56aa 5c92 5f9f 5f9f 5c92 56aa 4e49 43f4 384e 2c06 1fcc 1442 09f2 0144 fa7b f5af f2d5 f1be f225 f3b0 f601 f8ba fb87 fe21 0056 0206 0325 03b8 03cf 0385 02f7 0244 0187 00d5 003e ffcb ff7f ff57 ff4e ff5b ff76 ff98 ffba ffd8 ffef fffe 0006 0009 0008 0005 0003 0001 0000;

3.2 FPGA仿真波形

基于vivado run simulation 仿真实现:
在这里插入图片描述
在这里插入图片描述
Block Design:
在这里插入图片描述

四、参考文献

[1] 无线通信的MATLAB和FPGA实现 / 西瑞克斯(北京)通信设备有限公司编著.——北京:人民邮电出版社,2009.6
源工程文件已上传至
https://download.csdn.net/download/Born_toward/86512126?spm=1001.2014.3001.5501

  • 47
    点赞
  • 558
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 42
    评论
### 回答1: FPGA (Field Programmable Gate Array) 是一种可编程逻辑芯片,可以实现各种数字系统的功能。数字下变频是指对数字信号的采样率进行调整,以改变信号的频率。在 FPGA 中,通过使用 Vivado 工具进行设计和编程,可以实现数字下变频。 在 Vivado 中,我们可以使用 Clocking Wizard 模块来生成时钟信号,从而实现数字下变频。首先需要确定目标频率和 FPGA 的主频,然后通过设置参数和引脚分配,生成对应的时钟模块。时钟模块的输出频率可以根据需要进行调整,以实现数字下变频的功能。 另外,我们也可以使用 Phase-Locked Loop (PLL) 模块来实现数字下变频。PLL 可以将一个参考时钟和一个输出时钟进行同步,从而实现频率的转换。在 Vivado 中,可以通过添加 PLL 模块并设置参数来实现数字下变频。 总之,使用 Vivado 工具进行 FPGA 数字下变频的设计和实现是一项非常有意义和实用的技术。通过合理设置参数和引脚,可以实现不同频率范围内的数字信号处理和变换,为数字系统的发展和优化提供了有效的手段。 ### 回答2: FPGA是一种可编程逻辑器件,能够实现各种复杂的数字电路功能。在数字电路设计中,上下变频是一个比较常见的需求,可以用来实现音频处理、数字信号处理等各种应用。 在FPGA中,可以利用Vivado工具来进行数字下变频的设计。首先,需要使用Verilog或VHDL等高级硬件描述语言来编写设计代码,然后使用Vivado工具进行综合、布局、布线等操作,生成最终的可编程硬件电路。在设计中需要注意时钟频率、输入输出数据格式等问题,并进行仿真和调试以确保设计的正确性和稳定性。 FPGA数字下变频设计可以使用分频器、相位锁定环PLL等技术来实现。通过对时钟信号进行分频、加减等操作,可以实现数字信号的上下变频,具有较高的灵活性和可调节性。在音频处理、无线通信等领域有广泛的应用。 ### 回答3: FPGA是一种可编程逻辑器件,它可以用来实现各种数字电路功能。数字下变频是指将数字信号的频率进行调节,可以用于实现音频处理、电力控制等应用。Vivado则是一款FPGA设计工具,它可以帮助设计人员完成FPGA电路的设计、仿真和实现。 在Vivado中,数字下变频可以通过使用时钟管理IP核实现。时钟管理IP核可以为FPGA设计提供可编程的时钟分频器和PLL(锁相环)功能,从而实现对时钟频率的控制。设计人员可以根据应用需求选择不同的时钟管理IP核,以实现数字下变频的功能。 使用Vivado进行数字下变频设计时,需要进行以下步骤: 1. 创建一个新的工程,选择目标FPGA设备。 2. 设计数字电路,并添加时钟管理IP核。 3. 根据需求设置时钟频率,进行仿真和验证。 4. 生成RTL代码和比特流文件,进行综合和实现。 5. 下载比特流文件到FPGA设备中,进行测试和验证。 综上所述,Vivado是一款强大的FPGA设计工具,可以用于实现数字下变频等各种数字电路设计。设计人员可以通过选用合适的时钟管理IP核、设定时钟频率等方式,实现数字下变频的应用需求。
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Born_toward

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值