我在教自己verilog.我在介绍章节中说过要执行除法的书,我们使用'/'运算符或'%'运算符.在后面的章节中,它说分割对于verilog而言太复杂而且无法合成,因此为了执行除法,它引入了一个长算法.
所以我很困惑,不能verilog处理简单划分?/运营商没用吗?
Pau*_*l S 28
这一切都取决于你正在编写什么类型的代码.
如果您正在编写想要合成的代码,那么您打算进入FPGA或ASIC,那么您可能不希望使用除法或模运算符.当你在RTL中放置任何算术运算符时,合成器实例就是一个完成工作的电路; +&的加法器-; 乘数为*.当你写的时候/你要求分频器电路,但分频器电路是一件非常复杂的事情.它通常需要多个时钟周期,并且可能使用查找表.它要求很多综合工具在你写作时推断出你想要的东西a / b.
(显然除以2的幂很简单,但通常你会使用移位运算符)
如果您正在编写您不想合成的代码,例如,测试平台的一部分,那么您可以使用所有想要的分区.
所以为了回答你的问题,/操作员并没有用,但你已经很清楚你在哪里和为什么使用它.同样的情况也是如此*,但程度较低.乘数相当昂贵,但大多数合成器能够推断出它们.
小智 8
你必须考虑硬件.
当你写一个<= b/c时,你要对综合工具说"我想要一个可以在每个时钟周期提供结果并且没有中间管线寄存器的分频器".
如果你计算出创建它所需的逻辑电路非常复杂,特别是对于更高的位数.通常,FPGA不具有用于除法的专用硬件块,因此必须使用通用逻辑资源来实现FPGA.它很可能既大(很多)也很慢(低fmax).
一些合成器无论如何都可以实现它(从快速搜索似乎将会发展),其他人不会打扰,因为他们认为它在实践中不是很有用.
如果你除以常数并且可以得到近似的结果,那么你可以用乘数来做技巧.取你想要除以的数的倒数,乘以2的幂并舍入到最接近的整数.
然后在你的verilog中,你可以通过乘法(在现代FPGAS上不是太昂贵)实现你的近似除法,然后是移位(在硬件中移位固定数量的位基本上是免费的).确保为中间结果允许足够的位.
如果你需要一个确切的答案,或者如果你需要除以一个不是预定义常数的东西,你将不得不决定你想要什么样的分频器.如果您的吞吐量很低,那么您可以使用基于状态机的方法,该方法每n个时钟周期进行一次除法.如果您的吞吐量很高并且您可以负担设备区域,那么采用流水线方法(每个时钟周期进行一次除法(但需要多个周期才能使结果流过)可能更合适.
通常,工具供应商会为这种东西提供预制块(altera称之为宏功能).这些优点是工具供应商可能已经为设备仔细优化了它们.缺点是它们可以带来供应商锁定,如果你想转移到另一个设备供应商,你很可能必须换掉块,你交换它的块可能有不同的特性.
小智 5
所以我很困惑.不能verilog处理简单划分?/运营商没用吗?
verilog综合规范(IEEE 1364.1)实际上表明应支持具有整数操作数的所有算术运算符,但没有人遵循此规范.一些综合工具可以进行整数除法,但其他人会拒绝它(我认为XST仍然会这样做),因为组合划分通常是非常低效的区域.多周期实现是常态,但这些不能从'/'合成.
| 归档时间: |
|
| 查看次数: |
58585 次 |
| 最近记录: |