查找表乘法器先将乘法的所有可能结果存储起来,然后将两个相乘的数据组合起来作为“地址”找到相应的结果。例如:
设A,B为两个2位二进制数,则A,B各有4种取值可能,乘积有4*4=16种可能(排除重复的其实只有8种可能),我们先将{A,B}对应的16种可能结果存储起来,
然后对于每一特点的输入组合{A,B},找到对应的输出即可。该方式速度很快,只取决于读取存储器的速度,但是预存结果要占用较多资源,因此是面积换取
速度思想的体现。
同时,随着乘数位宽的增加,需要存储的结果迅速增加,不利于实现,因此该方式适用于位宽很小的情况。但是我们可以将高位宽的数据分解成低位宽的数据
再调用查找表乘法器。例如:
设A,B为两个8位数据,可将A分解为A=A1×16+A2,其中A1为高4位,A2为低4位;同理B=B1×16+B2,然后
A×B=(A1×16+A2)×(B1×16+B2)=A1*B1*16*16 + A1*B2*16 + A2*B1*16 + A2*B2
这样就将两个8位数的相乘转化为4组4位数相乘,然后再相加,其中乘以常数可以通过移位运算实现。对于2N位数据A,可分解为 A=A1×2^N+A2
下面是2位查找表乘法器的代码:
module lookup22(dina,dinb,dout,clk);
input [1:0] dina,dinb;
input clk;
output [3:0] dout;
reg [3:0] dout;
always @ ( posedge clk )
begin