在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3369|回复: 10

[原创] Xilinx Spartan-3AN的触发器使用

[复制链接]
发表于 2021-8-15 17:00:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 innovation 于 2021-8-15 19:45 编辑

本帖摘自公司内部培训文件,对网页版阅读效果不满意的同学可直接下载:
Xilinx Spartan-3AN触发器的使用技巧之一.pdf (726.87 KB, 下载次数: 1 )
PS:3#的内容发重复了,但是没找到方法删除。
 楼主| 发表于 2021-8-15 17:05:34 | 显示全部楼层
6.     Spartan-3AN的触发器使用
        XilinxFPGA内部最基本、最丰富的可编程逻辑资源称为CLB(Configurable Logic Block),FPGA逻辑程序中的绝大部分代码对应着CLB的逻辑行为控制。Spartan-3AN系列FPGA的1个CLB由4个Slices构成,每个Slice包含2个LUT4 + 2个FFs,如下图(摘自Xilinx UG331):
image.png

  在使用ISE 14.7进行Spartan-3AN FPGA逻辑程序设计时,ISE的综合属性设置和程序代码风格对综合结果影响较为明显,本文以公司的TPIC6C595_Write.vhd这个IP为例,进行试验性总结。
6.1 ISE相关综合属性参数
        ISE14.7综合属性参数中“Use Clock Enable”、“Use Synchronous Set”、“Use Synchronous Reset”三个参数用于全局性的控制XST在综合时是否使用触发器的控制信号:CE、Reset、Set,每个参数有“Yes、Auto、No”三个选项,如下图:
image.png

        ISE帮助文档对这三个属性参数的描述如下:
image.png

当设为:
Ø  No:禁止XST综合时使用触发器的对应控制引脚。由于综合属性参数是全局参数,当选择此选项时,整个设计中的触发器都不使用对应的控制信号,通常很难满足设计者的意图,故大多数设计并不推荐选择此选项;

Ø  Yes/Auto:设为Yes时,帮助文档的意思是由设计的代码推演控制引脚的使用;设为Auto时,XST结合设计代码推演并考虑整体性能综合评估控制引脚的使用,但具体策略没有进一步的文档可供查阅。试验发现,XST针对Spartan-3AN系列FPGA似乎倾向于多使用触发器的控制引脚,见后文。



 楼主| 发表于 2021-8-15 17:09:36 | 显示全部楼层
6.2.     合理使用触发器控制引脚可节省大量LUT资源
6.2.1.    禁用触发器控制引脚
  将ISE Use Clock Enable”、“Use Synchronous Set”、“Use Synchronous Reset 三个综合属性参数全部设为No,综合TPIC6C595_Write.vhd文件后,查看综合报告:
image.png
  由于禁止XST使用触发器的控制引脚,XST将代码中CEResetSet等功能全部吸收进触发器D输入端的LUT中,导致逻辑级数(Levelsof Logic)增加,设计的整体时序性能下降:
image.png
6.2.2.    使用触发器控制引脚
  将ISE Use Clock Enable”、“Use Synchronous Set”、“Use Synchronous Reset 三个综合属性参数全部设为Auto/Yes(试验发现,对于TPIC6C595_Write.vhd当前的代码,此两种设置综合结果相同),综合后,查看综合报告:
image.png
  合理使用触发器控制引脚,综合后报告的时序性能:
image.png
  可以看到,如果通过ISE的综合属性参数全局性地禁止XST综合时使用触发器的控制引脚,将导致XST在综合时不得不使用更多的LUTs资源(本试验使用的设计,LUTs65114,多消耗了75.38%LUTs),从而不可避免地导致逻辑级数增加,使得整体时序性能下降(本试验使用的设计,综合后报告的时序性能由289.268MHz215.471MHz,下降了25.51%)。




 楼主| 发表于 2021-8-15 18:37:45 | 显示全部楼层
6.2.     合理使用触发器控制引脚可节省大量LUT资源
6.2.1.    禁用触发器控制引脚
  将ISE Use Clock Enable”、“Use Synchronous Set”、“Use Synchronous Reset 三个综合属性参数全部设为No,综合TPIC6C595_Write.vhd文件后,查看综合报告:
image.png
  由于禁止XST使用触发器的控制引脚,XST将代码中CEResetSet等功能全部吸收进触发器D输入端的LUT中,导致逻辑级数(Levelsof Logic)增加,设计的整体时序性能下降:
image.png




 楼主| 发表于 2021-8-15 18:41:07 | 显示全部楼层
6.2.2.    使用触发器控制引脚
  将ISE Use Clock Enable”、“Use Synchronous Set”、“Use Synchronous Reset 三个综合属性参数全部设为Auto/Yes(试验发现,对于TPIC6C595_Write.vhd当前的代码,此两种设置综合结果相同),综合后,查看综合报告:
