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

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

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

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



前言

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


一、 调频波调制

1. fm_modulation_dds 模块逻辑框图

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

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)
	begin
		if(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;
	end

	always @(posedge clk)
	begin
		if(rst_n == 0 )
		begin
			phase_cnt_r	<= 0;
		end
		else if(s_axis_phase_tready_i == 1 && dds_4khz_tvalid_i == 1)
		begin
			phase_cnt_r	<= phase_cnt_r + phase_step_i + PHASE_COEF;
		end
	end	
	
	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 模块逻辑框图

FIR 基础应用 - FM 调频波调制解调(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)		
	begin
		if(rst_n == 0 )
			uf_valid_r	<= 0;
		else if(uf_tready_i == 1)
			uf_valid_r	<= s_axis_data_tvalid;
	end
	
	always @(posedge clk)	//微分 dx/dt ,dt =一个时钟周期,dx=当前数据减去上个时钟的数据的差
	begin
		if(rst_n == 0 )
		begin
			uf_data_r	<= 0;
			sv_data_r	<= 0;
		end
		else if(uf_tready_i == 1 && s_axis_data_tvalid == 1)
		begin
			sv_data_r	<= s_axis_data_tdata;				//将当前数据存起来
			uf_data_r	<= s_axis_data_tdata - sv_data_r;	//当前数据 - 上个时钟保存的数据
		end
	end
////////////////////////////////////////////////////////////////////////////////////
	always @(posedge clk)
	begin
		if(rst_n == 0 )
			abs_valid_r	<= 0;
		else if(abs_tready_i == 1)
			abs_valid_r	<= uf_valid_r;
	end
	
	always @(posedge clk)	//绝对值
	begin
		if(rst_n == 0 )
			abs_data_r	<= 0;
		else if(abs_tready_i == 1 && uf_valid_r == 1)
		begin
			if(uf_data_r >= 0)
				abs_data_r	<= uf_data_r;
			else
				abs_data_r	<= -uf_data_r;
		end
	end
////////////////////////////////////////////////////////////////////////////////////
	
	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;		//1MHz


initial	begin
	rst_n = 0;
	#(10 * CLK_PERIOD)
	rst_n = 1;
	#(3000 * CLK_PERIOD)
	$stop;
end

initial
	clk = 0;
always
begin
	clk = #(CLK_PERIOD/2.0) ~clk;
end


	wire 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设置

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

六、 仿真时序波形图

1. 激励文件信号波形图

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

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

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

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

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

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

FIR 基础应用 - FM 调频波调制解调(FIR 低通滤波)文章来源地址https://www.toymoban.com/news/detail-481585.html

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

  • XILINX FIR IP 详解、Verilog 源码、Vivado 工程

  • FIR 基础应用 - AM 调幅波调制解调(FIR 低通滤波)详细介绍

  • FIR 基础应用 - FM 调频波调制解调(FIR 低通滤波) 详细介绍

  • FIR 中级应用 - AM 调幅波调制解调(FIR + FIFO)详细介绍

  • FIR 高级应用 - AM 调幅波调制解调(FIR 低通滤波+重采样,FIR 高阶系数,FIR+FIFO ) 详细介绍

  • FIR 高级应用 - 多通道实验 (四个通道用一个 FIR IP,每通道用不同的系数) 详细介绍

  • FIR 高级应用 FIR Reload的使用) 详细介绍

  • AM 调幅波调制解调(FIR 低通滤波) vivado 工程文件下载

  • FM 调频波调制解调(FIR 低通滤波) Vivado 工程文件下载

  • AM 调幅波调制解调(FIR + FIFO) Vivado 工程文件下载

  • AM 调幅波调制解调(FIR 低通滤波+重采样,FIR 高阶系数,FIR+FIFO ) Vivado 工程文件下载

  • FIR 高级应用 - 多通道实验 Vivado 工程文件下载

  • FIR 高级应用 FIR Reload 的使用 vivado 工程文件下载

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

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

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

相关文章

  • 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日
    浏览(24)
  • 【通信原理(含matlab程序)】实验二:FM的调制和解调

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

    2024年02月08日
    浏览(27)
  • 基于System Generator的1024QAM-FM软件无线电联合调制解调系统的FPGA实现

    目录 一、理论基础 1.1环路滤波器 1.2环鉴相器介绍 1.3 Ganrder  二、核心模型

    2024年02月13日
    浏览(31)
  • FPGA设计FIR滤波器低通滤波器,代码及视频

    名称:FIR滤波器低通滤波器 软件:Quartus 语言:Verilog/VHDL 本资源含有verilog及VHDL两种语言设计的工程,每个工程均可实现以下FIR滤波器的功能。 代码功能: 设计一个8阶FIR滤波器(低通滤波器),要求截止频率为20KHz,使用线性相位结构。 参数设计方法: 使用matlab软件设计滤

    2024年02月08日
    浏览(38)
  • 利用FPGA实现全串行低通FIR滤波器

    设计一个15阶(长度为16)的具有线性相位低通FIR滤波器,采用布拉克曼窗函数设计,截止频率为500HZ,抽样频率为2000HZ;采用FPGA实现全串行FIR滤波器,系数的量化位数为12比特,输入数据位数为12比特,输出数据位数为29比特,系统时钟为16KHZ 设计思路 :首先采用MATLAB根据要

    2024年02月07日
    浏览(38)
  • 用C语言实现一个FIR低通滤波器算法

    +v hezkz17进数字音频系统研究开发交流答疑    以下是一个基于C语言的FIR低通滤波器算法的实现: #include stdio.h #include stdlib.h #define N 5     // 滤波器长度 #define M 100   // 输入数据长度 double h[N] = {0.2, 0.3, 0.4, 0.1, 0.0};  // 滤波器系数 int main() {     double x[M], y[M];     // 生成输入信

    2024年02月16日
    浏览(29)
  • STM32利用arm-dsp库进行FIR低通滤波【详细】

    arm-dsp库官方已经封装好了,使用的时候需要把dsp库移植到工程里面,具体怎么移植网上可以找到教程 这里直接说怎么用FIR的流程: 一、Matlab里面生成所配置的阶数和系数 1、在Matlab命令窗口输入fdatool,回车,会弹出一个新窗口 2、在新窗口中的响应类型选择【低通】,设计方

    2024年03月24日
    浏览(32)
  • 基于FPGA的FIR低通滤波器实现(附工程源码),matlab+vivado19.2+simulation

    本文为FPGA实现FIR滤波器仿真过程,附源代码。 提示:以下是本篇文章正文内容,下面案例可供参考 打开MATLAB在命令行窗口输入: fadtool 回车后在滤波器设计界面设置滤波器参数如下 之后点击如图标志,设置定点,在菜单栏\\\"目标(R)\\\"出选择生成对应滤波器系数.COE文件 mat

    2024年02月11日
    浏览(32)
  • 《移动通信原理与应用》——QPSK调制解调仿真

    目录 一、QPSK调制与解调流程图: 二、仿真运行结果:  三、MATLAB仿真代码:  QPSK调制流程图: QPSK解调流程图:    1、Figure1:为发送端比特流情况图:             从Figure1看出发送端发送的比特流信息…[ak,bk]…情况:奇数进入I路,偶数进入Q路。比特进入I路与Q路情况如

    2024年01月23日
    浏览(29)
  • 基于FPGA的FM信号解调

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

    2023年04月15日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包