前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于System Generator的浮点数与定点数设计(实现与分析)

基于System Generator的浮点数与定点数设计(实现与分析)

作者头像
狂人V
发布2020-06-29 11:27:33
7420
发布2020-06-29 11:27:33
举报
文章被收录于专栏:电子狂人
讲完昨天的设计优化,今天将学习到如何使用效率高的定点数类型来创建一个满足所需规范且资源更有效利用的设计,以及使用System Generator下Xilinx Blocksets中的模块来分析这些设计,分成了两个部分进行。

01

浮点数类型设计

打开System Generator,然后将第一次设计的滤波器文件Copy一份然后进行一些更改,或直接新建模型,以可以参考前几篇文章

初识System Generator(安装+使用)

System Generator设计转FPGA设计

基于System Generator的数字滤波器(Simulink验证+Block设计+FPGA的仿真验证)

我做了些修改,把一些Lowpass Filter和scope删除,然后将Digital FIR Filter换成了一个由离散部件组成的FIR子系统,此时的设计如下,线上的数据类型都是double类型:

子系统滤波器系数将设置一个MyCoeffs的变量对其进行控制,因此需要在MATLAB的命令窗口进行赋值,在命令窗口输入:MyCoeffs= xlfda_numerator('FDATool'),然后回车,会在窗口出现由FDATool产生的滤波器系数,并储存在工作区中,结果如下:

这步设置好后,双击FIR这个子系统,进入它的内部,看它的组成,直接复制我这个模块到你自己的文件即可,如果自己进行制作也可,至于如何制作子系统(有的喊子模块),这个就自行研究了,不难~

由于图比较大,就只截取了一部分清晰的输入,整个组成的图如下,会比较模糊,但是大体上还是可以看出实现的方式和上一篇使用离散部件设计滤波器有相似之处,而且其他部分的组成也是在做重复的动作,相当于串在一起进行工作。

配置和昨天的相似,只是Constant这个模块中有一个配置可能会觉得有点不同,看下第一个Constant1的配置就知道意思了,Constant value中的MyCoeffs(1)就是指刚刚在MATLAB中对MyCoeffs的第一个值也就是滤波器的第一个系数,之后的Constant模块就是依次填到MyCoeffs(1)就相当于把滤波器系数配置好了,然后还要就是Out Type这一项选了Floating-point将输出变成浮点数的类型:

这部分设置好后,就可以返回顶层,点左上角的箭头

或者直接点顶层模块名字的那个。

在顶层双击Gateway In,将类型也设置为Floating-point,不然类型不匹配要报错,配置结果如下:

点OK保存并关闭,然后点Run运行,观察出来的结果:

看到Simulink中的滤波器滤波后的是比较理想的滤波效果(左下角的那个),而经过System Generator设计的就不是很理想,这其实是因为System Generator的设计是需要将输入的连续波形采样成离散的值用于处理,所以还是符合设计要求的。

再最后一步就是直接双击System Generator,生成FPGA设计文件并显示资源分析的窗口,模块的配置和第一次设计时的一样,看资源分析的窗口:

将上面设计消耗的资源和最开始的设计所消耗的资源(下图)做下对比,会发现它消耗了大量的Registers(FF),LUTs和DSPs(DSP48)的资源,DSPs在Xilinx器件中是专用于乘法器或加法器。

保持浮点数类型全精度是一种理想的实现方法,但是从上面的对比也知道这样需要消耗大量的硬件资源,其实全范围的浮点数类型并不是一定要的,接下来讲下定点数的类型,然后两者做下对比,并且学学如何在Simulink中比对不同数据类型的设计,点击OK或者cancel开始接下来的学习。

02

定点数类型设计

将上述所述的浮点数文件复制一份,然后在它的基础上做修改,首先把FIR子系统的名字改成FIR-Fixed-Point,和之前的FIR做个区分,再双击进入FIR-Fixed-Point的内部,更改数据类型,还是对Constant模块的配置做修改,第一个配置结果如下,其他的Constant模块更改与之相同的输出类型:

