我在教自己verilog。我正在遵循的书中介绍了要执行除法的章节,我们使用'/'运算符或'%'运算符。在后面的章节中,它表示划分对于verilog来说太复杂而且无法合成,因此为了执行除法,它引入了一个很长的算法。
所以我很困惑,不能verilog处理简单划分? /操作员没用吗?答案 0 :(得分:27)
这完全取决于您正在撰写的代码类型。
如果你正在编写想要合成的代码,你打算进入FPGA或ASIC,那么你可能不想使用除法或模运算符。当你在RTL中放置任何算术运算符时,合成器实例就是一个完成工作的电路; +
&的加法器-
; *
的乘数。当你写/
时,你要求分频电路,但分频电路是一个非常复杂的事情。它通常需要多个时钟周期,并且可能使用查找表。当你写a / b
时,它要求很多综合工具来推断你想要的东西。
(显然除以2的幂很简单,但通常你会使用移位算子)
如果您正在编写不想合成的代码,例如测试平台的一部分,那么您可以随意使用除法。
所以要回答你的问题,/
运算符并非毫无用处,但你对于使用它的地点和原因非常有用。 *
也是如此,但程度较轻。乘数非常昂贵,但大多数合成器能够推断它们。
答案 1 :(得分:7)
你必须用硬件思考。
当你写一个< = b / c时,你要对综合工具说#34;我想要一个能够在每个时钟周期提供结果并且没有中间pipline寄存器的分频器"。
如果你计算出创建它所需的逻辑电路非常复杂,特别是对于更高的位数。通常,FPGA不具备用于除法的专用硬件模块,因此必须使用通用逻辑资源来实现FPGA。它可能既大(很多)也很慢(低fmax)。
有些合成器无论如何都可以实现它(从快速搜索似乎将会发展),其他人不会因为他们认为它在实践中非常有用而烦恼。
如果要除以常数并且可以得到近似结果,那么你可以用乘数来做技巧。取你想要除以的数的倒数,乘以2的幂并舍入到最接近的整数。
然后在您的verilog中,您可以通过乘法(在现代FPGAS上不太昂贵)实现近似除法,然后进行移位(在硬件中移位固定数量的位基本上是免费的)。确保为中间结果留出足够的位。
如果你需要一个确切的答案,或者你需要除以一个不是预定义常数的东西,你将需要决定你想要什么样的分频器。如果您的吞吐量很低,那么您可以使用基于状态机的方法,该方法每n个时钟周期进行一次除法。如果您的吞吐量很高并且您可以负担设备区域,那么采用流水线方法(每个时钟周期进行一次除法(但需要多个周期才能使结果流过)可能更合适。
工具供应商通常会为这类东西提供预制块(altera称之为宏功能)。这些优点是工具供应商可能已经为设备仔细优化了它们。缺点是它们可以带来供应商锁定,如果你想转移到另一个设备供应商,你很可能必须换掉这个块,你交换它的块可能有不同的特性。
答案 2 :(得分:5)
所以我很困惑。不能verilog处理简单划分?是/运营商 无用?
verilog综合规范(IEEE 1364.1)实际上表明应支持具有整数操作数的所有算术运算符,但没有人遵循此规范。一些综合工具可以进行整数除法,但其他人会拒绝它(我认为XST仍然会这样做),因为组合划分通常是非常低效的区域。多周期实现是常态,但这些不能从'/'。
合成答案 3 :(得分:4)
分区和模数永远不会“简单”。如果可以,请避免使用它们,例如:通过位掩码或移位操作。特别是变量除数在硬件中实现起来非常复杂。
答案 4 :(得分:3)
“语言Verilog”处理除法和模数很好 - 当您使用计算机模拟代码时,您可以完全访问它的所有功能。
当您将代码合成到特定芯片时,存在局限性。限制倾向于基于工具供应商认为“合理”而不是可行的东西。
在过去,除了2的幂以外的任何东西被认为对硅来说是不合理的,因为它占用了大量空间并且运行得非常慢。目前,一些合成器会为您创建“除以恒定”电路。
将来,我认为没有理由为什么合成器不应该为你创建一个分频器(或者使用未来潜在架构的DSP模块中的分频器)。它是否会有待观察,但见证了乘数的增长(从“仅两个幂”到“一个输入常数”到“完全实现”在短短几年内)
答案 5 :(得分:1)
答案 6 :(得分:0)
使用' /'在verilog中是可能的。但它不是一个可综合的运营商。使用' *'进行乘法的情况也是如此。有一些算法可以用verliog来执行这些操作,如果代码需要是可合成的,则使用它们。即。如果你需要一个等效的硬件。
我不知道任何划分算法,但对于乘法,我使用了Booth的算法。
答案 7 :(得分:0)
如果您想要可合成的代码,则可以使用Divison_IP或对某些除法使用右移运算符,例如64/8 = 8 same 64 >> 3 = 8。
答案 8 :(得分:0)
硬件的划分并不简单,因为人们花了很多时间在一个高效的 以快速乘法器为例。但是,您可以通过在硬件中右移一位来轻松地除以 2。
答案 9 :(得分:-9)
使用result <= a/b
并且效果很好。
请记住,在使用<=
运算符时,会立即计算答案,但会在下一个时钟上升沿的“结果”寄存器中输入答案。
如果您不想等到下一个时钟正边沿使用result = a/b.
请记住,任何算术运算电路都需要一些时间来完成操作,在此期间电路会产生随机数(位)。
就像A-10疣猪攻击飞机攻击坦克一样,它射出了很多子弹。这就是分频器电路在分频时的作用,它会随机发出随机位。经过几纳秒后,它将完成分割并返回稳定的良好结果。
这就是我们等到“结果”寄存器的下一个时钟周期的原因。我们试图保护它免受随机垃圾数量的影响。
分区是最复杂的操作,因此计算会有延迟。对于16位除法,结果将在大约6纳秒内计算。