开yun体育app官网网页登录入口 matlab与FPGA数字滤波器设计(6)—— Vivado 中使用 Verilog 实现并行 FIR 滤波器/截位操作

发布于:25-02-08 播放次数:

在FPGA中实现FIR滤波器时,最常用的直接结构非常简单且方便。实现直接结构时,您可以选择串行结构/并行结构/分布式结构。

并行结构(即FIR过滤器的乘法和累积操作)并行实现。数据处理速度更快。多个乘数用于同时计算乘法操作。数据输入速率可以达到系统处理时钟的速率,并且它与订单无关(与字符串相比。好的,使用更多资源,但提高处理速度,典型的设计思想是“用于速度的资源”);

滤波器设计MATLAB_滤波器设计 matlab_滤波器设计原理

1。创建新项目和文档

(1)创建一个新的Verilog文件

输入信号16位,输出信号16位,重置rst_n sl for RESET;

滤波器设计原理_滤波器设计MATLAB_滤波器设计 matlab

(2)获得滤波器系数H0〜H7;

FIR低通滤波器的设计使用MATLAB的FDATOOL工具箱以相同的方式设计,设置为系数8位量化,采样时钟为32 MHz(输入输入速率可以在并行处理过程中达到系统时钟速率),截止频率设置为1.5 MHz,并始终调用IP核心(32 MHz时钟,0.5MHz信号 + 5 MHz高频噪声,第99阶);

观察右上角的振幅和频率特征曲线,发现第七阶滤波器确实不有效,幅度较小,在5 MHz处较小幅度衰减,因此此处的噪声更改为13 MHz,在此频率点处的衰减更大,过滤效果很明显;

滤波器设计MATLAB_滤波器设计 matlab_滤波器设计原理

量化后,导出参数,您可以直接导出并用.coe文件替换它们。导出后,MATLAB将自动打开系数文件,并使用Verilog语言的常数来定义参数H0〜H7(请注意,将其指定为签名的数字);

滤波器设计 matlab_滤波器设计原理_滤波器设计MATLAB

(3)加权总和到过滤

FIR滤波器的输出是输入信号不同延迟阶段的数据和过滤系数的卷积(乘法和累积操作,首先执行多组乘法,然后累积乘法),这也与每个输入相等延迟数据。有不同的权重并执行加权总和;

滤波器设计原理_滤波器设计 matlab_滤波器设计MATLAB

根据上面的结构框图,进行8次乘法,然后添加乘法的乘积;

2。使用MATLAB生成模拟信号

参数:采样频率FS = 32 MHz,信号F1 = 0.5 MHz,信号F2 = 13 MHz,有关详细信息,请参见第3座;

滤波器设计MATLAB_滤波器设计原理_滤波器设计 matlab

3。写模拟文件testbench

(1)实例化模块;

(2)写初始块,初始化时钟,重置等。

(3)写总是块云开·全站体育app登录,给时钟翻转等;

(4)读取和写入.txt文件,将matlab写入.txt数据分配给输入,然后将输出数据写入.txt文件以进行MATLAB分析;

有关详细信息,请参见第3讲;

滤波器设计原理_滤波器设计 matlab_滤波器设计MATLAB

4。仿真

(1)Verilog模拟

可以看出,高频噪声基本上被过滤了,但是肉眼可以看到波形和标准正弦波之间存在一定的差异。

滤波器设计MATLAB_滤波器设计原理_滤波器设计 matlab

(2)MATLAB模拟

MATLAB模拟是F1,F2,F1+F2和过滤数据;

滤波器设计原理_滤波器设计 matlab_滤波器设计MATLAB

使用MATLAB进行频谱分析,并使用第7阶(8个系数)FIR滤波器保留低频0.5 MHz信号,并过滤高频13 MHz信号;

滤波器设计MATLAB_滤波器设计 matlab_滤波器设计原理

(3)全面的RTL图

合成后,使用6个乘数和7个加法器。 Verilog总共有8个乘法kaiyun.ccm,但是其中2个的乘数是常数0,因此Vivado仅合成6个乘数。

滤波器设计MATLAB_滤波器设计 matlab_滤波器设计原理

与串行相比,下图是串行FIR滤波器的RTL图:

滤波器设计 matlab_滤波器设计原理_滤波器设计MATLAB

5。截止输出的部分变化

让我们看这张照片。在对输入16位数据执行操作后,为了确保数据不会溢出,结果位宽度逐渐变大,但最终输出为16位,此时需要截获数据。 (如果没有截获,那么当数字信号处理系统更为复杂时,数据的位宽度将非常大,这在处理中是不现实的)。当切断此示例中的32位数据时,开始拦截的地方是一个常见问题:

(1)拦截高16位(data_out_temp [31:16]),当数据相对较大时,您可以执行此操作(高位都是有效的数据,使用小数示例9 * 9 = 81,以小数为单位高位约80,类似于二进制),这相当于失去一些低位的精度;

(2)拦截低16位(data_out_temp [15:0]),当数据相对较小时可以使用该(在高位上没有有效的数据,请使用小数示例2 * 2 = 4,以小数至4的低位数;

(3)删除高数字的标志位,并根据模拟数据的表示范围拦截实际所需数据;

滤波器设计原理_滤波器设计 matlab_滤波器设计MATLAB

您需要切断data_out_temp [31:0](首先将16位的高点作为data_out查看波形),因此在模拟中,首先将信号添加到波形显示窗口中。该信号是内部信号,不在输出端口中。请按照以下图查找测试台模拟实例化的设备,在下面找到data_out_temp信号,然后单击右键单击的addto wave窗口(箭头1),单击“ restart 2)(箭头2),然后模拟运行(箭头3),然后对其进行调整,然后对其进行调整(箭头3)到模拟的波形类似物(请参阅详细信息);

滤波器设计MATLAB_滤波器设计原理_滤波器设计 matlab

如下图中的箭头所示,扩展信号,您可以看到data_out_temp信号的23〜31位相同,代表符号位,0代表正数,1表示负数。实际上,仅需要1个符号来表示正数和负数。 ,您可以取16位data_out_temp [23:8];

滤波器设计原理_滤波器设计 matlab_滤波器设计MATLAB

选择data_out_temp [23:8],然后单击右键单击以创建一个新的虚拟总线(NewVirtual Bus)。类似地开yun体育app官网网页登录入口,创建data_out_temp [22:7],还创建一个新的虚拟总线(NewVirtual Bus 1);

滤波器设计 matlab_滤波器设计MATLAB_滤波器设计原理

您可以看到data_out_temp [23:8]的波形尚未受到影响,并且data_out_temp [23:8]的波形无法再反映data_out_out_temp的特征,因此data_out_temp [23:8]可以拦截为data_out data_out;

分配data_out = data_out_temp [23:8];

滤波器设计MATLAB_滤波器设计 matlab_滤波器设计原理

如下图所示,在使用data_out_temp [23:8]作为data_out之后,滤波的输出值为16619,在黄线时间为16619,该值与输入信号data_in的数量级相同,并且小于data_in。这是因为上面的高频噪声被过滤了。与实际情况一致;

滤波器设计MATLAB_滤波器设计 matlab_滤波器设计原理