然后返回顶层将Gateway In也修改成定点数类型,配置如下:

都配置完成之后,如果是关闭所有后再新建的,记得在MATLAB的命令窗口输入:MyCoeffs= xlfda_numerator('FDATool'),使得系数存在工作区中,然后就可以点击Run,再观察频谱分析仪的波形,如下:

可以看到此时设计文件中FIR-Fixed-Point输入的数据类型和输出数据类型都已经是Fix的字样,输出的位数却是43位(带有28个二进制位),因为这个位数是用来保持信号分辨率的,这是基于滤波器的位增长以及滤波系数(FIR-Fixed-Point子系统中的constants)是16位的原因。

在MATLAB的命令窗口输入:sum(abs(MyCoeffs)),计算出当前滤波器系数的绝对最大增益,结果如下:

考虑到系数的正负值,最大增益是1.2070,并且输出信号的幅值应该仅比输入信号(16位的信号)小一些,因此二进制点的前面不需要有15位(43-28)的数据。

使用Reinterpret和Convert这两个模块控制定点数类型的数据的位宽不大于准确结果所需的宽度,从而制作出最有效的硬件设计。

首先加一些模块进去,包括:Reinterpret、Convert、scope、GatewayOut

然后将各模块连接起来,结果如下,其中Gateway Out多了三个,scope也设置了3个输入端口,显示的窗口弄成了三行一列,设置方式还不会的话,可以参考之前发的文章:

基于System Generator的数字滤波器(Simulink验证+Block设计+FPGA的仿真验证)

然后将输入示波器的三条信号线命名,方便在示波器上观察,双击要命名的信号线,然后输入对应的名字:Growth、Reinterpret 和 Convert,结果如下:

然后点击一下Run,看下此时的结果,信号可能会比较密集,记得点那个放大器对信号进行缩放再观察。

因为Reinterpret 和Convert这两个模块还没配置,所以这时候看到三个信号的样子是相同的。

介绍下这两个模块的作用:

Reinterpret 可以强制将输出数据的类型变成新的类型,不需要考虑保留输入所代表的数值,例如可以将无符号的数据转变成符号数,反之也可,还有就是能够通过改变二进制点的所在位置从而实现对数据进行缩放。

Convert 的作用是将输入样本转换为所需的算术类型的数量,举个例子:数字可以转换为有符号(二进制补码)或无符号数,也允许信号量化能够被截断或者四舍五入,信号溢出时可以被包裹,饱和或者将其标记为error。

双击Reinterpret,打开其属性编辑器,然后将Force Binary Point勾上,并将Output BinaryPoint的值设置为27,将信号放大两倍,然后点击OK保存并关闭,配置结果如下:

双击Convert模块,打开其属性编辑器,将Binary Point的值改成13,Number of bits是将对数据做截位,变成16位的数据,Binary point就是控制小数点的位置,该部分是为了确保输出在二进制点前可以有足够的位来表示上一级放大的数据,然后就可以点击OK保存并关闭。

将设计的模型文件保存一下,然后点击 Run,观察此时信号的样子:

滤波器输出信号(Growth)的幅值在±1之间,Reinterpret输出信号的幅值在±2之间,仔细看Convert对应的信号,与reinterpret的输出信号对比,失真度很低,信号几乎相同,但是要注意,这时候的数据位仅仅是16位~

最后,使用System Generator生成硬件设计,配置和之前的一样,点Generate进行生成,然后完成后,观察显现出来的资源分析窗口,与浮点数类型设计的进行比对,资源少了很多,有木有

到此,基于System Generator的数字滤波器设计就真正意义上的结束了,从最开始使用FDATool设计滤波器产生相应的滤波系数,Digitial Filter使用其系数,到对滤波器设计进行优化,再到使用数据类型的分析,一步一步,终于耐心弄完了,不过可能很多地方还有不足之处,以后慢慢适应吧本次设计的文件已经上传网盘,需要参考的可以后台回复关键字获取~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子狂人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档