资讯详情

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

版权声明:本文是博主的原创文章 CC 4.0 BY-SA 版权协议,请附上原始来源链接和本声明。 本文链接:https://blog.csdn.net/qq_46621272/article/details/125292610

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


文章目录

  • 前言
  • 一、FIR IP 详解(Vivado 2017.4 环境 FIR Compiler 7.2)
  • 二、实验内容
    • 实验一、FIR 基础应用 - AM 调幅波调制解调(FIR 低通滤波)。
      • 1. AM 调幅波调制模块
      • 2. am_modulation_dds.v verilog 代码
      • 3. AM 调幅波解调整模块
      • 4. am_demodulation_fir.v verilog 代码
      • 5. am_modem_fir_testbench.v verilog 代码
      • [FIR 基础应用 - AM 调幅波调制解调(FIR 详细介绍低通滤波)(https://blog.csdn.net/qq_46621272/article/details/125334644)
    • 实验二、FIR 基础应用 - FM 调频波调制解调(FIR 低通滤波)。
      • 1. FM 调频波调制模块
      • 2. fm_modulation_dds.v verilog 代码
      • 3. FM 调频波解调模块
      • 4. fm_demodulation_fir.v verilog 代码
      • 5. fm_modem_fir_testbench.v verilog 代码
      • [FIR 基础应用 - FM 调频波调制解调(FIR 低通滤波) 详细介绍](https://blog.csdn.net/qq_46621272/article/details/125337119)
    • 实验三、FIR 中级应用 - AM 调幅波调制解调(FIR FIFO)
      • 1. AM 调幅波调制模块,请参考实验1
      • 2. AM 调幅波解调模块(FIR 中级应用)
      • 3. am_fifo_demodulation_fir.v verilog 代码
      • 4. am_fifo_fir_testbench.v verilog 代码
      • [FIR 中级应用 - AM 调幅波调制解调(FIR FIFO)详细介绍](https://blog.csdn.net/qq_46621272/article/details/125384724)
    • 实验四、FIR 高级应用 - AM 调幅波调制解调(FIR 低通滤波 重采样,FIR 高阶系数,FIR FIFO )
      • 1. AM 调幅波调制模块,请参考实验1
      • 2. AM 调幅波解调整模块(FIR 高级应用)
      • 3. am_fifo_dc_demodulation_fir.v verilog 代码
      • 4. am_fifo_dc_fir_testbench.v verilog 代码
      • [FIR 高级应用 - AM 调幅波调制解调(FIR 低通滤波 重采样,FIR 高阶系数,FIR FIFO ) 详细介绍](https://blog.csdn.net/qq_46621272/article/details/125385375)
    • 实验五、FIR 高级应用 - 多通道实验 (四个通道用一个 FIR IP,每个通道使用不同的系数)。
      • 1. FIR 多通道模块(FIR 高级应用)
      • 2. multichannel_fir.v verilog 代码
      • 3. multichannel_fir_testbench.v verilog 代码
      • 4. fir_compiler_mc4_512 FIR IP 设置需要注意的地方
      • 5. FIR 多通道实验时序图
      • 6. FIR 多通道实验时序图CONFIG 放大时序细节
      • [FIR 高级应用 - 多通道实验 (四个通道用一个 FIR IP,每个通道使用不同的系数) 详细介绍](https://blog.csdn.net/qq_46621272/article/details/125346332)
    • 实验六、FIR 高级应用 FIR Reload的使用。
      • 1. reload_fir.v verilog 代码
      • 2. reload_fir_testbench.v verilog 代码
      • 3. FIR 高级应用 FIR Reload时序图
      • 4. FIR 高级应用 FIR Reload细节时序图放大1
      • 5. FIR 高级应用 FIR Reload放大时序图放大2
      • 6. reload_fir FIR 高级应用 FIR IP 设置需要注意的地方1
      • 7. reload_fir FIR 高级应用 FIR IP 设置需要注意的地方2
    • 实验一、三综合布线后 FPGA 资源对比
      • 实验一、三AM单独综合布线后的解调部分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://downlod.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)


前言

FIR 是个比较复杂的 IP ,不同的设置需要不同的代码去配合。这篇文章详细介绍了这 FIR IP 设置需要注意的地方。 本文中介绍了五个实验,最基础的应用实验,FIR +FIFO实验,多通道多套系数配置实验,Reload Config 实验等,全面介绍了 FIR 的各种应用。所有实验提供 Vivado工程,Verilog代码下载,还有较为详细的文字图片介绍。


一、FIR IP 详解(Vivado 2017.4 环境 FIR Compiler 7.2)

XILINX 官方 FIR 手册: https://docs.xilinx.com/v/u/en-US/pg149-fir-compiler 本文只介绍一些常用到的功能设置,和需要注意的地方。一些没介绍到的功能和细节请仔细阅读手册。 在这里插入图片描述

  • 06:Channel Sequence 通道序列选择,在我们的实验中均选用 Basic。在 Number of Channels 通道数量为 1 时也只能选用 Basic。 Basic 的多通道模式,各通道的采样频率必须同步、一致。 在 Advanced 选项里,各通道的采样频率允许有限制的不一样,但必须是同步的同一时钟源的。这 Advanced 选项的细节请阅读手册吧。
  • 07:Number of Channels 通道数量,这里的多通道是串行的,比如双通道 C0,C1 这俩通道 C0、C1 交错输入交错输出分时使用。
  • 08:Parallel Channel Specification 并行的通道设置,并行通道数量。各通道的采样频率必须同步、一致。
  • 09:输入的采样时钟频率,这是个虚值,并没用这个采样时钟的管脚。这个值的设置要根据整个 FIR 的应用来决定。
  • 10:FIR 实际工作的时钟频率
  • ,09,10 这俩时钟的设置需要是相互关联的。这俩值根据不同的应用会有不同的变化。
  • 应用1: 输入的采样时钟频率和 FIR 实际工作的时钟频率设成一样。 优点:这种 FIR 的应用,FIR 外围设计非常简单。 缺点:占用 DSP 资源较大。 使用范围:适用于高速的采样速率的方案,适用于对 DSP 资源消耗不高的应用。
  • 应用2: 输入的采样时钟频率小于 FIR 实际工作的时钟频率。 由于输入的采样时钟和 FIR 的工作时钟不同,输入的数据流一般要用一个 FIFO 做跨越时钟域的转换。 优点:这种 FIR 的应用,能极大的降低 DSP 资源的使用。在一些低速应用中能选用高阶滤波算法。比如一万个系数的 FIR 运算。 缺点:这种 FIR 的应用,FIR 外围设计设计较复杂,一般需要用 FIFO。 使用范围:适用于低速的采样速率的方案,适用于对 DSP 资源消耗很高的应用。
  • 应用3: 输入的采样时钟频率大于 FIR 实际工作的时钟频率。 这种应用能实现超高速的 FIR 应用。这种应用消耗资源成倍的增加。和应用2一样这种应用也需要 FIFO ,应用比较复杂。 优点:实现超高速的 FIR 运算,比如 7 系列 XILINX FPGA 实现。FIR 的工作时钟能到 300MHz,用这种方法能实现 300MHz * N 的高速计算。 缺点:这种 FIR 的应用占用 DSP 的资源成 N 倍的增长。FIR 外围设计设计较复杂,一般需要用 FIFO。 使用范围:适用于超高速的采样速率的方案。

  • 12:FIR 系数的设置需要和 COE 文件保持一致,在我们的实验中这个设置均为 Signed,16 位宽度。

  • 13:Coefficient Structure 系数结构,自动,对称,非对称,负对称系数的选择。在多组系数 Config 应用和 Reload 应用中,需要设置该值。请参考 03,04章节的介绍,请参考实验。

  • 14:输入输出数据设置,按实际应用去设置位宽和精度。

  • 15:请阅读手册。在我们的实验中这部分都是按缺省值设置。

  • 16:数据通道选择。按实际应用去选择。

  • 17:USER 输入输出设置,在多通道的实验中 USER Output 设置 Chan ID Field

  • ,该选项能支持每个通道选用不同的 FIR 系数设置。在实验中,选用 By Channel

  • ,在 Reload 应用中需要关注此值,这个值在我们使用 Reload 时,会影响 Reload 时的数据堵塞。这东西文字说不清楚,最好看看实验的代码和波形。 举例: Reload Slots = 1,在 Reload 时只能下载一组系数后就堵塞了,下载数据通过 Config 须激活后才能继续下载数据。 Reload Slots = 3,在 Reload 时能下载三组系数后就才堵塞,激活后才能继续下载数据。

  • 20:按实际应用去选择。在我们的所有实验中 ARESETn 均为使能。

二、实验内容

实验一、FIR 基础应用 - AM 调幅波调制解调(FIR 低通滤波)。

1. AM 调幅波调制模块

2. am_modulation_dds.v verilog 代码

//am_modulation_dds.v
module	am_modulation_dds
(
	output			m_axis_data_tvalid,
	input			m_axis_data_tready,
	output	[15:0]	m_axis_data_tdata,
	input			rst_n,
	input			clk
);

	wire signed	[7:0]	dds_100khz_tdata_i;		//	100KHz   正弦波	AM 载波
	wire				dds_100khz_tvalid_i;
	wire				dds_100khz_tready_i;

	wire signed	[7:0]	dds_4khz_tdata_i;		//	4khz   正弦波	AM 调制信号
	wire				dds_4khz_tvalid_i;
	wire				dds_4khz_tready_i;

	reg signed	[15:0]	am_tdata_r;
	reg					am_tvalid_r;
	wire				am_tready_i;

	assign	am_tready_i			= m_axis_data_tready;
	assign	dds_100khz_tready_i	= am_tready_i;
	assign	dds_4khz_tready_i	= am_tready_i;

	assign	m_axis_data_tvalid	= am_tvalid_r;
	assign	m_axis_data_tdata	= am_tdata_r;

	always @(posedge clk)	//AM 调制算法实现
	begin
		if(rst_n == 0 )
		begin
			am_tdata_r	<= 0;
			am_tvalid_r	<= 0;
		end
		else if(am_tready_i == 1)
		begin
			am_tdata_r	<= dds_100khz_tdata_i * (dds_4khz_tdata_i/2 + 128);	// 128 是直流分量,式中的除2是为了不使数据超过16位溢出
																			// 这个代码中,载波频率很低,就直接用乘法去写代码了。
																			// 如果载波频率比较高就需要用DSP单元或乘法 IP 去实现。
			am_tvalid_r	<= dds_4khz_tvalid_i & dds_100khz_tvalid_i;
		end
	end

	dds_compiler_1m_100k dds1						// XILINX VIVADO DDS IP,1MHz 时钟输入,100KHz正弦波 8 位输出
	(
		.aclk				(clk),					// input wire aclk
		.aresetn			(rst_n),				// input wire aresetn
		.m_axis_data_tvalid	(dds_100khz_tvalid_i),	// output wire m_axis_data_tvalid
		.m_axis_data_tready	(dds_100khz_tready_i),	// input wire m_axis_data_tready
		.m_axis_data_tdata	(dds_100khz_tdata_i)	// output wire [7 : 0] m_axis_data_tdata
	);

	dds_compiler_1m_4k dds2							// XILINX VIVADO DDS IP,1MHz 时钟输入,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
	);

endmodule

3. AM 调幅波解调模块

4. am_demodulation_fir.v verilog 代码

//am_demodulation_fir.v
module	am_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 		[15:0]	abs_data_r	= 0;
	reg					abs_valid_r	= 0;
	wire				abs_tready_i;

	always @(posedge clk)
	begin
		if(rst_n == 0 )
			abs_valid_r	<= 0;
		else if(abs_tready_i == 1)
			abs_valid_r	<= s_axis_data_tvalid;
	end

	always @(posedge clk)	//取绝对值
	begin
		if(rst_n == 0 )
			abs_data_r	<= 0;
		else if(abs_tready_i == 1 && s_axis_data_tvalid == 1)
		begin
			if(s_axis_data_tdata >= 0)
				abs_data_r	<= s_axis_data_tdata;
			else
				abs_data_r	<= -s_axis_data_tdata;
		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;

	fir_compiler_lowpass_10k_30k_1m am_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 [39 : 0] m_axis_data_tdata
	);
endmodule


5. am_modem_fir_testbench.v verilog 代码

///////////////////////////////////////////////////////////////////////

`timescale 1ns / 100ps

//am_modem_fir_testbench.v
module am_modem_fir_testbench;

reg			rst_n;
reg			clk;


parameter CLK_PERIOD		= 1000;		//1MHz

initial	begin
	rst_n = 0;
	#(20 * 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]	am_mod_tdata;			//调幅波数据,载波100KHz 正弦波,调制信号 4KHz 正弦波
	wire				am_mod_tvalid;
	wire				am_mod_tready;

	wire signed	[15:0]	am_demod_tdata;			//经过解调还原的 4KHz 正弦波
	wire				am_demod_tvalid;
	wire				am_demod_tready=1;

	am_modulation_dds	am_u1					//调幅波调制模块,生成 载波100KHz 正弦波,调制信号 4KHz 正弦波的调幅信号
	(
		.clk				(clk),				//1MHz
		.rst_n				(rst_n),			//复位
		.m_axis_data_tdata	(am_mod_tdata),		//调幅波数据输出, output wire [16 : 0]
		.m_axis_data_tvalid	(am_mod_tvalid),
		.m_axis_data_tready	(am_mod_tready)
	);

	am_demodulation_fir		am_u2				//调幅波解调模块,将调幅波解调还原调制信号
	(
		.clk				(clk),				//1MHz
		.rst_n				(rst_n),			//复位
		.s_axis_data_tdata	(am_mod_tdata),		//调幅信号输入 intput wire [16 : 0]
		.s_axis_data_tvalid	(am_mod_tvalid),
		.s_axis_data_tready	(am_mod_tready),
		.m_axis_data_tdata	(am_demod_tdata),	//调幅波解调数据输出, output wire [16 : 0]
		.m_axis_data_tvalid	(am_demod_tvalid),
		.m_axis_data_tready	(am_demod_tready)
	);

endmodule

实验二、FIR 基础应用 - FM 调频波调制解调(FIR 低通滤波)。

1. FM 调频波调制模块

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 IP,100MHz 时钟输入,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

3. FM 调频波解调模块

4. 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;

/////////////////////////////////////////////////
        标签: mc4端子连接器压接ly

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台