一、前言:
verilog是描述硬件语言,直接使用乘号编译器会优化成乘法器IP。
位宽小,一个周期就可以输出结果,位宽大可以选择流水输出。但是乘法器IP也有限制,位宽限制,未知时序等。
常用乘法实现方式移位相加。例如
A = A<<1 ; //完成A * 2
A = (A<<1) + A ; //对应A * 3
A = (A<<3) + (A<<2) + (A<<1) + A ; //对应A * 15
用一个移位寄存器和一个加法器就可以完成乘以3操作,但是乘以15时就需要使用3个移位寄存器和3个加法器,反向思路也可以使用移位相减的方式。注意:有时候数字电路一个周期内并不能完成多个变量相加,多个相加会导致时序不满足。此时,流水线乘法器就有效果。
二、原理:和十进制类似
被乘数按照乘数对应bit位进行移位累加,即便完成相乘过程。假设一个时钟周期只能完成一次累加,那么乘法计算时间最少恰好是乘数的位宽,建议将位宽窄的数当做乘数。
三、verilog设计
module mult_low
#(parameter N=4,
parameter M=4)
(