System Generator初体验FIR滤波器(三)

简介: System Generator初体验FIR滤波器

System Generator初体验FIR滤波器(二)https://developer.aliyun.com/article/1472306


五、步骤 4:使用数据类型

在本步骤中,你将了解如何使用硬件高效的定点类型来创建满足所需规范但资源效率更高的设计,并了解如何使用 Xilinx Blocksets 来分析这些系统。这个练习有两个主要部分。

  • 在第1部分中,将回顾并综合使用浮点数据类型的设计
  • 在第2部分中,将使用作为定点实现捕获的相同设计,并细化数据类型,以创建满足相同需求的硬件高效设计

第 1 部分:使用浮点数据类型进行设计

<1>、打开 Lab1_4_1.slx 文件

①、这将打开如下图所示的 Simulink 设计。该设计类似于 Lab 1_1 中使用的设计,但这次设计使用 float 数据类型,滤波器在子系统 FIR 中实现。首先,将审查设计的属性,然后模拟设计以审查性能,最后综合设计。

从上图可以看出,实例 FIR 的输入和输出都是 double 类型

<2>、配置及运行

①、在 MATLAB 命令窗口中输入 MyCoeffs = xlfda_numerator(‘FDATool’)

②、双击实例 FIR 打开子系统,双击实例 Constant1 以打开 Properties Editor。这表明常量值是由 MyCoeffs(1) 定义的。关闭 Constant1 Properties 编辑器

③、使用工具栏按钮 Up to Parent 返回到顶层设计。该设计将两个正弦波相加,都是 9 MHz。因此,系统发生器的输入网关必须以至少 18 MHz 的速率采样。双击 Gateway In1 实例打开属性编辑器,并确认输入以 20 MHz 的速率对数据进行采样(采样周期为 1/20e6)。关闭 Gateway In Properties 编辑器

④、按 Run simulation 按钮模拟设计。下面显示的结果显示,System Generator 块集产生的结果非常接近理想情况,如图所示。由于系统发生器设计必须将连续输入波形采样为离散时间值,因此结果并不相同。

最后一步是将这个设计合成为硬件

⑤、双击 System Generator 令牌以打开 Properties Editor,从编译菜单中,确保编译目标是 IP Catalog

从时钟菜单中,在执行分析下选择合成后,从分析器类型菜单中选择资源。此选项提供完成后的资源使用详细信息

⑥、按 “生成” 将设计编译成硬件描述。完成后,在 Resource Analyzer 窗口中生成资源利用率,如下所示

单击 OK 以关闭编译状态对话框

在 Lab 1 中使用定点数据类型实现了相同的过滤器。当与该实现的合成结果进行比较时,Lab 1 的初始结果如下图所示:Lab1_1 资源分析器结果

可以看到当前版本的设计使用了大量的寄存器(FF)、LUTs 和 DSP48(DSP)资源(Xilinx 专用乘法器/加法单元)

保持浮点类型的完全精度是一种理想的实现,但是实现完全的浮点精度需要大量的硬件。对于这种特殊的设计,不需要浮点类型的整个范围。该设计使用的资源远远超过所需的资源。在下一部分中,将学习如何在 Simulink 环境中比较具有不同数据类型的设计。

第 2 部分:定点数据类型设计

在本部分中,将使用定点数据类型重新实现第 1 部分:使用浮点数据类型进行设计中的设计,并将这个新设计与原始设计进行比较。本练习将演示使用定点类型的优点和缺点,以及System Generator如何允许你轻松比较设计,允许您在提交 FPGA 实现之前在 Simulink 环境中进行精度和资源之间的权衡

<1>、打开 Lab1_4_2.slx 文件

在此设计中,浮点实现与相同的定点设计一起被捕获。

<2>、配置及运行

①、在 MATLAB 命令窗口中输入 MyCoeffs = xlfda_numerator (‘FDATool’)

②、双击实例 Gateway In2 以确认将数据采样为 16 位定点值

③、点击运行仿真按钮模拟设计并确认实例 Spectrum Analyzer SysGen Fixed 显示过滤后的输出

如果检查实例 FIR-Fixed-Point 的输出,您将看到 System Generator 通过过滤器自动传播输入数据类型,并确定输出必须是 43 位(28 位二进制位)以保持信号的分辨率。这是基于通过过滤器的位增长和过滤器系数(实例 FIR-Fixed-Point 中的常量)为 16 位的事实。

④、在 MATLAB 命令窗口中,输入sum(abs(MyCoeffs)) 以使用当前系数确定绝对最大增益

考虑到系数的正负值,最大增益可能是 1.2070,输出信号的幅度应该只比输入信号略小,输入信号是 16 位信号。不需要在二进制点以上有 15 位(43 - 28)的数据。现在,将使用 Reinterpret 和 Convert 块来操作定点数据,使其不大于精确结果所需的宽度,并产生最有效的硬件设计。

⑤、在画布的任意位置用鼠标右键单击并选择 Xilinx BlockAdd,在 “添加块” 输入框中,键入“Reinterpret”,双击 Reinterpret 组件,将其添加到设计中

对这些组件重复上述三个步骤:

  • a. Convert
  • b. Scope

⑥、在设计中,选择 Gateway Out2 实例

  • a. 右键单击并使用 Copy and Paste 来创建 Gateway Out 块的新实例
  • b. 再次粘贴两次,以创建 Gateway Out 的另外两个实例(总共三个新实例)

⑦、双击 Scope 组件,在“作用域属性”对话框中,选择文件 -> 输入端口数:3

⑧、连接块如下图所示

