精华内容
下载资源
问答
  • 原码一位乘法器设计 华中科技大学计算机组成原理 原码
  • 第9关:原码一位乘法器设计.txt
  • 实验一:8位可控加减法电路设计 实验二:原码一位乘法器设计 实验三:MIPS运算器设计

    实验一:8位可控加减法电路设计

    1

    实验二:原码一位乘法器设计

    实验三:MIPS运算器设计

     

    展开全文
  • 在 alu.circ 文件中的原码一位乘法器子电路中,增加控制电路和数据通路,使得该电路能自动完成8位无符号数的一位乘法运算。再设置引脚初始值,然后驱动时钟自动仿真,电路可自动完成运算。运算结束,结果传输到输出...

    实验目的
    学生掌握原码一位乘法运算的基本原理,熟练掌握 Logisim 寄存器电路的使用,能在 Logisim 平台中设计实现一个 8*8位的无符号数乘法器。

    实验内容
    在 alu.circ 文件中的原码一位乘法器子电路中,增加控制电路和数据通路,使得该电路能自动完成8位无符号数的一位乘法运算。再设置引脚初始值,然后驱动时钟自动仿真,电路可自动完成运算。运算结束,结果传输到输出引脚。运算结束时,电路应该自动停止。

    电路框架
    在这里插入图片描述
    在这里插入图片描述
    电路测试
    实验完成后,可利用文本编辑工具打开 alu.circ,将所有文字信息复制粘贴到 Educoder 平台的 alu.circ 文件中,再点击评测按钮即可进行本关测试。平台会对你设计的电路进行自动测试,为方便测试,请勿修改子电路封装,本关测试用例如下:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 八位右移位乘法器虚假的右移位真正的右移位设计文件(方式)综合电路设计文件(方式二)综合电路测试文件仿真波形虚假的右移位其实移位总是相对的,所以右移还是有左移的成分。左移位乘法器很好理解,因为在列竖式的...

    6d21044f86b20fc2acc433ad175b751d.png

    八位右移位乘法器

    • 虚假的右移位
    • 真正的右移位
    • 设计文件(方式一)
      • 综合电路
    • 设计文件(方式二)
      • 综合电路
    • 测试文件
    • 仿真波形

    虚假的右移位

    其实移位总是相对的,所以右移还是有左移的成分。

    左移位乘法器很好理解,因为在列竖式的时候就能看明白,符合我们的常规思维:

    a56cd56e53049073925567cf8a3a05ce.png

    也就是说,每一次乘法之后,只要把对应的部分积左移相应的位数,再相加,就可以得到最终的结果,这个过程像极了小学二年级的乘法课,非常的直观了,这里不做赘述~

    那么什么是右移呢?我听到有同学说,把乘数和被乘数换一下就是了,像这样:

    039e6b4170725b91a8880a7ef236271b.png

    运算顺序从右往左,理论上结果是正确的,就是看起来有点别扭,我们把它转过来:

    a93f76b39bfdaf01ffd38863454d0e09.png

    这下应该看明白了吧,无非是最后的结果再加移位一次,从而实现一个“虚假的右移位”

    真正的右移位

    真正的右移位,其实是针对小数计算而言的,我们计算整数乘法的时候,习惯性的左移,根本原因是我们习惯了整数的小数点在最右侧,只要不超过那个小数点,就可以直接相加得结果。

    而小数计算,因为小数点在左边的缘故,在计算机当中,就可以根据小数点位置不变的思想,来将部分积右移,从而实现一个右移乘法器。这种思想所成的乘法器,也成为定点乘法器

    以二进制小数计算“0.1101 x 0.1011”为例:

    f1df9cb052ce2f3cfaae678288eeb679.png

    由图可以看出,最后一位的结果并不参与移位相加的运算,什么意思呢?

    我们再画详细点:

    3f0cd58f3941252aabfd6841ff59df02.png

    计算时,每次得到的部分积,都会与上一次得到的部分积相加,而每次相加结果的最后一位不参与运算,可直接右移转存,则部分积占用的空间显然比左移运算小多了。这样说,想必应该足够明白了吧?

    设计文件(方式一)

    知道了上述原理,我们来写一个右移位的乘法器,逻辑很清晰,每次根据乘数位是否为0进行判断,如果是0,则部分积=前一步的部分积+0,如果是1,则部分积=前一步的部分积+被乘数,同时每次将部分积的最低位存储至结果的低位中,最后一次的部分积则为结果的高位。

    实现代码如下:

    module mul_8_1(result,mul1,mul2);
        input wire[7:0] mul1;
        input wire[7:0] mul2;
        output reg[15:0] res;
        reg [7:0] A;        //部分积
        integer i;
        reg [7:0] temp_x;   //乘法运算时,被乘数与乘数最后一位的积的最后一位不参与最后的加法运算,将其右移另存。
        always @ (*)
        begin
            A=0;
            for (i=0;i<8;i=i+1)
                begin
                    if(mul2[i]) A=A+{1'b0,mul1};      //部分积移位前可能会比乘数多一位
                    else A=A+9'b000000000;
                    temp_x[i]=A[0];
                    A=A>>1;
                end
                res={A,temp_x};
        end
    endmodule
    

    RTL级电路综合中却很少使用for循环语句。主要原因就是for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,每条执行语句并不能有效地复用硬件逻辑资源,造成巨大的资源浪费。也就是说,for语句循环几次,就是将相同的电路复制几次。循环次数越多,综合电路占用面积越大,综合就越慢。

    所以我们稍微改改写法,就可以解决for循环了。

    综合电路

    23个元件,32IO口,202根线

    57eade89627ecb2764aa648ee664ea85.png

    设计文件(方式二)

    所幸八位的乘法器也并不算复杂,可以写一个并行计算的部分积。这样也就解决了for循环的问题。

    `define size 8
    module mul_8_1(
        input wire [`size - 1:0] mul1,mul2,
        output wire [2*`size - 1:0] res
        );
        wire [`size : 0] A[0:`size-1];
        wire [`size -1 : 0] low_pro;
    
        assign A[0] = mul2[0] ? {1'b0,mul1} : 9'd0;
        assign A[1] = mul2[1] ? ((A[0]>>1) + {1'b0,mul1}) : ((A[0]>>1) + 9'd0);
        assign A[2] = mul2[2] ? ((A[1]>>1) + {1'b0,mul1}) : ((A[1]>>1) + 9'd0);
        assign A[3] = mul2[3] ? ((A[2]>>1) + {1'b0,mul1}) : ((A[2]>>1) + 9'd0);
        assign A[4] = mul2[4] ? ((A[3]>>1) + {1'b0,mul1}) : ((A[3]>>1) + 9'd0);
        assign A[5] = mul2[5] ? ((A[4]>>1) + {1'b0,mul1}) : ((A[4]>>1) + 9'd0);
        assign A[6] = mul2[6] ? ((A[5]>>1) + {1'b0,mul1}) : ((A[5]>>1) + 9'd0);
        assign A[7] = mul2[7] ? ((A[6]>>1) + {1'b0,mul1}) : ((A[6]>>1) + 9'd0);
    
        assign low_pro[0] = A[0][0];
        assign low_pro[1] = A[1][0];
        assign low_pro[2] = A[2][0];
        assign low_pro[3] = A[3][0];
        assign low_pro[4] = A[4][0];
        assign low_pro[5] = A[5][0];
        assign low_pro[6] = A[6][0];
        assign low_pro[7] = A[7][0];
    
        assign res = {(A[7] >> 1),low_pro};
    endmodule
    

    综合电路

    23个元件,32IO口,224根线,和使用for循环的方式相比,多了几根线??!

    好吧果然是我的能力问题,有见解的朋友们请务必说一下,我想学!

    8a816d7f30a4a850f900b57909ca719b.png

    测试文件

    由于两个都是乘法器,输入和输出端口都一样,则可以用同样的测试文件进行测试:

    module mul_tb(
        );
        reg [7:0] mul1,mul2;
        wire [15:0] res;
        reg clk;
        initial begin
            mul1 <= 8'd7;
            mul2 <= 8'd3;
            clk <= 0;
        end
    
        always # 10 clk = ~clk;
        always @ (posedge clk) begin
            mul2 <= mul2 + 1'b1;
        end
        
        mul_8_1 try(.mul1(mul1),.mul2(mul2),.res(res),);
    endmodule
    

    仿真波形

    调成无符号十进制数进行观察,如图所示,7x7=497x8=56,结果正确。

    24d97736d51070a2acad6928690c6b67.png
    展开全文
  • 引言卷积占据了CNN网络中绝大部分运算,进行...利用xilinx器件中LUT的结构特征,设计出的乘法器不但能灵活适应数据宽,而且能最大限度降低LUT资源使用。01Xilinx ultrascale器件LUT结构在这里简要介绍一下ultrasca...

    c58c14e4ad8897cc2a067385ac5883aa.png

    引言

    卷积占据了CNN网络中绝大部分运算,进行乘法运算通常都是使用FPGA中的DSP,这样算力就受到了器件中DSP资源的限制。比如在zynq7000器件中,DSP资源就较少,神经网络的性能就无法得到提升。利用xilinx器件中LUT的结构特征,设计出的乘法器不但能灵活适应数据位宽,而且能最大限度降低LUT资源使用。

    01

    Xilinx ultrascale器件LUT结构

    在这里简要介绍一下ultrascale系列器件中的LUT结构,有助于后边对乘法器设计思路的理解。CLB(configuratble logic block)是主要的资源模块,其包含了8个LUT,16个寄存器,carry逻辑,以及多路选通器等。其中LUT可以用作6输入1输出,或者两个5输入LUT,但是这两个LUT公用输入,具有不同输出。每个LUT输出可以连接到寄存器或者锁存器,或者从CLB输出。LUT可以用于64x1和32X2的分布式RAM,一个CLB内最大可以支持512X1大小的RAM。RAM的读写地址和输入的读写数据是共享的,数据通道可以使用x和I接口。LUT还可以配置用于4:1选通器,CLB最大能够支持到32:1的选通器。CLB中的carry逻辑含有异或门和产生进位的门,用于生成进位数据。

    be03dc0f0d3dde2d2232bcb42534524b.png

    图1.1 LUT结构

    LUT还可以被动态配置成32bit移位寄存器,这个功能在乘法器设计中可以用于改变乘法器的乘数和被乘数。在写入LUT数据的时候,每个时钟周期从D接口进入数据,依次写入32bit数据。读数据的时候,可以通过地址来定位任何32bit中的数据。这样就可以配置成任何小于32bit的移位寄存器。移位输出Q31可以进入下一级LUT用于串联产生更大移位寄存器。在一个CLB中最大可以串联产生256bit移位寄存器。

    58d16add95739a0ec13d834cc83133e8.png

    图1.2 移位寄存器配置

    02

    LUT乘法器原理

    首先假设我们处理整数乘法,小数乘法也可以用这样的方法。基本思想就是将m bit大小的数据进行分割表示:

    2764fe3292e75f0f4f02a77d0ec86d59.png

    其中0<=di<2^q。乘以一个常数K:

    bfdfe69b024d375eb42d0a05a5c2f3f0.png

    这样就将两个数据乘法分解成低bit数据乘法,结果是一个常数K和di相乘,然后再进行移位求和。M bit数据分解后的低bit数据位宽通常都适配LUT输入宽度,这样能最大利用LUT资源。现在乘法只有K*di,由于bit位宽较小,这部分可以用LUT查找表的形式来。预先将0K到(2^q-1)K的数据存储到LUT中,然后通过di来选择对应的数据。如果是负数乘法,那么数据使用补码表示,那么LUT中存储的数据是从-2^(q-1)K到(2^(q-1)-1)K。针对以上介绍的ultrascale器件的LUT6,q可以选择为5。但是在本论文中使用的是LUT4器件,其只有4输入,因此选择了q=3,为什么没有选择4呢?另外1bit是为了用于半加器的实现。

    03

    基本结构

    实现上述累加的方法有很多种,论文中采用了进位链加法器。图2.1中是m bit和n bit数据乘法,每个E结构计算di*K,并且和上一个结构求和,输出的低3bit直接作为最终结果,而n bit传输到下一级进行计算。q=3的计算单元E有[m/3]个。K*di是有n+3bit的查找表实现的。查找表的结果由di选择,然后再通过一个求和器和之前数据求和。这是一个最基本的结构,论文又针对这个结构做了优化,用一个LUT同时实现了一个查找表和半加器。具体来讲,其中3bit输入用于di,还有1bit用于上一次输出,LUT中存放数据是di*K和上一次结果第j bit的半加结果,实际上是第j bit数据LUT中结果的异或。而进位数据由CLB中相应的carry逻辑来计算。相比于粗暴的进行数据求和,这样精确的来控制LUT能够大大节省资源。

    708c97c2075a65777d2795ea1dcfd705.png

    图2.1 基本结构

    6c7b5d72526605d6d906496a9545a294.png

    图2.2 LUT实现乘法和半加,外围carry逻辑实现进位

    04

    动态配置LUT内容

    Xilinx的LUT结构允许在运行过程中改变LUT中的内容,这样的乘法器就能改变被乘数据K。这可以实现在神经网络计算中需要更新权重参数。论文中使用的是LUT4,所以一个LUT可以被配置成16bit移位寄存器。通过这16bit寄存器可以来配置LUT中的内容,每个时钟周期更新1bit数据,16个时钟周期可以完成一个LUT中数据更新。是否进行LUT内容更新通过CE使能信号控制。

    如何产生LUT中数据的值呢?如果上一次输出数据对应bit为0,那么LUT中就存放0*K到7*K的值,如果上一次对应bit为1,那么存放值为对以上数据取反。图4.1表示了获得LUT中内容的电路图。首先数据被初始化为0*K,下一次对应着求和进位为1的情况,取反,然后再加K得到1*K的值,这样每隔两个时钟周期就得到下一个乘法的数据值,依次对LUT进行更新。上述中针对的是正整数,如果对于负数乘法更新,可以在上述求整数乘法的电路基础上做一下改进,如图4.2。当最高位为0的时候,输出结果就是之前求得的乘法结果。如果最高位是1,那么负数的补码表示是乘法的原码结果减去最高位数值。

    940eb511ff1aaa3946ded4babad556e1.png

    图4.1 LUT中内容更新电路图

    cfd8bb7d15a178eb923d3167f9cf464e.png

    图4.2 负数乘法结果更新电路

    05

    结果分析

    最后我们来看看这种乘法器的实现效果,图5.1表示对多级进位不适用pipeline结构的时钟频率随着被乘数K位宽变化,可以看到随着级数E的增加,频率降低很多,这主要是进位链边长导致。而随着K位宽增加,频率也有降低,这主要是因为实现di*K乘法的LUT资源增加导致。

    aef0281a25a621f2bf14c1dc5b831350.png

    图5.1 没有pipeline下频率MHz

    图5.2是不同乘法位宽下的使用slice数量。论文中考虑了两种极端情况,一种是完全pipeline下,即每级计算单元都经过寄存器,另外一种是完全没有pipeline,所有级E都是串联。

    89b8f60aa6fe1cc7b17d157e7af39845.png

    图5.2 slice资源

    结论

    上述通过LUT来设计乘法器的方法,可以应用于CNN中的卷积运算当中,因为权重可以被当做被乘数,用于LUT内容的配置,在更换权重时,可以对LUT内容更新,这样就能避免了DSP资源的限制,不失为一种增加算力的方法。

    文献

    1. Hormigo, J.C., Gabriel Oliver, Juan P.Boemo, Eduardo, Self-Reconfigurable Constant Multiplier for FPGA. ACM Transactions on Reconfigurable Technology and Systems, 2013. 6

    往期回顾

    1. 可变位宽的大规模矩阵乘法

    2. 脉动阵列

    3. 在DNN中FPGA做了什么?

    3710b8e13d7a8d812820a841a43d9a13.png
    展开全文
  • 机器数和机器数的真值在学习原码,反码和补码之前, 需要先了解机器数和真值的概念。1、机器数个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用机器数的最高存放符号,正数...
  • from:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, ......
  • 本篇文章讲解了计算机的原码, 反码和补码....、机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是...
  • 记得当初我曾兴奋地听我一位启蒙技术导师讲解了模拟计算的概念:“你可以轻松使用运算放大对任何信号进行求和和缩放,做微积分或任何数学运算。”作为一名物理专业的学生,我当时立即对将各种量表示为电压和电流的...
  • 作者:ziqiu.zhang链接:... 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学...
  • 、机器数和真值在学习原码反码,补码和移码之前需要先了解机器数和真值的概念。1、机器数个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机中用个数的最高存放符号正数为0...
  • 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用个数的最高存放符号, 正数为0, 负数为...
  • 在用2去除商,又会得到个商和余数,如此进行,知道商为0时为止,然后把先的到的余数作为二进制的低位有效,后得到的余数作为二进制数的高位有效,依次排列起来。 小数部分采用乘2取整法,具体做法:用2乘十进....
  • 期我们讲述了进制数及转换,这期我们来了解计算机原码、反码和补码,本期内容重点是补码。来自网络引入这三种编码的原因是什么?是为了解决计算机减法问题,因为CPU运算中只有加法,所有要把减法转换加法...
  • 在二进制系统中,每个0或1就是,而是数据存储的最小单位,可称之为比特(Bit)。在计算机高级语言(Java)中,整数类型变量中有字节型(byte),它与比特的换算关系为1byte=8bit,也就是1个字节等于8个比特。8个...
  • 今天学习Java时讲到了原码数据弊端,然后就进入了迷惑期。云里雾里听不懂。就上网找嘛。发现是计算机组成原理的知识。然后就想到一张图:太真实了。所以!要关注前沿技术,还有注重基础知识!!冲鸭!!!【搬运自...
  • 本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法....机器数是带符号的,在计算机用个数的最高存放符号, ...
  • 今天给大侠带来基于FPGA的扩频系统设计,由于篇幅较长,分三篇。今天带来第篇,中篇。话不多说,上货。导读在无线通信系统中,普遍使用扩频通信技术,因此扩频技术对通信系统具有重要的现实意义。直接序列扩频技术...
  • 时间送达编辑 | 程序员大白公众号来源丨https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html仅作学术交流,如有侵权,请联系删文本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入...
  • 本篇文章讲解了计算机的原码, 反码和补码....、机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是...
  • https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html上期回顾:TIOBE 最新发布了 9 月编程语言排行榜,C语言稳居第本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用...
  • 本篇文章讲解了计算机的原码、反码和补码,并且进行了深入探求了为何要使用反码和补码,以及更进一步的论证了为何可以用反码、补码的加法去计算原码的减法。论证部分如有不对的地方请各位牛人帮忙指正!希望本文对...
  • 本文通过回顾计算机基础,彻底搞懂计算机里的原码, 反码和补码。并且进行深入探究,为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法。论证部分如有不对的地方请各位牛人帮忙...
  • 半加器的输入为a,b,输出为结果s和进位c,则其关系为 全加器的输入多了个进位cin,输出为结果s和进位输出cout,则其关系为使用多个全加器级联,把每级的进位输出作为下级的进位输入即构成了行波进位加法,...
  • 定点原码一位乘法器设计定点原码一位乘法器设计定点原码一位乘法器设计定点原码一位乘法器设计
  • 原码一位乘法器.rar

    2020-07-11 17:14:17
    原码一位乘,两个原码数相乘,其乘积的符号为相乘两数符号的异或值,数值则为两数绝对值之积。这里是原码的设计与实现,包括说明

空空如也

空空如也

1 2 3 4 5
收藏数 91
精华内容 36
关键字:

原码一位乘法器设计