基于 VIVADO 的 FM 调制解调(上)设计篇

这篇具有很好参考价值的文章主要介绍了基于 VIVADO 的 FM 调制解调(上)设计篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

        本文先简要介绍了频率调制(frequency modulation,FM,简称调频)的原理,然后对其进行方案设计,最后基于 VIVADO 2018.3 使用 Verilog 进行实现。

二、FM 原理

        角度调制(angle modulation)是已调波的总相角  随着基带信号  作某种变化的调制方式,它包括频率调制和相位调制。一般而言,角调信号的表达式为:

其中, 称为相角,它是随  变化的。

        频率调制(frequency modulation,FM,简称调频)的调制表达式可以下式表示:

基于 VIVADO 的 FM 调制解调(上)设计篇

其中, 称为频偏常数,单位 Hz/V。

基于 VIVADO 的 FM 调制解调(上)设计篇

三、参数设计

(1)调制参数

        时钟频率:1 MHz

        调制信号:4 kHz 正弦波

        载波频率:100 kHz

(2)解调参数

        解调参数主要是包络检波(低通滤波)器的参数配置,我们使用 Matlab 中的 filterDesigner 进行设计。滤波器可以选择等波纹的 FIR 低通滤波器,采样率设置为 1000 kHz,通带截止频率 10 kHz,阻带截止频率 30 kHz。

基于 VIVADO 的 FM 调制解调(上)设计篇

设计好后点击左侧边栏第三个框进行量化,选择定点模式,最后点击上方的 “ 目标 ” 生成 .coe 文件。

基于 VIVADO 的 FM 调制解调(上)设计篇

四、IP 核参数配置

(1)调制信号发生器

        调制信号使用 DDS IP 核产生正弦波数据,Configuration Option 选择 “ Phase Generator and SIN COS LUT ”,输入时钟设置 1 MHz,如下图所示。

基于 VIVADO 的 FM 调制解调(上)设计篇

由于调制信号的频率已固定为 4 kHz,因此这里的频率控制字(Phase Increment Programmabilit,相位增量可编程性)选择为 Fixed;相位控制字(Phase Offset Programmability,相位偏移可编程性)选择为 None;输出信号选择正弦波(Sine)。

基于 VIVADO 的 FM 调制解调(上)设计篇

点击 Next 进入下一页配置,选上 Output TREADY 和 ARESETn。

基于 VIVADO 的 FM 调制解调(上)设计篇

然后在输出频率处选择 4 kHz,即 0.004 MHz。

基于 VIVADO 的 FM 调制解调(上)设计篇

最后 Generate IP 即可。

(2)已调信号发生器

        已调 FM 信号也用 DDS IP 核产生,Configuration Option 选择 “ SIN COS LUT only ”,其余默认,如下图所示。

基于 VIVADO 的 FM 调制解调(上)设计篇

 进入下一页后选择输出模式为正弦波(Sine)。

基于 VIVADO 的 FM 调制解调(上)设计篇

 再进入下一页,将 Output TREADY 和 ARESETn 选上。

基于 VIVADO 的 FM 调制解调(上)设计篇

(3)低通滤波器

        采用包络检波法进行解调,我们通过 FIR IP 核(FIR Compiler)来实现低通滤波提取包络信息。在 IP 核中选择导入 COE File 的模式,并在下方的 “ Coefficient File ” 处导入 .coe 文件。

基于 VIVADO 的 FM 调制解调(上)设计篇

 下面三页的 Channel Specification、Implementation 和 Detail Implementation 均保存默认参数。

基于 VIVADO 的 FM 调制解调(上)设计篇

基于 VIVADO 的 FM 调制解调(上)设计篇

基于 VIVADO 的 FM 调制解调(上)设计篇

 在最后的 Inerface 页面上,勾选上 Output TREADY 和 ARESETn。

基于 VIVADO 的 FM 调制解调(上)设计篇

五、代码设计

(1)顶层代码

        顶层代码对调制和解调两大模块进行连线,这里是以直连线代替了无线信道。其中,调制模块中所需的相位控制字 POFF 也可由顶层进行参数配置,以满足用户的不同需求。