image.png
  合理使用触发器控制引脚,综合后报告的时序性能:
image.png
  可以看到,如果通过ISE的综合属性参数全局性地禁止XST综合时使用触发器的控制引脚,将导致XST在综合时不得不使用更多的LUTs资源(本试验使用的设计,LUTs65114,多消耗了75.38%LUTs),从而不可避免地导致逻辑级数增加,使得整体时序性能下降(本试验使用的设计,综合后报告的时序性能由289.268MHz215.471MHz,下降了25.51%)。
 楼主| 发表于 2021-8-15 18:47:07 | 显示全部楼层
6.3.     XST针对Spartan-3AN系列FPGA倾向于多使用触发器的控制引脚?
试验发现,当将ISE的综合属性参数“Use Synchronous Reset”设为“Yes/Auto”时,XST似乎更倾向于使用触发器的控制引脚?
6.3.1.    意外综合为FDR的代码风格
  试验用的设计文件中有一个可装载的计数器,并需要比较计数器值,初始代码设计如下:
image.png
  综合后,发现bitCNT_LDbitCNT_IsFull_1bitCNT_IsFull_2这三个信号综合为FDR,并且分别采用两级LUT逻辑实现触发器的Reset信号。尝试修改bitCNT_LDbitCNT_IsFull_1bitCNT_IsFull_2这三个信号在定义时所赋初值分别为'0''1',发现对综合结果没有影响。查看XST综合后的电路如图:
image.png
这样的综合结果有几个缺陷:
Ø  在Slice内,从LUT输出端到对应触发器的D输入端有极低(或零)延迟的专用连线,而没有从LUT输出端到触发器Reset引脚的专用连线,故在最终布线时,会增加一级额外的布线延迟;
   Ø  XST综合报告反映出触发器Reset输入端到Q输出端的门延迟显著大于D输入端到Q输出端的门延迟;
image.png
   Ø 1Slice内部,触发器的控制引脚是分别(CEResetSet)共用的,只有控制引脚相同的触发器在布局/布线阶段可以放置入同一个Slice,对于低扇出控制信号的使用,易导致同Slice内的其它触发器不能被使用,造成资源浪费。Spartan-3AN系列FPGA由于密度较低(1Slice内仅两个触发器,暂未查阅到Xilinx相关文档针对Spartan-3AN触发器低扇出控制信号的设计指南,而到了Spartan-6系列,1Slice内包含8个触发器,Xilinx在多份文档中明确提出应尽量避免低扇出触发器控制信号的使用)
image.png




 楼主| 发表于 2021-8-15 18:49:27 | 显示全部楼层
6.3.2.    避免综合为FDR的代码风格
  将bitCNT_LDbitCNT_IsFull_1bitCNT_IsFull_2三个信号的实现代码修改如下,可避免XST将它们综合为FDR
image.png
  修改后的代码,bitCNT_LDbitCNT_IsFull_1bitCNT_IsFull_2三个信号综合为FD,并且bitCNT_2bitCNT_LD的路径不再是整个设计的关键时序路径。综合后的资源消耗和整体时序性能见前文(6.2.2)章节,可以看到,对于相同的逻辑功能,通过适当的代码风格的控制,更为精确的向开发平台软件(XST)表达设计者的真实意图,可以获得更高性能(甚至更低资源消耗)的设计。
 楼主| 发表于 2021-8-15 18:52:37 | 显示全部楼层
6.4.     高逻辑级数代码的优化
XilinxFPGA的LUTn(LUT4/LUT6),当一个逻辑表达式的输入条件数量小于等于n时,无论此表达式有多么的复杂,XST总是能确保将此表达式综合为1个LUTn,从而将逻辑级数控制为单级;当逻辑表达式的输入条件数量大于n时,情况就变得十分复杂了,例如,一个7输入的逻辑表达式,可能使用1个LUT4+1个LUT4实现,也可能不行。
6.4.1.    一段高逻辑级数的代码
  本文所使用的示例文件中,有如下一段代码,是一个9输入的逻辑表达式:
image.png
  如果单纯的从逻辑表达式输入数量及LUT4输入数量的角度考虑,可能推测XST的综合结果为:第一个逻辑级采用2LUT4,实现8个逻辑输入,第二个逻辑级采用1LUT3,实现前级的两个逻辑输出和第9个逻辑输入。但一定要记住的是:只有当逻辑表达式的输入数量小于等于所采用FPGA系列的单个查找表的最大输入数量时,单个LUTn才能实现任意逻辑表达式,级联LUTn不能实现最小化逻辑级数和LUTn数量的任意逻辑表达式。事实上,XST对示例代码的综合结果为:5LUT + 1MUXF5,共3个逻辑级数,如下图:
