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

news/2024/10/31 3:21:17/

本文链接:https://blog.csdn.net/qq_46621272/article/details/125337119

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


文章目录

  • 前言
  • 一、 调频波调制
    • 1. fm_modulation_dds 模块逻辑框图
    • 2. fm_modulation_dds.v verilog 代码
  • 二、 调频波解调
    • 1. fm_demodulation_fir 模块逻辑框图
    • 2. fm_demodulation_fir.v verilog 代码
  • 三、 fm_modem_fir_testbench.v
  • 四、 FIR IP 设置
  • 五、 DDS IP 设置
    • 1. dds_compiler_phase IP设置
  • 六、 仿真时序波形图
    • 1. 激励文件信号波形图
    • 2. FM调频波调制模块信号波形图
    • 3. FM调频波解调模块信号波形图
  • 六、 综合布线后 FPGA 资源使用报告
  • 七、 相关 vivado 工程、IP 设置等详细文档连接,采用 Xilinx vivado 2017.4 版本
      • [XILINX FIR IP 详解、Verilog 源码、Vivado 工程](https://blog.csdn.net/qq_46621272/article/details/125292610)
      • [FIR 基础应用 - AM 调幅波调制解调(FIR 低通滤波)详细介绍](https://blog.csdn.net/qq_46621272/article/details/125334644)
      • [FIR 基础应用 - FM 调频波调制解调(FIR 低通滤波) 详细介绍](https://blog.csdn.net/qq_46621272/article/details/125337119)
      • [FIR 中级应用 - AM 调幅波调制解调(FIR + FIFO)详细介绍](https://blog.csdn.net/qq_46621272/article/details/125384724)
      • [FIR 高级应用 - AM 调幅波调制解调(FIR 低通滤波+重采样,FIR 高阶系数,FIR+FIFO ) 详细介绍](https://blog.csdn.net/qq_46621272/article/details/125385375)
      • [FIR 高级应用 - 多通道实验 (四个通道用一个 FIR IP,每通道用不同的系数) 详细介绍](https://blog.csdn.net/qq_46621272/article/details/125346332)
      • [FIR 高级应用 FIR Reload的使用) 详细介绍](https://blog.csdn.net/qq_46621272/article/details/125348908)
      • [AM 调幅波调制解调(FIR 低通滤波) vivado 工程文件下载](https://download.csdn.net/download/qq_46621272/85674733)
      • [FM 调频波调制解调(FIR 低通滤波) Vivado 工程文件下载](https://download.csdn.net/download/qq_46621272/85722410)
      • [AM 调幅波调制解调(FIR + FIFO) Vivado 工程文件下载](https://download.csdn.net/download/qq_46621272/85722449)
      • [AM 调幅波调制解调(FIR 低通滤波+重采样,FIR 高阶系数,FIR+FIFO ) Vivado 工程文件下载](https://download.csdn.net/download/qq_46621272/85722484)
      • [FIR 高级应用 - 多通道实验 Vivado 工程文件下载](https://download.csdn.net/download/qq_46621272/85722518)
      • [FIR 高级应用 FIR Reload 的使用 vivado 工程文件下载](https://download.csdn.net/download/qq_46621272/85722534)


前言

这是 XILINX FIR IP 详解、Verilog 源码、Vivado 工程 这篇文章的实验部分,用 FIR 低通滤波实现了调频波的解调输出。


一、 调频波调制

1. fm_modulation_dds 模块逻辑框图

在这里插入图片描述

2. fm_modulation_dds.v verilog 代码

//fm_modulation_dds.v
module	fm_modulation_dds
(output			m_axis_data_tvalid,input			m_axis_data_tready,output	[15:0]	m_axis_data_tdata,input			rst_n,input			clk
);parameter			PHASE_COEF = 6554;//100KHz reg signed	[15:0]	phase_cnt_r;wire signed	[15:0]	s_axis_phase_tdata_i;reg					s_axis_phase_tvalid_r;wire				s_axis_phase_tready_i;wire signed	[15:0]	phase_step_i;wire signed	[7:0]	dds_4khz_tdata_i;			//	4khz   正弦波	FM 调制信号wire				dds_4khz_tvalid_i;wire				dds_4khz_tready_i;wire signed	[15:0]	fm_tdata_i;					//	FM 调频波wire				fm_tvalid_i;wire				fm_tready_i;assign	phase_step_i 			= dds_4khz_tdata_i*16;assign	dds_4khz_tready_i		= s_axis_phase_tready_i;assign	s_axis_phase_tdata_i	= phase_cnt_r;always @(posedge clk)beginif(rst_n == 0 )s_axis_phase_tvalid_r	<= 0;else if(s_axis_phase_tready_i == 1)s_axis_phase_tvalid_r	<= dds_4khz_tvalid_i;endalways @(posedge clk)beginif(rst_n == 0 )beginphase_cnt_r	<= 0;endelse if(s_axis_phase_tready_i == 1 && dds_4khz_tvalid_i == 1)beginphase_cnt_r	<= phase_cnt_r + phase_step_i + PHASE_COEF;endend	dds_compiler_1m_4k dds1							// XILINX VIVADO DDS IP100MHz 时钟输入,4khz正弦波 8 位输出(.aclk				(clk),					// input wire aclk.aresetn			(rst_n),				// input wire aresetn.m_axis_data_tvalid	(dds_4khz_tvalid_i),	// output wire m_axis_data_tvalid.m_axis_data_tready	(dds_4khz_tready_i),	// input wire m_axis_data_tready.m_axis_data_tdata	(dds_4khz_tdata_i)		// output wire [7 : 0] m_axis_data_tdata);dds_compiler_phase dds2(.aclk				(clk),						// input wire aclk.aresetn			(rst_n),					// input wire aresetn.s_axis_phase_tvalid(s_axis_phase_tvalid_r),	// input wire s_axis_phase_tvalid.s_axis_phase_tready(s_axis_phase_tready_i),	// output wire s_axis_phase_tready.s_axis_phase_tdata	(s_axis_phase_tdata_i),		// input wire [15 : 0] s_axis_phase_tdata.m_axis_data_tvalid	(fm_tvalid_i),				// output wire m_axis_data_tvalid.m_axis_data_tready	(fm_tready_i),				// input wire m_axis_data_tready.m_axis_data_tdata	(fm_tdata_i)				// output wire [15 : 0] m_axis_data_tdata);assign	fm_tready_i			= m_axis_data_tready;assign	m_axis_data_tvalid	= fm_tvalid_i;assign	m_axis_data_tdata	= fm_tdata_i;endmodule

二、 调频波解调

1. fm_demodulation_fir 模块逻辑框图

在这里插入图片描述

2. fm_demodulation_fir.v verilog 代码

//fm_demodulation_fir.v
module	fm_demodulation_fir
(input					rst_n,input					clk,input					s_axis_data_tvalid,output					s_axis_data_tready,input	signed[15:0]	s_axis_data_tdata,output					m_axis_data_tvalid,input					m_axis_data_tready,output	signed[15:0]	m_axis_data_tdata
);reg signed	[15:0]	uf_data_r	= 0;reg signed	[15:0]	sv_data_r	= 0;reg					uf_valid_r	= 0;wire				uf_tready_i;reg 		[15:0]	abs_data_r	= 0;reg					abs_valid_r	= 0;wire				abs_tready_i;////////////////////////////////////////////////////////////////////////////////////always @(posedge clk)		beginif(rst_n == 0 )uf_valid_r	<= 0;else if(uf_tready_i == 1)uf_valid_r	<= s_axis_data_tvalid;endalways @(posedge clk)	//微分 dx/dt ,dt =一个时钟周期,dx=当前数据减去上个时钟的数据的差beginif(rst_n == 0 )beginuf_data_r	<= 0;sv_data_r	<= 0;endelse if(uf_tready_i == 1 && s_axis_data_tvalid == 1)beginsv_data_r	<= s_axis_data_tdata;				//将当前数据存起来uf_data_r	<= s_axis_data_tdata - sv_data_r;	//当前数据 - 上个时钟保存的数据endend
////////////////////////////////////////////////////////////////////////////////////always @(posedge clk)beginif(rst_n == 0 )abs_valid_r	<= 0;else if(abs_tready_i == 1)abs_valid_r	<= uf_valid_r;endalways @(posedge clk)	//绝对值beginif(rst_n == 0 )abs_data_r	<= 0;else if(abs_tready_i == 1 && uf_valid_r == 1)beginif(uf_data_r >= 0)abs_data_r	<= uf_data_r;elseabs_data_r	<= -uf_data_r;endend
////////////////////////////////////////////////////////////////////////////////////wire signed	[39:0]	fir_fm_tdata_i;wire				fir_fm_tvalid_i;wire				fir_fm_tready_i;assign	fir_fm_tready_i		= m_axis_data_tready;assign	m_axis_data_tdata	= fir_fm_tdata_i >>>19;assign	m_axis_data_tvalid	= fir_fm_tvalid_i;assign	s_axis_data_tready	= abs_tready_i;assign	uf_tready_i			= abs_tready_i;fir_compiler_lowpass_10k_30k_1m fm_fir_u1
(.aresetn			(rst_n),			// input wire aresetn.aclk				(clk),				// input wire aclk.s_axis_data_tvalid	(abs_valid_r),		// input wire s_axis_data_tvalid.s_axis_data_tready	(abs_tready_i),		// output wire s_axis_data_tready.s_axis_data_tdata	(abs_data_r),		// input wire [15 : 0] s_axis_data_tdata.m_axis_data_tvalid	(fir_fm_tvalid_i),	// output wire m_axis_data_tvalid.m_axis_data_tready	(fir_fm_tready_i),	// input wire m_axis_data_tready.m_axis_data_tdata	(fir_fm_tdata_i)	// output wire [31 : 0] m_axis_data_tdata
);
endmodule

三、 fm_modem_fir_testbench.v


///////////////////////////////////////////////////////////////////////`timescale 1ns / 100ps
//fm_modem_fir_testbench.v
module fm_modem_fir_testbench;reg			rst_n;
reg			clk;parameter CLK_PERIOD	= 1000;		//1MHzinitial	beginrst_n = 0;#(10 * CLK_PERIOD)rst_n = 1;#(3000 * CLK_PERIOD)$stop;
endinitialclk = 0;
always
beginclk = #(CLK_PERIOD/2.0) ~clk;
endwire signed	[15:0]	fm_mod_tdata;			//调频波数据,载波100KHz 正弦波,调制信号 4KHz 正弦波wire				fm_mod_tvalid;wire				fm_mod_tready;wire signed	[15:0]	fm_demod_tdata;			//经过解调还原的 4KHz 正弦波wire				fm_demod_tvalid;wire				fm_demod_tready=1;fm_modulation_dds	fm_u1					//调频波调制模块,生成 载波100KHz 正弦波,调制信号 4KHz 正弦波的调频信号(.clk				(clk),				//1MHz.rst_n				(rst_n),			//复位.m_axis_data_tdata	(fm_mod_tdata),		//调频波数据输出, output wire [16 : 0].m_axis_data_tvalid	(fm_mod_tvalid),.m_axis_data_tready	(fm_mod_tready));fm_demodulation_fir	fm_u2					//调频波解调模块,将调频波解调还原调制信号(.clk				(clk),				//1MHz.rst_n				(rst_n),			//复位.s_axis_data_tdata	(fm_mod_tdata),		//调频信号输入 intput wire [16 : 0].s_axis_data_tvalid	(fm_mod_tvalid),.s_axis_data_tready	(fm_mod_tready),.m_axis_data_tdata	(fm_demod_tdata),	//调频波解调数据输出, output wire [16 : 0].m_axis_data_tvalid	(fm_demod_tvalid),.m_axis_data_tready	(fm_demod_tready));endmodule

四、 FIR IP 设置

  • 和上篇文章 FIR 基础应用 - AM 调幅波调制解调(FIR 低通滤波) 的设置一样,系数文件也一样,请参考这篇文章 FIR IP 配置这一章节

五、 DDS IP 设置

  • dds_compiler_1m_4k IP设置和上篇文章 FIR 基础应用 - AM 调幅波调制解调(FIR 低通滤波) 的设置一样,请参考这篇文章 DDS IP 配置这一章节

1. dds_compiler_phase IP设置

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

六、 仿真时序波形图

1. 激励文件信号波形图

在这里插入图片描述

2. FM调频波调制模块信号波形图

在这里插入图片描述

3. FM调频波解调模块信号波形图

在这里插入图片描述

六、 综合布线后 FPGA 资源使用报告

在这里插入图片描述

七、 相关 vivado 工程、IP 设置等详细文档连接,采用 Xilinx vivado 2017.4 版本


http://www.ppmy.cn/news/470712.html

相关文章

地下停车场FM调频广播覆盖方案

地下停车场FM调频广播覆盖方案 北京海特伟业科技有限公司 文/任洪卓 发布时间&#xff1a;2022-06-05 一、项目需求 我国的调频广播传输采用88-108MHz频段&#xff0c;只能在直视和无阻挡的情况下传播&#xff0c;因此地下停车场接收调频广播信号很差&#xff0c;有些甚至…

C++ 教程(16)——字符串

C 字符串 C 提供了以下两种类型的字符串表示形式&#xff1a; C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言&#xff0c;并在 C 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此&#xff0c;一个以 null 结尾…

[转载]无线通信系统中的调制解调基础(一):AM和FM

原文地址&#xff1a;无线通信系统中的调制解调基础&#xff08;一&#xff09;&#xff1a;AM和FM 作者&#xff1a;逝者如云 第一部分解释了调幅&#xff08;AM&#xff09;和调频&#xff08;FM&#xff09;的基础&#xff0c;并阐述了优点和缺点。第二部分解析了频移键控&a…

北京调频(FM)无线广播发射频率/频道表 (转载)

发射频率(兆赫)节目省区县发射台名发射功率(千瓦)91.5 中国国际广播电台轻松调频北京市市辖区海淀区中央广播电视发射台1088.7 中国国际广播电台劲曲调频北京市市辖区海淀区中央广播电视发射台1090.5 中国国际广播电台环球资讯广播北京市市辖区海淀区中央广播电视发射台3100.6 …

【Matter】如何在Linux平台下测试Matter应用级通信(虚拟设备)

如何在Linux平台下测试Matter应用级通信(虚拟设备) 准备工作 1. 递归克隆Matter仓库 执行如下命令&#xff1a; git clone --recurse-submodules gitgithub.com:project-chip/connectedhomeip.git如果克隆过程中发生报错&#xff0c;请执行如下命令来同步子模块&#xff1a;…

【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 经典屏保

为了更好的阅读体检&#xff0c;可以查看我的算法学习博客恢复数字序列 题目描述 D V D DVD DVD机在视频输出时&#xff0c;为了保护电视显像管&#xff0c;在待机状态会显示"屏保动画”&#xff0c;如下图所示&#xff0c; D V D DVD DVD L o g o Logo Logo在屏幕内来回…

Flink将数据写入CSV文件后文件中没有数据

Flink中有一个过时的sink方法:writeAsCsv,这个方法是将数据写入CSV文件中,有时候我们会发现程序启动后,打开文件查看没有任何数据,日志信息中也没有任何报错,这里我们结合源码分析一下这个原因. 这里先看一下数据处理的代码 代码中我是使用的自定义数据源生产数据的方式,为了方…

红米note2能刷机没显示无服务器,我的红米note2彻底黑屏变砖了,进不了Fastboot和Recovery模式了,还能救回来吗?...

满意答案 mojsi 2020.03.09 采纳率&#xff1a;44% 等级&#xff1a;12 已帮助&#xff1a;7771人 小米2手机&#xff0c;进入recovery模式和fastboot模式的方法&#xff1a;recovery模式进入方式&#xff1a;关机按住音量上开机键recovery模式进入方式&#xff1a;关机按住…