`timescale 1ns / 1ps
//
// Company: UESTC
// Engineer: chylinne
// 
// Create Date: 2022/08/15 14:17:30
// Design Name: fm
// Module Name: fm_top
// Project Name: fm
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module fm_top # (

    /* Phase Offset Programmability
    poff = 2^N * f_carrier
         = 2^16 * 100 kHz
         = 2^16 * 0.1 MHz
         = 6554
    */

    parameter   POFF = 'd6554  //100KHz
)(
    input           rst_n,
    input           clk
);
    
	wire signed	[15:0]  fm_mod_data;
	wire                fm_mod_valid;
	wire                fm_mod_ready;

	wire signed	[15:0]  fm_demod_data;
	wire                fm_demod_valid;
	wire                fm_demod_ready = 1'b1;

    fm_modulation # (
        .POFF(POFF)
    ) u_fm_modulation (
        .clk(clk),
        .rst_n(rst_n),
        
        .fm_mod_data(fm_mod_data),
        .fm_mod_valid(fm_mod_valid),
        .fm_mod_ready(fm_mod_ready)
    );

    fm_demodulation	u_fm_demodulation (
        .clk(clk),
        .rst_n(rst_n),

        .fm_mod_data(fm_mod_data),
        .fm_mod_valid(fm_mod_valid),
        .fm_mod_ready(fm_mod_ready),

        .fm_demod_data(fm_demod_data),
        .fm_demod_valid(fm_demod_valid),
        .fm_demod_ready(fm_demod_ready)
    );

endmodule

(2)调制模块

        调制模块较简单,通过调用 2 个 DDS IP 核实现调制信号(正弦波)和已调信号(FM 信号)的产生,重点在于需要通过相位计数器和相位控制字来计算出正弦波数据对应的相位信息。

`timescale 1ns / 1ps
//
// Company: UESTC
// Engineer: chylinne
// 
// Create Date: 2022/08/15 13:45:42
// Design Name: fm
// Module Name: fm_modulation
// Project Name: fm
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module fm_modulation # (

    /* Phase Offset Programmability
    poff = 2^N * f_carrier
         = 2^16 * 100 kHz
         = 2^16 * 0.1 MHz
         = 6554
    */

    parameter   POFF = 'd6554  //100KHz

)(
    input                 clk,
    input                 rst_n,

    input                 fm_mod_ready,
    output                fm_mod_valid,
    output signed [15:0]  fm_mod_data
);

    reg  signed [15:0]  phase_cnt;

    wire signed	[15:0]  phase_data;
    reg                 phase_valid;
    wire                phase_ready;
    wire signed	[15:0]  phase_add;

    wire signed	[7:0]   sine_signal; // sine modulate signal
    wire                sine_valid;
    wire                sine_ready;

    assign	phase_add   =  sine_signal << 4; // multiply 16
    assign	sine_ready  =  phase_ready;
    assign	phase_data  =  phase_cnt;
    
    always @(posedge clk)
    begin
        if(!rst_n)
            phase_valid <= 0;
        else if(phase_ready)
            phase_valid <= sine_valid;
    end

    always @(posedge clk)
    begin
        if(!rst_n)
        begin
            phase_cnt <= 0;
        end
        else if(phase_ready && sine_valid)
        begin
            phase_cnt <= phase_cnt + phase_add + POFF;
        end
    end

    dds_compiler_sine dds_1 (
        .aclk               (clk),              // input wire aclk
        .aresetn            (rst_n),            // input wire aresetn
        .m_axis_data_tvalid (sine_valid),       // output wire m_axis_data_tvalid
        .m_axis_data_tready (sine_ready),       // input wire m_axis_data_tready
        .m_axis_data_tdata  (sine_signal)       // output wire [7 : 0] m_axis_data_tdata
    );
	
	dds_compiler_fm dds_2 (
		.aclk               (clk),              // input wire aclk
		.aresetn            (rst_n),            // input wire aresetn
		.s_axis_phase_tvalid(phase_valid),      // input wire s_axis_phase_tvalid
		.s_axis_phase_tready(phase_ready),      // output wire s_axis_phase_tready
		.s_axis_phase_tdata (phase_data),       // input wire [15 : 0] s_axis_phase_tdata
		.m_axis_data_tvalid (fm_mod_valid),     // output wire m_axis_data_tvalid
		.m_axis_data_tready (fm_mod_ready),     // input wire m_axis_data_tready
		.m_axis_data_tdata  (fm_mod_data)       // output wire [15 : 0] m_axis_data_tdata
	);

endmodule

(3)解调模块

        解调模块则是通过 FIR 低通滤波器的 IP 核实现包络提取。文章来源地址https://www.toymoban.com/news/detail-405759.html

