精华内容
下载资源
问答
  • 八位二进制乘法器.zip

    2020-11-02 22:10:22
    移位相加的方法设计一个8位二进制串行乘法器。基于EP4CE1022C8芯片,于Quartus Ⅱ 13.1中实现。包含仿真文件,上板子验证成功。此为西电EDA课设大作业,实验报告见博客,仅供参考。
  • 八位二进制乘法器VHDL

    千次阅读 2020-11-02 21:56:08
    八位二进制乘法器VHDL工程文件一、 实验目的二、设计要求三、实验仪器与环境四、实现原理五、系统设计及仿真六、顶层设计:七、结果仿真:附录: 工程文件 点击下载八位二进制乘法器工程文件 一、 实验目的 熟习...

    工程文件

    点击下载八位二进制乘法器工程文件

    一、 实验目的

    1. 熟习Quartus Ⅱ软件的使用。
    2. 掌握原理图输入法和硬件描述语言**(VHDL)**方法来设计逻辑电路。
    3. 对设计电路作硬件验证。展示;

    二、设计要求

    1. 用移位相加的方法设计一个乘法器,实现八位二进制的乘法
    2. 考虑数据输入口的数量不足16位,实现分拍置数的功能

    三、实验仪器与环境

    1. 芯片:EP4CE1022C8
    2. 编程与仿真环境:Quartus Ⅱ 13.1
    3. 输入输出验证平台:西安电子科技大学数电试验箱

    四、实现原理

    (一)二进制数的乘法
    如下图(4.1.1)所示,这两种数制的乘法都是把被乘数和乘数的每一位分别相乘,然后将得到的乘积根据所乘的乘数的位数进行移位,比如,在十进制数乘法中,如果将被乘数与乘数的个位相乘,那就把得到的乘积向左移动0位;如果被乘数与乘数的十位相乘,那就把得到的乘积向左移动1位…移位操作完成后,最后将这些移位后的乘积相加,就是最开始这两个被乘数与乘数的结果。
    我们都知道,在二进制数中,只有数字0和1。在二进制数乘法中,如果与被乘数相乘的乘数的某一位为1,那结果就是被乘数本身,如果乘数的某一位为0,那此次的结果就是0。因此,二进制数乘法过程中的数次相乘,其实使用与门实现的。
    在这里插入图片描述图4.4.1
    (二)分拍输入原理
    两个8位二进制数相加需要16个输入引脚,但实验板空间有限,只好一次只输入一个8位二进制数,分两拍输入到上述的乘法器主体中。
    通过设计置数端完成节拍的掌控,第一个数输入完毕后置数端置一,若置数成功,则第一个灯亮起。第二个数置数完毕后,再将置数端置一。若置数成功,则第二个灯亮起。此时输入模块同时输出两个乘数。

    五、系统设计及仿真

    (一)乘法器主体模块(mulity_8bit)
    在这里插入图片描述

    图(5.1.1)
    该模块共有4个输入端,一个输出端,其中clk为1kHz时钟信号,x和y为两个8位二进制乘数。Start端为1时开始计数,8个时钟周期后result端输出结果。Start端为0时输出为零。
    该模块用一个模10计数器实现,亦可以认为是一个三状态的有限状态机。
    S0:在计数为0时为第一状态,初始化乘法器,所有变量赋初值。
    S1:在计数为1~8时,每次计数时完成以下三步
    (1) 乘数右移一位。
    (2) 根据乘数最后一位是否为1判断是否需要做移位后的加法。
    (3) 乘积向左移动1位
    S2:在计数为9时,输出结果。
    具体实现代码见附录
    仿真波形如图(5.1.2),仿真时实现了
    00100101×001010100000110×00000011
    在这里插入图片描述
    图(5.1.2)
    (二)分拍输入模块(inp)
    在这里插入图片描述
    图(5.2.1)
    该模块共有4个输入端,4个输出端,其中clk为1kHz时钟信号,num端为8位二进数输入端,set为置数端,clear为清零端。x,y为8位二进数输出端。ok_x,ok_y为置数成功显示端。
    分拍输入有寄存器实现,通过检测set的次数给X,Y赋值。使用流程如下:

    1. num的引脚置高低电平
    2. set置1,Led_x亮起,set置0。
    3. num的引脚置第二个数
    4. set置1,Led_y亮起,set置0。置数完成。
    5. clear恢复初始状态。
    6. 重复1~5步骤进行第二组输入。
      仿真实现上述步骤,如图(5.2.2):
      在这里插入图片描述
      如图(5.2.2)

    六、顶层设计:

    在这里插入图片描述
    图(6.1.1)

    七、结果仿真:

    软件仿真:在这里插入图片描述
    图(7.1.1)
    硬件测试:
    【1】选择对应芯片:
    在这里插入图片描述
    图(7.2.1)
    【2】无用管脚选三态:
    在这里插入图片描述
    图(7.2.2)
    【3】分配管脚:
    在这里插入图片描述

    图(7.2.3)
    【4】下载测试

    附录:

    (1)Inp.vhd:

    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.STD_LOGIC_ARITH.ALL;
    USE IEEE.STD_LOGIC_UNSIGNED.ALL;
    ------------------------------------------------------
    ------------实体inp实现分拍输入数据---------------------
    ------------------------------------------------------
    ENTITY inp IS
    	PORT(
    		clk    : IN STD_LOGIC;									--系统时钟
    		num	 : IN STD_LOGIC_VECTOR(7 downto 0);			--输入两次8位操作数
    		set	 : IN STD_LOGIC;									--置数端,高电平有效. num的信号赋值结束后,产生一个高脉冲可输入一个数
    		clear  : IN STD_LOGIC;									--清零端,高电平有效. 恢复初始状态. set为1时不可用
    		OK_x	 : OUT STD_LOGIC;									--第一个数置数成功显示端
    		OK_Y	 : OUT STD_LOGIC;									--第二个数置数成功显示端
    		x	    : OUT STD_LOGIC_VECTOR(7 downto 0);		--输出8位乘数x
    		y      : OUT STD_LOGIC_VECTOR(7 downto 0)			--输出8位乘数y
    	);
    END ENTITY inp;
    ------------------------------------------------------
    ----------------分拍输入使用流程------------------------
    ------------------------------------------------------
    ----1. num的引脚置高低电平------------------------------
    ----2. set置1,Led_x亮起,set置0---------------------
    ----3. num的引脚置第二个数-----------------------------
    ----4. set置1,Led_y亮起,set置0---------------------
    ------------------------------------------------------
    ARCHITECTURE BEHAVIOR OF inp IS
    SIGNAL tem_x   : STD_LOGIC_VECTOR(7 downto 0);			--result的中间结果
    SIGNAL tem_y   : STD_LOGIC_VECTOR(7 downto 0);			--result的中间结果
    BEGIN
    process(clk)
    VARIABLE count : INTEGER:=0;
    VARIABLE Flag  : INTEGER:=0;									--Flag为set信号标志位,放置在第二个时钟信号到来时(count已经等于1)进入y的赋值阶段。
    begin
    IF(clk'EVENT AND clk = '1')THEN
    	IF(set = '1')THEN
    		IF(count=0)THEN
    			tem_x<=num;												--若count为0,则将操作数赋值给x。
    			OK_x<='1';												--将第一个led灯点亮。
    			count := count + 1;
    			Flag := 0;
    		ELSIF(count=1 and Flag = 1)THEN
    			tem_y<=num;												--若count为1,则将操作数赋值给y。
    			OK_y<='1';												--将第二个led灯点亮。
    			count:= count+1;
    			Flag := 0;
    		END IF;
    	ELSE
    		Flag := 1;													--set为零时,Flag记录为1IF(clear = '1')THEN										--clear为1时,清空状态信息。
    			tem_x<="00000000";
    			tem_y<="00000000";
    			OK_x<='0';
    			OK_Y<='0';
    			count := 0;
    			Flag := 0;
    		END IF;
    	END IF;
    	x<=tem_x;
    	y<=tem_y;
    END IF;
    end process;
    END BEHAVIOR;
    

    (2) mulity_8bit.vhd:

    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.STD_LOGIC_ARITH.ALL;
    USE IEEE.STD_LOGIC_UNSIGNED.ALL;
    ------------------------------------------------------
    ----实体mulity_8bit通过串行乘法实现8位二进制乘法---------
    ------------------------------------------------------
    ENTITY mulity_8bit IS
    	PORT(
    		clk    : IN STD_LOGIC;									--系统时钟
    		x	    : IN STD_LOGIC_VECTOR(7 downto 0);			--8位乘数x
    		y      : IN STD_LOGIC_VECTOR(7 downto 0);			--8位乘数y
    		start	 : IN STD_LOGIC;									--START为1时置数,为0时不工作
    		result : OUT STD_LOGIC_VECTOR(15 downto 0)		--16位结果
    	);
    END ENTITY mulity_8bit;
    ------------------------------------------------------
    --------------------串行乘法---------------------------
    ------------------------------------------------------
    ARCHITECTURE BEHAVIOR OF mulity_8bit IS
    SIGNAL p     : STD_LOGIC_VECTOR(15 downto 0);			--p,t为中间变量,记录每次一位相乘的结果
    SIGNAL t     : STD_LOGIC_VECTOR(15 downto 0);
    SIGNAL tem   : STD_LOGIC_VECTOR(15 downto 0);			--result的中间结果
    SIGNAL y_reg : STD_LOGIC_VECTOR(7 downto 0);				--y变量寄存器
    BEGIN
    PROCESS(clk,start)
    VARIABLE count : INTEGER:=0;
    VARIABLE Flag : INTEGER:=0;									--计算完成标志,等于1时计算完成,终止计算进程,将结果持续输出
    BEGIN 
    IF(clk'EVENT and clk = '1')THEN
    	IF(start = '1')THEN
    		IF(Flag = 0)THEN
    			IF(count = 9) THEN 								   --count= 9时,完成8次累加后将结果寄存于tem,ok置1
    				count := 0;
    				tem <= p;
    				Flag := 1;
    			ELSIF(count = 0) THEN								--count = 0时,赋初值
    				p(15 downto 0) <= "0000000000000000";
    				y_reg <= y;
    				t(7 downto 0)<= x(7 downto 0);
    				t(15 downto 8)<="00000000";
    				count := 1;
    			ELSE														--count在1~8时,移位累加
    				IF (y_reg(0) = '1') THEN
    					p <= p + t;
    				ELSE p <= p;
    				END IF;
    			y_reg(6 downto 0)<=y_reg(7 downto 1);			 --y_reg右移一位
    			y_reg(7) <= '0';
    			t(15 downto 1) <= t(14 downto 0);				 --t左移一位
    			t(0) <= '0';
    			count := count + 1;
    			END IF;
    		ELSIF (Flag = 1) THEN
    			result <= tem;
    		END IF;
    	ELSIF(start = '0')THEN
    		result <= "0000000000000000";
    		Flag:= 0;
    	END IF;
    END IF;
    END  PROCESS;
    END BEHAVIOR;
    
    
    展开全文
  • 四位二进制乘法器设计报告原理此四位乘法器主要运用多次错位相加运算来实现乘法运算。由开关控制输入高电平或低电平产生两个二进制数(高电平有效),利用与门实现一位和四位的乘积运算,再将两次的乘积输入加法器,...

    四位二进制乘法器设计报告

    原理

    此四位乘法器主要运用多次错位相加运算来实现乘法运算。由开关控制输入高电平或低电平产生两个二进制数(高电平有效),利用与门实现一位和四位的乘积运算,再将两次的乘积输入加法器,得到的和与进位与下一个乘积再进行加法运算。设两个二进制数分别是被乘数D1C1B1A1和乘数D2C2B2A2,得到结果Y8Y7Y6Y5Y4Y3Y2Y1,可以把乘法运算分解成四个一位与四位的乘积和三次错位相加。错位相加时累计和的最后一项可以直接输出为乘积的最低位,剩下三位和进位端再与高位乘积相加,每次相加后的最低位直接接到CD4511未接的最低位,经过三次相加就可以得到乘积。

    以1011和1101为例

    1101

    *1011

    110 eq \o\ac(□,1) (Y1)

    +1101

    1001 eq \o\ac(□,1) (Y2)

    +0000

    100 eq \o\ac(□,1) (Y3)

    +1101

    10001 (Y8—Y4)

    网上有的乘法器电路图一般采用反复进行移位和加法来进行乘法计算,依靠寄存器不断左移实现错位,而我直接把最低位输出到数码管,将进位端作为最高位进行下一步计算,在接线时就完成了移位,省去了寄存器的使用,使电路更加简单。

    主要器件

    74ls283 3片

    74ls08 4片

    开关 8个

    数码管 4个

    CD4511 2片

    10KΩ电阻 8个

    470Ω电阻 14个

    芯片介绍

    74ls08:由四个与门组成

    74ls283:加法器,(5,3,14,12,6,2,15,11)8个脚输入两个乘数,(4,,1,13,10)四个脚输出,7脚输入低电平控制芯片做加法,9脚是进位端。

    CD4511:用于驱动共阴极 LED (数码管)显示器的 BCD 码-七段码译码器,无法显示十六进制数的A-E。

    原理图

    仿真

    3*7=1*16+5=21

    11*11=7*16+9=121

    运算结果举例

    乘数

    被乘数

    乘积十位

    乘积个位

    十进制数

    1111(15)

    1111(15)

    E(224)

    1

    225

    1101(13)

    1101(13)

    A(160)

    9

    169

    1011(11)

    1101(13)

    8(128)

    F(15)

    143

    1011(11)

    1001(9)

    6(96)

    3

    99

    1001(9)

    1001(9)

    5(80)

    1

    81

    0111(7)

    0111(7)

    3(48)

    1

    49

    0101(5)

    0101(5)

    1(16)

    9

    25

    遇到的问题

    用protues仿真时输出直接接BCD码的数码管,显示的是十六进制数,焊接时用了CD4511,A-E消隐导致乘积只能显示0-9,有A-E就无法显示。

    展开全文
  • 8位二进制乘法采用移位相加的方法。即用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加...
  • 二进制乘法原理

    万次阅读 2015-03-21 21:29:41
    二进制乘法原理:就是左移(进位)8次,每次最高位为1则加进去,8位移完就得出乘积了实际上和我们做10进制的乘法是一样的,只不过这里的进制是2罢了比如5×6,转成二进制就是0101×0110 十进制乘法大家都会做,公式...

    二进制乘法原理:

               1111B*1111B=11100001

                                               1111

                                             11110

                                           111100   

                                      +1111000     二进制相加   

                            ------------------------ 

                                      11100001

                                

    就是左移(进位)8次,每次最高位为1则加进去,8位移完就得出乘积了实际上和我们做10进制的乘法是一样的,只不过这里的进制是2罢了。

    比如5×6,转成二进制就是0101×0110 十进制乘法大家都会做,公式就是我们他当成十进制101×110来计算下看看

     4位乘积=被乘数×千位被+被乘数×百位+被乘数×十位+被乘数×个位既0101×0110=101×0000+101×100+101×10+101×0 变化下:

     4位乘积=被乘数×千位数×1000+被乘数×百位数×100+被乘数×10位数×10+被乘数×个位数

    既0101×0110=101×(0×1000)+101×(1×100) +101×(1×10)+101×0

     再变化下: 4位乘积=被乘数×千位数×10×10×10+被乘数×百位数×10×10+被乘数×10位数×10+被乘数×个位数

    既0101×0110=101×(0×10×10×10)+101×(1×10×10)+101×(1×10)+101×0 =(((101×0)×10)+(101×1))×10+(101×1))×10+101×0 

    ,实际上乘法结果就是被乘数乘以每一位乘以模(10)的N次方的累计和(其实左移位就是进位啦,看得出来吗?)而换成2进制的话很简单,把10读成二进制2就行了,结果还是:

     4位乘积=被乘数×千位数×10×10×10+被乘数×百位数×10×10+被乘数×10位数×10+被乘数×个位数

    既0101×0110=101×(0×10×10×10)+101×(1×10×10)+101×(1×10)+101×0 =(((101×0)×2)+(101×1))×2+(101×1))×2+101×0 

    由于乘2就是移位(进位),把上面的公式中乘2换成左移位就行了 PS:由于二进制只有0和1,乘2可以用左移一位来实现,也可以“自己加自己”来实现的,很多CPU的左移指令和“自己加自己”一样用软件乘法要耗费很多CPU时间,只要CPU有硬件乘法器,当然是用硬件的啦,哪会快很多的.

    展开全文
  • quartus软件设计实现8位二进制乘法器电路

    万次阅读 多人点赞 2018-03-25 10:40:29
    二、设计目标采用移位相加的方法实现8位二进制乘法器电路。用户通过输入两个8位二进制数Y和B,八位乘法器可以实现其乘积,并输出结果。三、实现方案(包括原理框图和HDL设计流程图)该乘法器是由8位二进制加法器构成...

    一、选题目的

    1、学会使用quartus软件设计电路及对其进行仿真,设计实现8位二进制乘法器电路。

    2、学习并掌握8位二进制乘法器的原理、设计、分析和测试方法。

    二、设计目标

    采用移位相加的方法实现8位二进制乘法器电路。用户通过输入两个8位二进制数Y和B,八位乘法器可以实现其乘积,并输出结果。

    三、实现方案(包括原理框图和HDL设计流程图)

    该乘法器是由8位二进制加法器构成的以时序方式设计的乘法器,通过逐项移位相加原理来实现。用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加得的和右移一位再与第三次得到的部分积相加,再将相加的结果右移一位与第四次得到的部分积相加。直到所有的部分积都被加过一次即可得到相应的乘积。

    在这里,我们用Y代表被乘数,B寄存器存放乘数N,A累加寄存器存放部分积,而A和B相级联又构成了一个16bit的移位寄存器,每次移位时A中最低位的数被移入B的最高位,经过8次部分积相加位的操作,完成1次乘法运算,乘数N恰好被移出寄存器B,寄存器B中保存的就是运算积的低8位数据,而寄存器A中保存的是运算积的高8位数据。

    由于乘数的每一位不是0就是1 ,对应的部分积不是0就是被乘数本身,所以实际作部分积相加这一步时,只要根据乘数的对应位判断:如该位为1,则将累加器中的数据加上被乘数再移位;如该位为0时,就不加被乘数而直接移位。

    移位相加的次数用一个时钟控制计数器来控制,由于第一个时间脉冲被用于A累加寄存器的置数,并无移位操作,故设计电路时采用了模为9的计数器来实现8位移位操作。当计数器计得9个数时,发出一个信号,使电路停止操作,并输出运算结果。

    两个n位二进制数相乘的结果最多可以有2n位的二进制数。

    例如:被乘数(M7M6M5M4M3M2M1M0)和乘数(N7N6N5N4N3N2N1N0)

    分别为11010101和10010011,其计算过程如下图(a):


    原理框图和简单流程图如下图(b)和图(c):


    四、设计过程

    1、模9计数器cnt9的设计

    模9计数器由时钟控制,开始时由异步置数端RST进行清置“1”操作。当RST为高电平且使能端EN为高电平时,每来一个时钟上升沿,计数器计一个数,直到内部变量Q计到“10”时,即在第九个上升沿时,输出端COUT输出1,变量Q回到初始值“1”。

    该模块元件的程序如下:

    LIBRARY IEEE;

    USE IEEE.STD_LOGIC_1164.ALL;

    USEIEEE.STD_LOGIC_UNSIGNED.ALL;

    ENTITY cnt9 IS

        PORT(CLK,RST,EN:IN STD_LOGIC;

                    COUT:OUTSTD_LOGIC);

    END cnt9;

    ARCHITECTURE behav OF cnt9IS

    BEGIN

    PROCESS(CLK,RST,EN)

       VARIABLE Q:STD_LOGIC_VECTOR(3 DOWNTO 0);

    BEGIN   

      IF RST='0' THEN Q:="0001";

          ELSIF CLK'EVENT AND CLK='1' THEN

                        IF EN='0'THEN

                                 IFQ<"1010" THEN Q:=Q+1;

                                 ELSE Q:="0001"; 

                                   END IF;

                                END IF;

      END IF;

     IF Q="1010"       THEN COUT<='1';

        ELSE COUT<='0';

     END IF;

    END PROCESS;

    END behav;

    2、具有使能端的d触发器dffen的设计

    D触发器由使能端EN控制,当EN为低电平时对输出端Q进行清零操作,当EN为高电平时将输入端D赋给输出端Q。

    该模块元件的程序如下:

    LIBRARY IEEE;

    USE IEEE.STD_LOGIC_1164.ALL;

    USEIEEE.STD_LOGIC_UNSIGNED.ALL;

    ENTITY dffen IS

        PORT(EN:IN STD_LOGIC;

                   D:INSTD_LOGIC_VECTOR(7 DOWNTO 0);

                   Q:OUTSTD_LOGIC_VECTOR(7 DOWNTO 0));

    END dffen;

    ARCHITECTURE behav OF dffenIS

    BEGIN

    PROCESS(D,EN)

    BEGIN   

       IF EN='0' THEN Q<=(OTHERS=>'0');

          ELSE  Q<=D;

       END IF; 

    END PROCESS;

    END behav;

    3、累加寄存器SHFTA的设计

    累加寄存器A虽然与寄存器B相级联构成16位移位寄存器,但就累加寄存器A本来而言并不是严格意义上的寄存器。SHFTA工作时先由清零端CLR高电平清零,之后每一个时钟上升沿置一次数,用于存放部分积的和。输出端DOUT为一个8位二进制数,其最高位存放右移值SR,在乘法器电路中SR存放部分积和的进位;其后7位存放部分积和的高7位,形成模拟的“移位”操作。输出端QB存放部分积的最低位,用于向B寄存器移位。

    该模块元件的程序如下:

    LIBRARY IEEE;

    USE IEEE.STD_LOGIC_1164.ALL;

    USEIEEE.STD_LOGIC_UNSIGNED.ALL;

    ENTITY SHFTA IS

        PORT(CLK,CLR,SR:IN STD_LOGIC;

                   DIN:INSTD_LOGIC_VECTOR(7 DOWNTO 0);

                   QB:OUTSTD_LOGIC;

                   DOUT:OUTSTD_LOGIC_VECTOR(7 DOWNTO 0));

    END SHFTA;

    ARCHITECTURE behav OF SHFTAIS

     SIGNAL REG8:STD_LOGIC_VECTOR(7 DOWNTO 0);

     SIGNAL Q:STD_LOGIC;

    BEGIN

     PROCESS(CLK,CLR)

     BEGIN 

             IF CLR='1' THENREG8<=(OTHERS=>'0');Q<='0';

                ELSIF CLK'EVENT ANDCLK='1' THEN

                   REG8<=DIN;Q<=SR;

                        END IF;  

          DOUT<=Q&REG8(7 DOWNTO 1);

    END PROCESS;

    QB<=REG8(0);

    ENDbehav;

    4、移位寄存器B的设计

    移位寄存器B工作时先由输入端LOAD高电平置数,置入乘数B,再由时钟脉冲上升沿控制移位操作,先把内部信号REG8的高7位赋给它的低7位,再把输入端SR接收到的值赋给REG8的最高位,即把A的最低位移入B中。为了在输出最后结果时,乘积的低8位和高8位能够正常的连接,输出端DOUT的设计也与A规则相同,输出最高位为SR,低7位为REG8高7位的8位二进制数,QB输出B的最低位,用于控制加法器中从取出的右移后的部分积的和是与0相加还是与被乘数相加。

    该模块元件的程序如下:

    LIBRARY IEEE;

    USEIEEE.STD_LOGIC_1164.ALL;

    USEIEEE.STD_LOGIC_UNSIGNED.ALL;

    ENTITY SHFTB IS

        PORT(CLK,LOAD,SR:IN STD_LOGIC;

           DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

           QB:OUT STD_LOGIC;

           DOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

    END SHFTB;

    ARCHITECTURE behav OF SHFTBIS

     SIGNAL REG8:STD_LOGIC_VECTOR(7 DOWNTO 0);

    BEGIN

     PROCESS(CLK,LOAD)

     BEGIN 

              IF LOAD='1' THENREG8<=DIN;

                ELSE IF CLK'EVENTAND CLK='1' THEN

                 REG8(6 DOWNTO0)<=REG8(7 DOWNTO 1);REG8(7)<=SR;

                       END IF;

               END IF;

    END PROCESS;

    QB<=REG8(0);

    DOUT<=SR&REG8(7DOWNTO 1);

    END behav;

    5、8位二进制乘法器的顶层设计

    其顶层电路图如图:


    如图所示,当异步输入端LOAD为高电平时,累加寄存器A清零,同时移位寄存器置乘数,之后每次时钟上升沿到来时,由B中数据最低位控制dffen的EN使能端,当EN为0时,输出0,当EN为1时,输出被乘数Y,由此可实现从A中取出的右移过的部分积的和是与0或被乘数Y相加的判断和选择,即实现了被乘数Y与0相乘或与1相乘的操作。B寄存器每次移位时,最高位置入的均为A中部分积的和的最低位,即实现A与B的级联移位操作。部分积的和移位8次完成时,即计数器计9次时间脉冲时,计数器的COUT端输出1到使能端EN,使计数器停止置数,同时控制乘积输出端的两个普通d触发器输出分别输出乘积的高8位和低8位。。

    五、遇到问题及解决方法

    1、一开始从电路尽可能简洁这方面考虑,想尽可能使用少一些的模块或者尽可能使用相同的模块简化电路设计,所以花了大量的时间试图让同一个移位寄存器模块实现累加器A和移位寄存器B的功能,但是由于A和B两寄存器工作原理很不相同,导致原理图连线反而更加复杂和逻辑错乱。

    解决方法:放弃用同一寄存器同时实现两个功能的想法,改而设计不同寄存器模块SHFTA和SHFTB分别实现累加寄存器A和移位寄存器B的功能。

    2、每一次进行累加操作时,部分积需要先移位,再与下一个部分积相加,而累加寄存器A每次时间脉冲到来时只实现置数操作,当我想改变程序实现累加寄存器A在同一时间上升沿既置数又移位时,却发现寄存器A根本不能工作,输出0。据分析,出现这种的原因在于在同一时间上升沿同时实现对同一个内部变量的操作会产生冲突,导致寄存器A不能正常工作。

    解决方法:放弃让累加寄存器进行移位操作,改用虚拟“移位”的方式,让8位二进制输出端DOUT的最高位置“右移输入端”SR的值,即将加法器的进位端置最高位,而后7位数据置内部变量REG8的前7位数,实现虚拟的“移位”操作。

    3、在进行乘法操作时,计数器cnt9从0计到9,理应在第九个时间脉冲时COUT输出1,控制输出端输出乘积,可是在进行仿真时我发现,COUT端在第八个时间脉冲到来时总要有一个窄脉冲出现(见最后一道波形),导致输出两次乘积。据分析,出现这种情况的原因在于计数器从7计到8,即从“0111”计到“1000”时,由于数据翻转出现延迟,会短暂的出现“1001”,导致计数器感应到“9”,从而COUT输出1,控制输出端输出乘积。

    其仿真波形如下:


    解决方法:改变计数器从0计到9的计数方式,使其从1计到10,即从“0001”计到“1010”,避免了由于翻转不及时导致的计数错误。

    六、实现结果

    输入 8位二进制数的乘数B和被乘数Y,该乘法器实现其乘积,并分高8位和低8位输出结果。

    仿真波形如下:


    如图所示,在第九个时间脉冲上升沿到来时,输出端h输出乘积的高8位,输出端l输出乘积的第8位。

    七、对该课程的实施意见及建议

    在程序设计和原理图设计的过程中,我通过对quartus的学习和使用,锻炼了自己的编程能力,也学会了如何在遇到错误的时候冷静分析原因,利用对中间量的观测对程序进行调试和改进,对EDA课程和HVDL语言的理解有了很大的提升。



    展开全文
  • 计算机基础知识之二进制乘法

    千次阅读 2020-02-12 14:25:55
    那么二进制乘法是如何计算的呢? 我们都知道十进制的乘法,比如20.0*10=200.也就是小数点向右移动一位,如果是除以10的话,小数点就想左移动一位就可以了。 如果是二进制的话,也是同样的道理。只不过改成了2的幂次...
  • verilog之8位二进制乘法

    千次阅读 2017-05-05 11:12:39
    两个8位二进制数a,b,c=a*b;将输入a,b和结果c显示到七段管上,用十六进制表示,a用两个七段管,b用两个七段管,c用四个七段管module mutiple(a,b,outa1,outa2,outb1,outb2,out1,out2,out3,out4); input[7:0] a,b;...
  • 二进制乘法器是数字电路的一种元件,它可以将两个二进制数相乘,乘法器是由更基本的加法器组成。----------维基百科 一、两个二进制数相乘原理 举例:,实现相乘过程如下: 图1 两个二进制数相乘过程 由图...
  • 虽然很早就接触了二进制,却一直没有正视这个问题,阅读《计算机科学导论》的时候,基本上是跳过了这一部分,总是以“这么基础的东西,反正工作中基本用不上”的理由给搪塞过去。最近正在阅读《编码》和《程序员的...
  • 在硬件电路中,常采用二进制乘法器,因此只讲二进制乘法器的原理。二进制乘法原理与十进制乘法原理类似,都是将乘数的每一位和被乘数相乘,除此之外,二进制乘法还有其自身的特点,这对于硬件设计极为关键。 二进制...
  • 设计、实现八位二进制数全加器 设计思路 总体设计为三输入,两输出。具体:实体声明部分描述电路模块的端口,即指定输入输出口及其大小。设计具有8位位宽的矢量或总线端口信号a,b以及标准一位输入的cin。然后在...
  • 二进制移位实现加减乘除

    万次阅读 2016-03-10 00:41:56
    1. 题目描述 如何使用位操作分别实现整数的加减乘除四种运算? 2. 解决方案 需要熟练掌握一些常见功能的位操作实现,具体为: ... 常用的等式:-n = ~(n-1) = ~n+1 ... 去掉整数n的二进制中最后一个1
  • 1.二进制乘法原理介绍 理论部分引用于书籍:基于FPGA的数字信号处理[高亚军 编著] 二进制乘法原理与十进制乘法原理类似,都是将乘数的每一位分别与被乘数相乘,除此之外,二进制乘法还有其自身的特点,这对于硬件...
  • 移位相加实现乘法

    2008-04-11 14:46:41
    移位相加实现乘法,是很好的代码程序
  • 设计要求: 设计一个4位二进制乘法器,如下图所示。其中,a[3:0]为被乘数,b[3:0]为乘数,m[7:0]为积,即乘法结果。
  • --移位相加 begin sum:=(others=>'0'); for i in 0 to 2 loop temp_a:=(others=>'0'); temp_a(i+2 downto i):=a; if b(i)='1' then sum:=sum + temp_a; end if; end loop; y; end process; c; d; e; f; end ...
  • 二进制数与十进制数的转换 聊二进制数的运算前,我们先看看二进制数的值与十进制数的值是如何相互转换的, 十进制转换成二进制 ...只需将二进制数的各数位的值和位权相乘,然后将相乘的结果相加即可,有木有...
  • 一、多项式乘法 对于每个组成分量,有如下的实现电路: 综合来看: 、多项式除法 更为一般性的推导,p(X)为被除式,q(X)为商式,r(X)为余式。不妨假设gn-k=1。 若被除式p(X)中Xn-k的系数...
  • 而必乂审而必乂审计算机组成原理实验报告PAGEPAGE #而必乂审而必乂审计算机组成原理实验报告PAGEPAGE #基于复杂模型机两个8位二进制乘法的实现评语:课中检查完成的题号及题数:课后完成的题号与题数:成绩:自评分...
  • 16x16移位相加乘法器verilog实现

    千次阅读 2016-08-27 11:30:00
    本人个人认为:两个二进制数之间相乘,就是用乘数从最低位开始,每一位依次去和被乘数相乘,最终再将每一次所得的乘积相加,这样就得到了最终的乘积。但要注意的是,和十进制数的乘法类似,用乘数的某一位去和被...
  • 共回答了22个问题采纳率:90.9%计算机的乘法是"移位"->"相加".举例来说:1010*0011=?a=1010; b=0011.那个是乘数,那个是被乘数都没关系,不加区别;先看b的最高位,=0,则移位a,并乘以0;次高位=0,同理,...得出四个...
  • 数字电路基础知识——组合逻辑电路(乘法器的设计) 乘法器的设计主要应用在数字信号处理和数字通信,本节主要介绍乘法器的四种实现方法。...移位相加乘法器 三、查找表乘法器 四、加法器乘法器 五、乘累加器
  • Verilog实现二进制有符号定点数的乘法运算

    千次阅读 多人点赞 2020-08-12 15:44:33
    Verilog实现有符号数乘法运算二进制运算原理1、无符号二进制数(signed)运算 二进制运算原理 总结最近FPGA的学习,使我明白了一件事:在Verilog程序的编写中,“位”(bit)这一概念,对于程序编写至关重要,...
  • FPGA乘法器原理(二进制数/浮点数)

    千次阅读 2018-07-10 11:42:45
    两个二进制数相乘的计算见下图1:  图1:二进制数相乘  实质是根据被乘数(1011_1011)根据乘数(1101)进行移位相加,具体来说,data_out[11:0] = 1011_1011&lt;&lt;3 + 1...
  • 二进制乘除法

    千次阅读 2020-06-23 23:15:45
    计算机中原码的乘除运算是通过移位完成的,那么二进制乘除... 所以可推出二进制乘法即相当于移位操作 举个例子:1.1101(1.8175) * 11.1011(3.6875) 结果为110.10101111(6.68359375) 过程如下: 1. 11.1011中
  • 十进制与二进制数的相互转换,可以通过移位操作和取倒每一位数操作两种方法......
  • 二进制A=0011 ---A=3 左移1位A1=0110 ---A1=6 左移2为B=1100 ---B=12

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,914
精华内容 1,565
关键字:

二进制乘法移位相加