Xilinx Spartan-3AN的触发器使用

(成都欧开科技有限公司)
前言,本文摘自公司内部培训文件,对网页版阅读效果不满意的同学请移步:
Xilinx Spartan-3AN触发器的使用技巧之一

6. Spartan-3AN的触发器使用

Xilinx FPGA内部最基本、最丰富的可编程逻辑资源称为CLB(Configurable Logic Block),FPGA逻辑程序中的绝大部分代码对应着CLB的逻辑行为控制。Spartan-3AN系列FPGA的1个CLB由4个Slices构成,每个Slice包含2个LUT4 + 2个FFs,如下图(摘自Xilinx UG331):
在这里插入图片描述
在使用ISE 14.7进行Spartan-3AN FPGA逻辑程序设计时,ISE的综合属性设置和程序代码风格对综合结果影响较为明显,本文以公司的TPIC6C595_Write.vhd这个IP为例,进行试验性总结。

6.1. ISE相关综合属性参数

ISE 14.7综合属性参数中“Use Clock Enable”、“Use Synchronous Set”、“Use Synchronous Reset”三个参数用于全局性的控制XST在综合时是否使用触发器的控制信号:CE、Reset、Set,每个参数有“Yes、Auto、No”三个选项,如下图:
在这里插入图片描述
ISE帮助文档对这三个属性参数的描述如下:
在这里插入图片描述
当设为:
 No:禁止XST综合时使用触发器的对应控制引脚。由于综合属性参数是全局参数,当选择此选项时,整个设计中的触发器都不使用对应的控制信号,通常很难满足设计者的意图,故大多数设计并不推荐选择此选项;
 Yes/Auto:设为Yes时,帮助文档的意思是由设计的代码推演控制引脚的使用;设为Auto时,XST结合设计代码推演并考虑整体性能综合评估控制引脚的使用,但具体策略没有进一步的文档可供查阅。试验发现,XST针对Spartan-3AN系列FPGA似乎倾向于多使用触发器的控制引脚,见后文。

6.2. 合理使用触发器控制引脚可节省大量LUT资源

6.2.1. 禁用触发器控制引脚

将ISE的 “Use Clock Enable”、“Use Synchronous Set”、“Use Synchronous Reset” 三个综合属性参数全部设为“No”,综合TPIC6C595_Write.vhd文件后,查看综合报告:
在这里插入图片描述
由于禁止XST使用触发器的控制引脚,XST将代码中CE、Reset、Set等功能全部吸收进触发器D输入端的LUT中,导致逻辑级数(Levels of Logic)增加,设计的整体时序性能下降:
在这里插入图片描述

6.2.2. 使用触发器控制引脚

将ISE的 “Use Clock Enable”、“Use Synchronous Set”、“Use Synchronous Reset” 三个综合属性参数全部设为“Auto/Yes”(试验发现,对于TPIC6C595_Write.vhd当前的代码,此两种设置综合结果相同),综合后,查看综合报告:
在这里插入图片描述
合理使用触发器控制引脚,综合后报告的时序性能:
在这里插入图片描述
可以看到,如果通过ISE的综合属性参数全局性地禁止XST综合时使用触发器的控制引脚,将导致XST在综合时不得不使用更多的LUTs资源(本试验使用的设计,LUTs由65→114,多消耗了75.38%的LUTs),从而不可避免地导致逻辑级数增加,使得整体时序性能下降(本试验使用的设计,综合后报告的时序性能由289.268MHz→215.471MHz,下降了25.51%)。

6.3. XST针对Spartan-3AN系列FPGA倾向于多使用触发器的控制引脚?

试验发现,当将ISE的综合属性参数“Use Synchronous Reset”设为“Yes/Auto”时,XST似乎更倾向于使用触发器的控制引脚?

6.3.1. 意外综合为FDR的代码风格