`timescale 1ns / 1ps
//
// Company: UESTC
// Engineer: chylinne
// 
// Create Date: 2022/08/15 13:47:23
// Design Name: fm
// Module Name: fm_demodulation
// Project Name: fm
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module fm_demodulation (
    input                   clk,
    input                   rst_n,

    output                  fm_mod_ready,
    input                   fm_mod_valid,
	input  signed [15:0]    fm_mod_data,

    input                   fm_demod_ready,
    output                  fm_demod_valid,
    output signed [15:0]    fm_demod_data
);

    reg  signed [15:0]  mem_data = 0;

    reg  signed [15:0]  dif_data = 0;
    reg                 dif_valid = 0;
    wire                dif_ready;

    reg         [15:0]  abs_data = 0;
    reg                 abs_valid = 0;
    wire                abs_ready;

    wire signed	[39:0]  fir_data;
    wire                fir_valid;
    wire                fir_ready;
	
    always @(posedge clk)		
    begin
        if(!rst_n)
            dif_valid <= 0;
        else
            dif_valid <= (dif_ready) ? fm_mod_valid : dif_valid;
    end

    /* Calculate difference data

    dx/dt
    dt is the clock period.
    dx is the difference of data in current clock and data in last clock.
    */
    always @(posedge clk)
    begin
        if(!rst_n)
        begin
            mem_data <= 0;
            dif_data <= 0;
        end
        else begin
            if(dif_ready && fm_mod_valid)
            begin
                mem_data <= fm_mod_data; // Save the data in current clock
                dif_data <= fm_mod_data - mem_data; // data in current clock minus data in last clock
            end
            else ;
        end
    end
    
    always @(posedge clk)
    begin
        if(!rst_n)
            abs_valid <= 0;
        else 
            abs_valid <= (abs_ready) ? dif_valid : abs_valid;
    end
    
    // Calculate absolute value
    always @(posedge clk)
    begin
        if(!rst_n)
            abs_data <= 0;
        else begin
            if(abs_ready && dif_valid)
            begin
                if(dif_data >= 0)
                    abs_data <= dif_data;
                else
                    abs_data <= -dif_data;
            end
            else ;
        end
    end

    assign	fir_ready       = fm_demod_ready;
    assign	fm_demod_data   = fir_data >>> 19;
    assign	fm_demod_valid  = fir_valid;
    assign	fm_mod_ready    = abs_ready;
    assign	dif_ready       = abs_ready;

    // FIR lowpass filter
    fir_compiler_lowpass fir_1 (
        .aresetn            (rst_n),        // input wire aresetn
        .aclk               (clk),          // input wire aclk
        .s_axis_data_tvalid (abs_valid),    // input wire s_axis_data_tvalid
        .s_axis_data_tready (abs_ready),    // output wire s_axis_data_tready
        .s_axis_data_tdata  (abs_data),     // input wire [15 : 0] s_axis_data_tdata
        .m_axis_data_tvalid (fir_valid),    // output wire m_axis_data_tvalid
        .m_axis_data_tready (fir_ready),    // input wire m_axis_data_tready
        .m_axis_data_tdata  (fir_data)      // output wire [31 : 0] m_axis_data_tdata
    );

endmodule

到了这里,关于基于 VIVADO 的 FM 调制解调(上)设计篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 通信原理与MATLAB(五):FM的调制解调

    通信原理与MATLAB(五):FM的调制解调

    FM是频率调制,是用基带信号控制载波的频率,其实现原理如下图所示,基带信号经过积分器,然后和载波信号一起输入给调相器,基带信号控制载波的频率,实现FM的调制。 FM的解调原理如下图所示,FM信号经过信道传输之后,通过鉴频器变成调幅调频波,然后经过移相器,

    2024年02月08日
    浏览(8)
  • Gnuradio 和 USRP 实现FM的调制与解调

    Gnuradio 和 USRP 实现FM的调制与解调

    1. 硬件设备:HM B200mini; 天线 2. 软件环境: ubuntu 20.04; gnuradio 3.8; uhd 4.0; a. UHD: USRP Source USRP Source 块将通过在选定的天线上以特定频率、采样率和增益采样RF信号来产生基带样本。 b. Ratinal Resampler 因为USRP速率不是音频接收器速率的整数倍, 所以这里需要进行重采样。 c. WBFM Rec

    2024年02月12日
    浏览(9)
  • 【通信原理(含matlab程序)】实验二:FM的调制和解调

    【通信原理(含matlab程序)】实验二:FM的调制和解调

    💥💥💞💞欢迎来到本博客❤️❤️💥💥 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识,如果大家喜欢,别忘点个赞加个关注哦,让我们一起共同进步~ 理解FM基本原理、FM信号时域和频域主要特点; 理解FM信号调制和解调的实现方法; 掌握matlab程序

    2024年02月08日
    浏览(31)
  • FIR 基础应用 - FM 调频波调制解调(FIR 低通滤波)

    FIR 基础应用 - FM 调频波调制解调(FIR 低通滤波)

    本文链接:https://blog.csdn.net/qq_46621272/article/details/125337119 FIR 基础应用 - FM 调频波调制解调(FIR 低通滤波) 这是 XILINX FIR IP 详解、Verilog 源码、Vivado 工程 这篇文章的实验部分,用 FIR 低通滤波实现了调频波的解调输出。 和上篇文章 FIR 基础应用 - AM 调幅波调制解调(FIR 低通滤波

    2024年02月08日
    浏览(9)
  • 基于FPGA的FM信号解调

    基于FPGA的FM信号解调

    这是本人第一次写博客,写的不好请多多担待。 本次实验是将一个已知的FM信号通过FPGA进行解调,解调出波形并进行FFT得到调制频率fm,并且每一步都通过MATLAB进行波形的验证。 已知FM信号的载波频率fc为22MHZ,调制信号频率fm为8KHZ,采样率为50MHZ,在MATLAB中采样20000个点,位

    2023年04月15日
    浏览(5)
  • 【FPGA基础】基于PWM脉宽调制的呼吸灯设计(Vivado)

    【FPGA基础】基于PWM脉宽调制的呼吸灯设计(Vivado)

    软件:Vivado2019.1 硬件:Zynq7010 仿真:Vivado Simulator 众所周知,灯的亮度和加在其两端的电压有关。电压越高,亮度越亮,反之越暗。 于是,设计一个呼吸灯就变得很简单了。让IO的输出电平由低到高,再有高到底有规律的变化,就能达到呼吸效果。 现在问题来了,IO的输出电

    2024年02月07日
    浏览(22)
  • 基于FPGA的QPSK调制解调-------(1)QPSK调制技术的原理

    基于FPGA的QPSK调制解调-------(1)QPSK调制技术的原理

    QPSK(正交相移键控)是M=4的MPSK一种,也可叫做四进制相移键控。即有四个不同相位的状态,每个码元需要传输2bit的数字信息,可由00、01、11、10组合来对应表示四个不同的相位0、pi/2、pi、3pi/2或pi/4、3pi/4、5pi/4、7pi/4。 由 QPSK调制原理框图如图所示:        首先将输入的数

    2024年02月04日
    浏览(9)
  • 基于FPGA的2FSK调制解调系统

    基于FPGA的2FSK调制解调系统

            FSK作为数字通信中不可或缺的一种调制方式,其具有抗干扰能力强,不受信道参数的影响的优点,为此,设计合适的FSK调制解调系统便具有重要意义。   该系统产生主要分为三个步骤:         产生方式:通过matlab软件编程生成一个.mif文件,存放正弦波一个周期

    2024年02月03日
    浏览(13)
  • 基于FPGA的FSK调制解调系统verilog开发

    基于FPGA的FSK调制解调系统verilog开发

    目录 1.算法仿真效果 2.verilog核心程序 3.算法涉及理论知识概要 4.完整verilog VIVADO2019.2仿真结果如下:       频移键控是利用载波的频率变化来传递数字信息。数字频率调制是数据通信中使用较 早的一种通信方式,由于这种调制解调方式容易实现,抗噪声和抗衰减性能较强,

    2024年02月05日
    浏览(13)
  • 【USRP】调制解调系列7:GMSK、MSK、基于labview的实现

    【USRP】调制解调系列7:GMSK、MSK、基于labview的实现

    在数字调制中,最小频移键控(Minimum-Shift Keying,缩写:MSK)是一种连续相位的频移键控方式,在1950年代末和1960年代产生。与偏移四相相移键控(OQPSK)类似,MSK同样将正交路基带信号相对于同相路基带信号延时符号间隔的一半,从而消除了已调信号中180°相位突变的现象。

    2024年02月11日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包