• 查找表乘法器


         查找表乘法器先将乘法的所有可能结果存储起来,然后将两个相乘的数据组合起来作为“地址”找到相应的结果。例如:

        设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
    case({dina,dinb})
    4'b0000:dout<=0;
    4'b0001:dout<=0;
    4'b0010:dout<=0;
    4'b0011:dout<=0;
    4'b0100:dout<=0;
    4'b0101:dout<=1;
    4'b0110:dout<=2;
    4'b0111:dout<=3;
    4'b1000:dout<=0;
    4'b1001:dout<=2;
    4'b1010:dout<=4;
    4'b1011:dout<=6;
    4'b1100:dout<=0;
    4'b1101:dout<=3;
    4'b1110:dout<=6;
    4'b1111:dout<=9;
    endcase
    end
    endmodule

           该乘法器计算两个2位数相乘只需要一个时钟周期。通过他们的组合,可以构成4位乘法器,代码如下:

    module lookup44(dina,dinb,dout,clk);
    input [3:0] dina,dinb;
    input clk;
    output [7:0] dout;
    reg [7:0] dout;

    reg [1:0] a1,a2,b1,b2;
    wire [3:0] dout1,dout2,dout3,dout4;

    //输入数据拆为高2位和低2位分别缓存
    always @ ( posedge clk )
    begin
    a1<=dina[3:2]; a2<=dina[1:0];
    b1<=dinb[3:2]; b2<=dinb[1:0];
    end

    //将4个乘法运算的结果相加输出
    always @ ( posedge clk )
    begin
    dout<=(dout1<<4)+(dout2<<2)+(dout3<<2)+dout4;
    end

    //调用2位查找表乘法器
    lookup22 mul1(a1,b1,dout1,clk),
    mul2(a2,b1,dout2,clk),
    mul3(a1,b2,dout3,clk),
    mul4(a2,b2,dout4,clk);

    endmodule

          该乘法器计算两个数相乘需要2个时钟周期,在第1个上升沿装载一个数据,第2个上升沿调用查找表乘法器完成2位数相乘,第3个上升沿输出第一个结果,因此从输入到

    输出延迟2个时钟周期。同时在第2个上升沿会装载第二个数据,第3个上升沿会调用查找表乘法器完成2位数相乘,第4个上升沿输出第二个结果。

         用Modelsim仿真结果如下:

        选择XC3S400综合后最小时钟周期如下:

       

       与之前的移位累加乘法器相比,时钟周期有所增加,但是移位乘法器计算一个结果需要4个周期,该乘法器只需要2个周期,总时间还是少的多。

       下面是该乘法器占用资源情况:

      

  • 相关阅读:
    深度学习在graph上的使用
    简单区分单射、满射与双射
    CSS自定义属性expression_r
    在linux命令下访问url
    Linux添加/删除用户和用户组
    mysql命令
    LAMP 版本查看
    php 下载文件
    linux 自动备份数据库
    linux下添加定时任务
  • 原文地址:https://www.cnblogs.com/haigege/p/2210906.html
Copyright © 2020-2023  润新知