试验用的设计文件中有一个可装载的计数器,并需要比较计数器值,初始代码设计如下:
在这里插入图片描述
综合后,发现bitCNT_LD、bitCNT_IsFull_1、bitCNT_IsFull_2这三个信号综合为FDR,并且分别采用两级LUT逻辑实现触发器的Reset信号。尝试修改bitCNT_LD、bitCNT_IsFull_1、bitCNT_IsFull_2这三个信号在定义时所赋初值分别为’0’或’1’,发现对综合结果没有影响。查看XST综合后的电路如图:
在这里插入图片描述
这样的综合结果有几个缺陷:
 在Slice内,从LUT输出端到对应触发器的D输入端有极低(或零)延迟的专用连线,而没有从LUT输出端到触发器Reset引脚的专用连线,故在最终布线时,会增加一级额外的布线延迟;
 XST综合报告反映出触发器Reset输入端到Q输出端的门延迟显著大于D输入端到Q输出端的门延迟;
在这里插入图片描述
 在1个Slice内部,触发器的控制引脚是分别(CE、Reset、Set)共用的,只有控制引脚相同的触发器在布局/布线阶段可以放置入同一个Slice,对于低扇出控制信号的使用,易导致同Slice内的其它触发器不能被使用,造成资源浪费。Spartan-3AN系列FPGA由于密度较低(1个Slice内仅两个触发器,暂未查阅到Xilinx相关文档针对Spartan-3AN触发器低扇出控制信号的设计指南,而到了Spartan-6系列,1个Slice内包含8个触发器,Xilinx在多份文档中明确提出应尽量避免低扇出触发器控制信号的使用)
在这里插入图片描述

6.3.2. 避免综合为FDR的代码风格

将bitCNT_LD、bitCNT_IsFull_1、bitCNT_IsFull_2三个信号的实现代码修改如下,可避免XST将它们综合为FDR:
在这里插入图片描述
修改后的代码,bitCNT_LD、bitCNT_IsFull_1、bitCNT_IsFull_2三个信号综合为FD,并且bitCNT_2到bitCNT_LD的路径不再是整个设计的关键时序路径。综合后的资源消耗和整体时序性能见前文(6.2.2)章节,可以看到,对于相同的逻辑功能,通过适当的代码风格的控制,更为精确的向开发平台软件(XST)表达设计者的真实意图,可以获得更高性能(甚至更低资源消耗)的设计。

6.4. 高逻辑级数代码的优化

Xilinx FPGA的LUTn(LUT4/LUT6),当一个逻辑表达式的输入条件数量小于等于n时,无论此表达式有多么的复杂,XST总是能确保将此表达式综合为1个LUTn,从而将逻辑级数控制为单级;当逻辑表达式的输入条件数量大于n时,情况就变得十分复杂了,例如,一个7输入的逻辑表达式,可能使用1个LUT4+1个LUT4实现,也可能不行。

6.4.1. 一段高逻辑级数的代码

本文所使用的示例文件中,有如下一段代码,是一个9输入的逻辑表达式:
在这里插入图片描述
如果单纯的从逻辑表达式输入数量及LUT4输入数量的角度考虑,可能推测XST的综合结果为:第一个逻辑级采用2个LUT4,实现8个逻辑输入,第二个逻辑级采用1个LUT3,实现前级的两个逻辑输出和第9个逻辑输入。但一定要记住的是:“只有当逻辑表达式的输入数量小于等于所采用FPGA系列的单个查找表的最大输入数量时,单个LUTn才能实现任意逻辑表达式,级联LUTn不能实现最小化逻辑级数和LUTn数量的任意逻辑表达式”。事实上,XST对示例代码的综合结果为:5个LUT + 1个MUXF5,共3个逻辑级数,如下图:
在这里插入图片描述
这个综合结果,直接导致FSM1_IsUpdate到TsrIsLoaded这个路径成为整个设计的关键时序路径,从而限制了设计的整体时序性能,查看XST综合后的时序结果如下图:
在这里插入图片描述

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):
    在这里插入图片描述
    依据UG331的介绍,一个Slice内的2个LUT4+1个MUXF5可实现特定的9输入逻辑表达式,如下图(摘自Xilinx UG331):
    在这里插入图片描述
    采用上述两种方式,可将本例高逻辑级数的代码优化为如下的代码:
    在这里插入图片描述
    查看XST对优化后的代码综合结果如下图:
    在这里插入图片描述
    综合后的资源消耗和整体时序性能见前文(6.2.2)章节,可以看到,FSM1_IsUpdate到TsrIsLoaded这个路径不再是整个设计的关键时序路径,同时,优化后的代码还可减少两个LUT资源的消耗。