⑨、单击 Run simulation 按钮来模拟设计,双击 Scope 以检查信号

此时还没有配置 Reinterpret 和 Convert 块,因此所有三个信号都是相同的。Xilinx Reinterpret 块将其输出强制为新类型,而不考虑保留输入所表示的数值。该块允许将无符号数据重新解释为有符号数据,或者相反,将有符号数据重新解释为无符号数据。它还允许通过重新定位数据中的二进制点来重新解释数据的缩放。

在本练习中,你将把数据按 2 倍缩放,以模拟可能在更大的系统中出现的额外设计处理。Reinterpret 块也可以用于缩小。

⑩、双击 Reinterpret 块打开属性编辑器,选择 Force Binary Point,在输入字段 Output Binary Point 中输入值 27,然后单击 OK

Xilinx Convert 块将每个输入样本转换为所需算术类型的数字。例如,可以将数字转换为有符号(2的补码)或无符号值。它还允许对信号量化进行截断或舍入,并对信号溢出进行包装、饱和或标记为错误。在本练习中,将使用Convert 块将 43 位字的大小减小到 16 位值。在这个练习中,Reinterpret 块被用来模拟一个更复杂的设计,并将数据按 2 倍缩放。因此,您必须确保输出在二进制点以上有足够的位来表示这种增加。

⑪、双击 Convert 块打开属性编辑器,在定点精度部分,输入13 作为二进制点,然后单击 OK

⑫、单击 Run simulation 按钮来模拟设计,双击 Scope 以检查信号

在上面的图中,您可以看到过滤器(Growth)的输出值在正负 1 之间。Reinterpret 块的输出将数据值移动到正负 2 之间。在这个波形的详细视图中,与重新解释结果相比,最终输出(Convert)显示保真度没有差异,但仅使用16位

最后一步是将这个设计合成为硬件

⑬、双击 System Generator 令牌以打开 Properties Editor,从编译菜单中,确保编译目标是 IP Catalog。

从时钟菜单中,在执行分析下选择合成后,从分析器类型菜单中选择资源。此选项提供完成后的资源使用详细信息

⑭、单击 Generate 将设计编译成硬件描述。完成后,在 Resource Analyzer 窗口中生成资源利用率,如下所示

注意,与步骤 1 中的结果相比(Lab1_1资源分析仪结果),这些结果显示近似:

  • Flip-Flops 增加 45%
  • LUTs 增加 20%
  • DSP48s 增加 30%
    ⑮、单击 OK 以关闭编译状态对话框

总结

在本节,您学习了如何使用 System Generator 块集在 Simulink 环境中创建设计,并将设计综合到可以在 Xilinx FPGA 上实现的硬件中。你了解了使用 Xilinx 数字 FIR 滤波器块快速创建设计的好处,以及如何通过使用过采样来改进设计。

你还了解了浮点类型如何提供高度的准确性,但在 FPGA 中实现要花费更多的资源,以及如何使用 System Generator 块集来实现使用更有效的定点数据类型的设计,并补偿使用定点类型造成的任何准确性损失。

Reinterpret 和 Convert 块是功能强大的工具,允许您优化设计,而无需执行详细的位级优化。您可以简单地使用这些块在不同的数据类型之间进行转换,并快速分析结果。最后,您了解了如何通过使用离散原语完全控制硬件实现。

目录
相关文章
|
12月前
|
PHP 异构计算
Matlab Simulink支持system generator插件
Matlab Simulink支持system generator插件
128 0
|
1月前
|
机器学习/深度学习 存储 算法
回声状态网络(Echo State Networks,ESN)详细原理讲解及Python代码实现
本文详细介绍了回声状态网络(Echo State Networks, ESN)的基本概念、优点、缺点、储层计算范式,并提供了ESN的Python代码实现,包括不考虑和考虑超参数的两种ESN实现方式,以及使用ESN进行时间序列预测的示例。
61 4
回声状态网络(Echo State Networks,ESN)详细原理讲解及Python代码实现
|
4月前
|
编译器 异构计算
System Generator初体验FIR滤波器(一)
System Generator初体验FIR滤波器
76 1
|
4月前
|
存储 语音技术 异构计算
System Generator初体验FIR滤波器(二)
System Generator初体验FIR滤波器
51 1
|
4月前
|
索引
yolov5--detect.py --v5.0版本-最新代码详细解释-2021-6-29号更新
yolov5--detect.py --v5.0版本-最新代码详细解释-2021-6-29号更新
223 0
yolov5--detect.py --v5.0版本-最新代码详细解释-2021-6-29号更新
|
4月前
|
机器学习/深度学习 索引
yolov5--loss.py --v5.0版本-最新代码详细解释-2021-7-1更新
yolov5--loss.py --v5.0版本-最新代码详细解释-2021-7-1更新
267 0
|
9月前
问题出在`megatron_util.mpu`模块中没有找到`get_model_parallel_rank`属性
问题出在`megatron_util.mpu`模块中没有找到`get_model_parallel_rank`属性
103 1
|
Python
python以三维tensor为例详细理解unsqueeze和squeeze函数
python以三维tensor为例详细理解unsqueeze和squeeze函数
223 0
python以三维tensor为例详细理解unsqueeze和squeeze函数
|
PyTorch 算法框架/工具
pytorch中meter.AverageValueMeter()使用方法
pytorch中meter.AverageValueMeter()使用方法
256 0
|
PyTorch 算法框架/工具
pytorch中meter.ClassErrorMeter()使用方法
pytorch中meter.ClassErrorMeter()使用方法
161 0