image.png
  这个综合结果,直接导致FSM1_IsUpdateTsrIsLoaded这个路径成为整个设计的关键时序路径,从而限制了设计的整体时序性能,查看XST综合后的时序结果如下图:
image.png








 楼主| 发表于 2021-8-15 18:57:05 | 显示全部楼层
6.4.2.    合理地提取逻辑分支到FFs的控制端可提高设计性能
针对本例高逻辑级数的代码,可以采用以下两种方式优化,以降低逻辑级数和减少布线延迟,从而提高设计的时序性能:
1)     提取表达式中的逻辑分支,使表达式结果为'0'的分支,可采用FFs的Reset控制引脚实现;使表达式结果为'1'的分支,可采用FFs的Set控制引脚实现。
但应注意的是:FFs的Reset控制引脚和Set控制引脚之间有优先级关系,Reset控制引脚的优先级高于Set引脚(具体可查阅Xilinx UG331),将表达式的逻辑分支提取至FFs控制引脚时一定要与原表达式的逻辑分支的优先级保持一致。
另:提取的逻辑分支的逻辑输入数量应控制在4以内,确保提取至FFs控制引脚的逻辑表达式可以采用单级LUT或不使用LUT来实现(见前文6.3章节的分析)。
2)     使用Slice内专用MUX,结合LUT实现逻辑表达式。依据Xilinx UG331的介绍,在Slice内部,从LUT输出端到其专用MUX之间有极低(或零)延迟的内部连线,并且MUX的输入到输出的门延迟低于LUT输入到输出的门延迟。从而,大于4输入的逻辑表达式,如果能通过LUT4+MUXF5的方式实现,其逻辑延迟将低于两级LUT级联的逻辑延迟,相应设计可获得更高的时序性能。
依据UG331的介绍,一个Slice内的2个LUT4+1个MUXF5可实现任意5输入的逻辑表达式,如下图(摘自Xilinx UG331):
image.png
依据UG331的介绍,一个Slice内的2个LUT4+1个MUXF5可实现特定的9输入逻辑表达式,如下图(摘自Xilinx UG331):
image.png
采用上述两种方式,可将本例高逻辑级数的代码优化为如下的代码:
image.png
查看XST对优化后的代码综合结果如下图:
image.png
综合后的资源消耗和整体时序性能见前文(6.2.2)章节,可以看到,FSM1_IsUpdate到TsrIsLoaded这个路径不再是整个设计的关键时序路径,同时,优化后的代码还可减少两个LUT资源的消耗。

 楼主| 发表于 2021-8-15 19:03:44 | 显示全部楼层
6.4.3.    基于进位链实现“宽逻辑门”可提高设计性能
XilinxFPGA的Slice具有针对算数运算的专用逻辑资源:进位链(MUXCY)、异或门(XORCY),并在Slice内的LUT、MUXCY、XORCY、FF之间有专用的极低(或零)延迟连线。Slice内的专用算数资源通常用于FPGA逻辑设计中加(减)法器、计数器等设计,但这不是这些专用资源的唯一用途。比如,基于进位链(MUXCY)实现输入数量大、关系复杂的逻辑表达式,并利用进位链的专用极低(或零)延迟连线获得很小的门延迟,从而替代高逻辑级数的级联LUTs的设计,提高设计的整体时序性能。
关于进位链(MUXCY)以及基于进位链设计宽逻辑门(Wide Gate)的原理请参考Xilinx UG331 Chapter 9 UsingCarry and Arithmetic Logic
  例如,下图(摘自Xilinx UG331)即为使用进位链(MUXCY)实现“与门”的示例:
image.png
  针对本例高逻辑级数的代码,原表达式可改写为下式(图中两个表达式是逻辑相等的):
image.png
  改写后的代码可拆分为三个逻辑子式F1F2F3,原逻辑表达式可写为:
TsrIsLoaded  <= F1 and( F2 or F3 )
Ø  F1有两个输入,可以采用1个LUT2实现;
Ø  F2有三个输入,可以采用1个LUT3实现;
Ø  F3有四个输入,可以采用1个LUT4实现;
Ø  完整表达式可以采用:3个LUT+3个级联MUXCY实现。
本例原高逻辑级数的代码改写为基于进位链(MUXCY)实现的代码如下:
image.png
查看XST对优化后的代码综合结果如下图:
image.png

  综合后的资源消耗和整体时序性能见前文(6.2.2)章节,可以看到,FSM1_IsUpdateTsrIsLoaded这个路径不再是整个设计的关键时序路径,同时,优化后的代码还可减少两个LUT资源的消耗,并且未使用带控制引脚的触发器。




您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-9 19:22 , Processed in 0.034651 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表