6.4.3. 基于进位链实现“宽逻辑门”可提高设计性能

Xilinx FPGA的Slice具有针对算数运算的专用逻辑资源:进位链(MUXCY)、异或门(XORCY),并在Slice内的LUT、MUXCY、XORCY、FF之间有专用的极低(或零)延迟连线。Slice内的专用算数资源通常用于FPGA逻辑设计中加(减)法器、计数器等设计,但这不是这些专用资源的唯一用途。比如,基于进位链(MUXCY)实现输入数量大、关系复杂的逻辑表达式,并利用进位链的专用极低(或零)延迟连线获得很小的门延迟,从而替代高逻辑级数的级联LUTs的设计,提高设计的整体时序性能。
关于进位链(MUXCY)以及基于进位链设计宽逻辑门(Wide Gate)的原理请参考Xilinx UG331 Chapter 9 〝Using Carry and Arithmetic Logic〞。
例如,下图(摘自Xilinx UG331)即为使用进位链(MUXCY)实现“与门”的示例:
在这里插入图片描述
针对本例高逻辑级数的代码,原表达式可改写为下式(图中两个表达式是逻辑相等的):
在这里插入图片描述
改写后的代码可拆分为三个逻辑子式F1、F2、F3,原逻辑表达式可写为:
TsrIsLoaded <= F1 and ( F2 or F3 )
 F1有两个输入,可以采用1个LUT2实现;
 F2有三个输入,可以采用1个LUT3实现;
 F3有四个输入,可以采用1个LUT4实现;
 完整表达式可以采用:3个LUT+3个级联MUXCY实现。
本例原高逻辑级数的代码改写为基于进位链(MUXCY)实现的代码如下:
在这里插入图片描述
查看XST对优化后的代码综合结果如下图:
在这里插入图片描述
综合后的资源消耗和整体时序性能见前文(6.2.2)章节,可以看到,FSM1_IsUpdate到TsrIsLoaded这个路径不再是整个设计的关键时序路径,同时,优化后的代码还可减少两个LUT资源的消耗,并且未使用带控制引脚的触发器。

6.5. 后记

虽然本文的设计示例基于Xilinx Spartan-3AN FPGA完成,但Xilinx FPGA CLB的基本架构原理在使用上没有本质的变化,查找表 + 触发器 + 专用多路开关 + 算数逻辑 + 本地极低(或零)延迟连线构成Slice,相邻的Slice再构成CLB,整个FPGA内的CLB再通过互连矩阵联接。
故,本文所表达的一些设计思想同样适用于Xilinx 6系列、7系列、UltraSCALE系列、UltraSCALE+系列FPGA的逻辑设计:
 像对待知心朋友一样对待我们的软硬件平台。对待朋友,我们要倾听(有事儿没事儿就看看它们的手册,听听它们的故事)。咱们这个朋友有时很害羞(它的故事有些难懂),它还有点儿任性(时不时的会误会我们的意思,也许是我们自己没表达清楚?又或许是我们自己也不知道自己在说什么?),所以,我们要倾述,有事儿没事儿跟这个朋友整两杯(写两段代码?),当然别把它灌醉哦(看看它给你的电路?)
 合理的使用触发器的控制引脚替代部分逻辑可获得更高的设计性能;
 合理的将触发器控制引脚的功能吸收进触发器前端的LUT可获得更高的设计性能;
 查找表 + 专用多路开关 + 算数逻辑 + 极低(或零)延迟本地连线实现多输入的复杂逻辑,性能超乎你想象。
当然,Xilinx各系列FPGA CLB的基本架构原理在使用上只是没有本质的变化,并不表示它们是相同的(都是朋友,性格总有些区别的),所以,这些手册常伴吧:
 UG331 Spartan-3 Generation FPGA User Guide;
 UG364 Virtex-6 FPGA Configurable Logic Block User Guide;
 UG384 Spartan-6 FPGA Configurable Logic Block User Guide;
 UG474 7 Series FPGAs Configurable Logic Block User Guide;
 UG574 UltraScale Architecture Configurable Logic Block User Guide。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值