数电— 4位并行乘法器的电路设计与仿真
- 格式:doc
- 大小:66.50 KB
- 文档页数:4
一、概述利用四位二进制寄存器、全加器以及D触发器等元器件,实现四位二进制乘法器的控制部分和乘法的实现部分。
成法是加法的简便运算乘法运算只能通过加法运算以及移位运算来实现。
在控制端用四个触发器产生四个控制信号来控制实现的加法移位功能,实现端在控制端信号作用下依次执行置零、加法、移位和循环操作。
二、方案说明设计一个4位二进制乘法器,可以存储其乘积。
电路原理框图如图1所示。
乘法器可以利用家发起和寄存器实现。
图1 乘法器原理框图寄存器B存放被乘数,寄存器Q存放乘数,两个乘积长度可能是原来的2倍,故计算完成后将累加和高位放入寄存器A,而Q放寄存器的低位,P 记录乘数的位数,每形成一个部分P加1,当P=4时,乘法结束,两数之积放在AQ寄存器中。
控制端产生四个控制信号分别为T0、T1、T2、T3。
在初态T0时,被乘数和乘数已分别存于寄存器B和Q中,等待启动信号S的到来,当S=1时控制器进入状态T1,在此状态下A、E、P清零,准备乘法操作。
从状态T2开始,控制器进入累计部分积的循环操作过程。
首先检验乘数的最低有效位Q1。
如Q1=1,A和B相加结果存于A和E之中;如果Q1=0,不做加法运算。
无论Q1为何值,都要将计数器P加1。
在状态T3,合成寄存器EAQ右移一位得到累计的部分积,时检测P之值,如果P不等于4,状态返回T2,继续累计部分积的过程。
如果P=4,停止循环,系统返回初始状态T0。
三、电路设计1、控制器设计根据图2所示的ASM图表,可以设计二进制乘法器的控制器。
图2 二进制乘法器ASM图表四个D触发器的驱动方程为:D0=T0S’+T3Z=((T0S’)’·(T3Z)’)’D1=T0S=((T0S)’)’D2=T1+T3Z’=(T1’·(T3Z’)’)’D3=T2控制器仿真电路如图2所示。
控制器中S为启动信号,高电平有效,系统开始工作时应使T0=1,T1=T2=T3=0,故图中设置了Reset信号(负脉冲)图2 二进制乘法器的控制逻辑图2. 二进制乘法器数据处理器(1) A寄存器A寄存器具有并入、移位、同步清0和保持功能。
4位乘法器的设计乘法器是计算机中非常重要的组成部分,用于实现数字乘法运算。
在设计4位乘法器时,需要考虑到多个方面,如计算的准确性、速度和功耗等。
本文将详细探讨4位乘法器的设计原理、逻辑电路实现以及性能分析。
1.乘法器的基本原理乘法操作是通过将被乘数与乘数一位一位地相乘,再将各位的结果相加得到最终的乘积。
因此,4位乘法器的设计需要考虑到每一位乘法的计算和结果的累加。
2.乘法器的逻辑电路实现2.14位乘法器的简单实现最简单的方法是采用两个4位二进制数相乘的定义,即将每一位的乘积相加得到最终的结果。
这可以通过4个并行的与门和一些全加器来实现。
具体的逻辑电路图如下所示:A0───────┐┌─────A1───────┤├─────A2───────┤├─────A3───────┤├─────AND0 OR0 CoutB0───────┐│B1───────┤XOR0B2───────┤B3───────┘从上图可以看出,A0到A3和B0到B3分别作为输入,经过与门得到各位的乘积,然后通过一系列的全加器将乘积相加得到最终结果。
在这种设计中,每个位的计算之间是并行的,因此可以快速得到乘法运算的结果。
2.2优化的4位乘法器上述简单实现的4位乘法器虽然能够实现乘法运算,但其性能方面存在一些不足。
为了提高性能,可以采用更复杂的逻辑电路设计。
一种常见的优化方法是使用布斯加算器(Booth's Algorithm)来实现乘法运算。
这种方法通过将乘法运算转化为位移和加减运算来减少乘法的次数,从而提高性能。
具体的实现方法如下:1)将被乘数和乘数拓展到5位,比特位B4作为符号位,初始值为0。
2)将被乘数拓展为4位乘子,乘数拓展为5位乘数。
3)初始化中间结果为0。
4)迭代循环4次进行乘法运算,每次进行下面的步骤:-如果乘数的最低位和符号位相同,什么都不做。
-如果乘数的最低位为0且前一位为1,将乘数和被乘数相加。
-如果乘数的最低位为1且前一位为0,将乘数和被乘数相减。
基于Verilog 的乘法器设计一、设计目标使用Verilog 语言实现4bit*4bit 乘法器设计,并使用Quartes 编写程序,使用modelsin 进行仿真验证设计二、基本原理2.1半加器半加器是为两输入两输出的加法电路,输入无进位,真值表如下图所示,输入X,Y,输出C,SX Y C S 0 0 0 0 0 1 0 1 1 0 0 1 111最简积之和式为 S=X`Y+XY`=X ○+Y;C=XY. 电路图为:2.2全加器全加器是为三输入两输出,输入存在进位,真值表如下图所示,输入X,Y,Z,输出C,SX Y Z C S 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 11111化简最简积之和式为:S=X`Y`Z+X`YZ`+XY`Z`+XYZ; C=XY+XZ+YZ; 通过使用半加器组成全加器进行化简为:S=Z(X`Y`+XY)+Z`(X`Y+XY`)=Z(X ○+Y)`+Z`(X ○+Y)=X ○+Y ○+Z123YX C123123Y X`X Y`123S123C123X YSguan tian liangC 的卡诺图如下图X YZ 00 01 11 10 0 0 0 1 0 1111按两两结合 C=XY+YZ+XZ 换一种结合方式 C= XY+XY`Z+X`YZ=Z(XY`+X`Y)+XY=Z(X ○+Y)+XY 电路图如下所示(使用两个半加器与一个或门)123123X Y123123SZ123C多位二进制加法实现 2.2.1 行波进位加法器B2A3B3C3C4C2C1C0S0S1S2S3FA FALL_ADD A1B2Cout 3Cin4S5FA FALL_ADD A1B2Cout 3Cin4S5FAFALL_ADDA1B2Cout 3Cin4S5FAFALL_ADD A1B 2Cout 3Cin4S5A0B0A1B1A2行波进位加法器优点在于结构逻辑简单,缺点速度很慢,在最坏情况下,进位必须从最低有效位传到最高有效加法器,假设同时给出所有加数位,则总的最长延迟为:CinSCinCout ABCout ADD t t n t t +⨯−+=)2(ABCoutt 为最低有效级上从A 或B 到Cout 的延迟,CinCoutt 为中间级上Cin 与Cout 的延迟,CinSt 为最高有效位上从Cin 到S 的延迟。
乘法器电路的设计与实现乘法器电路是一种用于实现数字信号的乘法运算的电路。
在数字电子系统中,乘法运算是十分常见的操作之一。
乘法器电路的设计与实现对于数字电子系统的性能和效率具有重要影响。
乘法器电路的设计是基于数字逻辑门电路的原理。
在数字电子系统中,逻辑门电路是基本的构建模块。
常用的逻辑门包括与门、或门、非门等。
乘法器电路的设计可以通过组合逻辑电路和时序逻辑电路来实现。
组合逻辑电路是指输出只与当前的输入有关,不依赖于之前的输入。
而时序逻辑电路是指输出不仅与当前的输入有关,还与之前的输入有关。
乘法器电路的设计过程可以分为几个关键步骤。
首先是确定乘法器的位数。
乘法器电路的位数决定了它可以处理的数字的范围。
位数越多,乘法器可以处理的数字范围越大。
然后是确定乘法器的输入和输出的编码方式。
在数字电子系统中,常用的编码方式包括二进制和十进制。
接下来是确定乘法器的运算规则。
乘法器可以实现有符号数和无符号数的乘法运算。
最后是选择适当的逻辑门电路来实现乘法器。
乘法器电路的实现需要考虑一些关键因素。
首先是电路的布局和连接。
乘法器电路中的逻辑门电路需要正确地布局和连接,以确保信号能够正确地传输和处理。
其次是电源和地的连接。
电源和地的连接是电路正常工作的基础,必须保证良好的接触和稳定的电源供应。
此外,还需要考虑电路的稳定性和抗干扰能力。
乘法器电路需要能够稳定地工作,并且能够抵抗来自外部的干扰。
乘法器电路的设计和实现也可以通过计算机辅助设计软件来完成。
计算机辅助设计软件可以提供方便快捷的设计工具和仿真环境,大大提高了设计的效率和准确性。
通过计算机辅助设计软件,设计人员可以轻松地进行逻辑门电路的布局和连接,并进行电路的仿真和验证。
乘法器电路的设计与实现是数字电子系统设计的重要组成部分。
乘法器电路的性能和效率对于数字电子系统的整体性能具有重要影响。
设计人员需要仔细考虑乘法器电路的位数、编码方式、运算规则等因素,并选择适当的逻辑门电路来实现乘法器。
设计思想:确定该乘法器工作的基本原理是首先生成部分积,再将这些部分积相加得到乘积。
设计的基本思想为:从被乘数的最低位开始移位,若移出位为1,则乘数左移后与上一次的和相加,若移出位为0,则乘数左移后以全0相加,循环上述操作,直至被乘数的最高位。
主要是进行移位、相加两项操作的重复。
乘法器设计根据乘法器工作原理可知,确定输入与输出。
输入的两个乘数分别为din[4 .. 0]、din1 [4.. 0],另外clk、clr作为控制输入,dout[7..0]作为输出。
由分析可知乘法器原理框图包括右移寄存器(sregb)、8位寄存器(regb)、选通与门(andarith)、4位加法器(adder4)四部分。
其中,sreg4b对被乘数进行右移移位,andarith对乘数与被乘数相乘过程中的部分积进行相与,adder4对右移寄存器的移位位数进行计数,regb对乘数和被乘数相乘之后的结果进行存储。
下面分别对各部分元件进行设计,然后再由这些元件构成整个乘法器电路图。
1)设计一个右移寄存器(sregb)LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY sregb ISPORT( clk : IN STD_LOGIC;load : IN STD_LOGIC;din : IN STD_LOGIC_VECTOR(3 downto 0);qb : OUT STD_LOGIC);END sregb;ARCHITECTURE sregb_architecture OF sregb ISSIGNAL regb : STD_LOGIC_VECTOR(4 DOWNTO 0);BEGINPROCESS (clk, load)BEGINIF load = '1' THEN regb<= din;ELSIF CLK'EVENT AND CLK = '1' THENregb(2 DOWNTO 0) <= regb(3 DOWNTO 1);qb <= regb(0);END IF;END PROCESS;END sregb_architecture;2)设计一个选通与门(andarith)LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY andarith ISPORT( qb: IN STD_LOGIC;din1 : IN STD_LOGIC_VECTOR(3 downto 0);dout1 : OUT STD_LOGIC_VECTOR(3 downto 0) );END andarith;ARCHITECTURE andarith_architecture OF andarith ISBEGINPROCESS(qb, din1)BEGINFOR i IN 0 TO 3 LOOPDOUT1(i) <= DIN1(i) AND qb;END LOOP;END PROCESS;END andarith_architecture;3)设计一个计数器(adder4)LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;ENTITY adder4 ISPORT( dout1 : IN STD_LOGIC_VECTOR(3 downto 0);dout : IN STD_LOGIC_VECTOR(7 downto 4);s : OUT STD_LOGIC_VECTOR(4 downto 0));END adder4;ARCHITECTURE adder4_architecture OF adder4 ISBEGINs <= ('0' & dout1) + ('0'& dout) ;END adder4_architecture;4)设计一个8位寄存器(rega)LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY rega ISPORT( clk : IN STD_LOGIC;load : IN STD_LOGIC;s : IN STD_LOGIC_VECTOR(3 downto 0);dout : OUT STD_LOGIC_VECTOR(7 downto 0) );END rega;ARCHITECTURE rega_architecture OF rega ISSIGNAL R8S : STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINPROCESS(clk, load)BEGINIF load = '1' THEN R8S <= (OTHERS =>'0') ; --清零部分积 ELSIF rising_edge(clk) THENR8S(2 DOWNTO 0) <= R16S(3 DOWNTO 1); --右移低3位R8S(7 DOWNTO 3) <= s; --将加法和输入锁到高5位Load= '0 ';END IF;END PROCESS;dout <= R8S;END rega_architecture;。
数字电子技术课程设计报告题目: 4位乘法器的设计学年 2009-2010 学期 2专业***** 班级:***学号:****** 姓名:***指导教师: ***8时间:2010年3 月1 日~2010 年3 月4 日浙江万里学院电子信息学院目录一、设计任务与要求 (3)二、设计总体方案 (3)三、各单元模块电路的设计实施方案 (5)四、结果分析 (7)五、体会和总结 (10)附录一、电路设计总图 (10)附录二、主要芯片引脚图 (10)1、 设计任务与要求试设计一4位二进制乘法器输入信号:4位被乘数A (A 3 A 2 A 1 A 0),4位乘数B (B 3 B 2 B 1 B 0),启动信号START 。
输出信号:8位乘积P (P 7 P 6 P 5 P 4 P 3 P 2 P 1 P 0),结束信号END 。
当发出一个高电平的START 信号以后,乘法器开始乘法运算,运算完成以后发出高电平的END 信号。
2、设计总体方案移向-加法器数混合乘法器实现框图如图所示,主体包括寄存序列、与逻辑和加法器等三部分。
乘数通过实现框图看出其原理就是:被乘数与乘数进入寄存序列,然后通过与逻辑和加法器的运算后得到被乘数与乘数的乘积。
其中启动信号用来启动乘法运算,而清零信号则为积存器和计数器的清零信号。
可以确定乘法器的表达式为:B AII B AI B AII AI Y ⨯+⨯⨯=⨯+⨯=222)2(移向-加法器树混合乘法器算法方案框图设计出的移向-加法器树混合乘法器框。
END P AB START1 0 1 11 1 0 1×1 0 1 10 0 0 01 0 1 11 0 1 111011001移向-加法器数混合乘法结构框图从结构框图中可以看出:被乘数与4位二进制乘数的低二位通过寄存器相乘得到的6位的2进制数部分积,然后被乘数与4位二进制的高二位在通过寄存器阵列相乘后也得到了6位2进制数部分积。
2个部分积通过加法器后得可以得到8位2进制乘积了。
4位数字乘法器设计
设计一个4位数字乘法器需要考虑多个方面,包括硬件设计和
算法实现。
首先,在硬件设计方面,可以使用逻辑门、寄存器和加法器等
元件来实现。
可以将两个4位的输入数分别存储在两个寄存器中,
然后使用逻辑门和加法器来实现乘法运算。
具体来说,可以使用乘
法器的部分积计算方法,将被乘数的每一位与乘数的每一位相乘,
并将结果相加得到最终的乘积。
另外,还需要考虑溢出和进位的处理。
在乘法过程中,可能会
产生进位,需要确保算法能够正确处理进位。
同时,乘法的结果可
能会超出4位的表示范围,因此需要考虑如何处理溢出的情况。
在算法实现方面,可以采用乘法的基本原理,逐位相乘并累加
的方法来实现4位数字的乘法运算。
可以使用循环结构来逐位相乘
并累加,同时考虑进位和溢出的情况,确保算法的正确性和稳定性。
总的来说,设计一个4位数字乘法器需要综合考虑硬件设计和
算法实现两个方面,确保乘法器能够正确高效地进行4位数字的乘法运算。
实验二四位流水线乘法器一、实验目的1.了解四位并行乘法器的原理。
2.了解四位并行乘法器的设计思想和流水线的实现方法。
3.掌握用VHDL 语言实现基本二进制运算的方法。
二、实验内容与要求通过开关和键盘输入两组4BIT的二进制数据,按照二进制加法器原理进行加和,求出和及进位,并通过LED显示灯输出显示,完成编译、综合、适配、仿真、实验箱上的硬件测试。
三、实验原理流水线结构的并行乘法器的最大有点就是速度快,尤其实在连续输入的乘法器中,可以达到近乎单周期的运算速度。
流水线乘法器是组合逻辑电路实现无符号数乘法的方法上发展而来的。
其关键是在组合逻辑电路的基础上插入寄存器。
假如有被乘数A 和乘数B,首先用A 与B 的最低位相乘得到S1,然后再把A 左移1 位与B 的第2 位相乘得到S2,再将A 左移3 位与B 的第三位相乘得到S3,依此类推,直到把B 的所有位都乘完为止,然后再把乘得的结果S1、S2、S3……相加即得到相乘的结果。
需要注意的是,具体实现乘法器是,并不是真正的去乘,而是利用简单的判断去实现,举个简单的例子。
假如A 左移n 位后与B 的第n 位相乘,如果B 的这位为‘1’,那么相乘的中间结果就是A 左移n 位后的结果,否则如果B 的这位为‘0’,那么就直接让相乘的中间结果为0 即可。
带B 的所有位相乘结束后,把所有的中间结果相加即得到A 与B 相乘的结果。
在此基础上插入寄存器即可实现流水线乘法器。
四、实验平台(1)硬件:计算机、GX-SOC/SOPC-DEV-LABCycloneII EP2C35F672C8核心板(2)软件:Quartus II软件PIN_AF8 DATAOUT[4] LED4PIN_AE7 DATAOUT[5] LED5PIN_AF7 DATAOUT[6] LED6PIN_AA11 DATAOUT[7] LED7PIN_AE21 BCD[0] 数码管DP4BPIN_AB20 BCD[1]PIN_AC20 BCD[2]PIN_AF20 BCD[3]PIN_AE20 BCD[4] 数码管DP5BPIN_AD19 BCD[5]PIN_AC19 BCD[6]PIN_AA17 BCD[7]PIN_AA18 BCD[8] 数码管DP6BPIN_W17 BCD[9]PIN_V17 BCD[10]PIN_AB18 BCD[11]六、仿真截图七、硬件实现八、程序代码1---clkgen.vhdlibrary IEEE;-- 1HZuse IEEE.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity clkgen isport (CLK : in std_logic;CLK1HZ: out std_logic);end entity;architecture clk_arch of clkgen issignal COUNT : integer range 0 to 50000000; --50MHZ -->1hz begin -- 50M/1=50000000 PROCESS(CLK)BEGINif clk'event and clk='1' thenIF COUNT= 50000000 thenCOUNT<=0;ELSE COUNT<=COUNT+1;END IF;END IF;END PROCESS;PROCESS(COUNT)BEGINIF COUNT= 5000000 THEN -- 1HZCLK1HZ<='1';ELSE CLK1HZ<='0';END IF;END PROCESS;end architecture;2—BCD-- 输出控制模块,把乘法器的输出转换成BCD码在数码管上显示、-- SCKZ.VHDlibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity BIN2BCD isport ( DIN: in std_logic_vector(7 downto 0); ---The input 8bit binaryBCDOUT: out std_logic_vector(11 downto 0)--输出显示, 已转换成BCD码);end entity;architecture arch of BIN2BCD issignal data2,data3,data4 :std_logic_vector(9 downto 0);-- 输出数据缓存signal hundred,ten,unit:std_logic_vector(3 downto 0);--signal bcdbuffer:std_logic_vector(11 downto 0);---2'1111_1001_11=999beginBCDOUT<= bcdbuffer;bcdbuffer(11 downto 8)<=hundred;bcdbuffer(7 downto 4)<=ten;bcdbuffer(3 downto 0)<=unit;get_hundred_value:process(data2)beginDA TA2<="00"&DIN;---get hundred valueif data2>=900 thenhundred<="1001";--9data3<=data2-900;elsif data2>=800 thenhundred<="1000";--8data3<=data2-500;elsif data2>=700 thenhundred<="0111";--7data3<=data2-700;elsif data2>=600 thenhundred<="0110";--6data3<=data2-600;elsif data2>=500 thenhundred<="0101";--5data3<=data2-500;elsif data2>=400 thenhundred<="0100";--4data3<=data2-400;elsif data2>=300 thenhundred<="0011";--3data3<=data2-300;elsif data2>=200 thenhundred<="0010";--2data3<=data2-200;elsif data2>=100 thenhundred<="0001";--1data3<=data2-100;else data3<=data2;hundred<="0000";end if;end process; ---get_thousand_valueget_tens_value:process(data3) begin---get tens placeif data3>=90 thenten<="1001";--9data4<=data3-90;elsif data3>=80 thenten<="1000";--8data4<=data3-50;elsif data3>=70 thenten<="0111";--7data4<=data3-70;elsif data3>=60 thenten<="0110";--6data4<=data3-60;elsif data3>=50 thenten<="0101";--5data4<=data3-50;elsif data3>=40 thenten<="0100";--4data4<=data3-40;elsif data3>=30 thenten<="0011";--3data4<=data3-30;elsif data3>=20 thenten<="0010";--2data4<=data3-20;elsif data3>=10 thenten<="0001";--1data4<=data3-10;else data4<=data3;ten<="0000";end if;end process; ---get_ten_valueget_unit_value:process(data4)begin--unit's orderif (data4>0) thenunit<=data4(3 downto 0);else unit<="0000";end if;end process;end arch;3 multi4b --------------------------------------------------------------------------------/ -- DESCRIPTION : Signed mulitplier:-- AIN (A) input width : 4-- BIN (B) input width : 4-- Q (data_out) output width : 8-- 并行流水乘法器--------------------------------------------------------------------------------/--10 × 9 = 90-- 1 0 1 0-- 1 0 0 1 =-- --------------- 1 0 1 0-- 0 0 0 0 --partial products-- 0 0 0 0-- 1 0 1 0-- -------------------- 1 0 1 1 0 1 0--parallel : process all the inputs at the same time--pipeline : use several stages with registers to implement it----关键思想,插入寄存器library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity multi4b isport ( CLK: in STD_LOGIC; ---system clockAIN: in STD_LOGIC_VECTOR (3 downto 0); ---one inputBIN: in STD_LOGIC_VECTOR (3 downto 0);-- the other inputdata_out: out STD_LOGIC_VECTOR (7 downto 0)---the result ---make sure the biggest value ,i,e. 1111x1111=1110_0001 can be held in the register );end multi4b;architecture multi_arch of multi4b issignal A,B :std_logic_vector(3 downto 0); --input register---registers to hold the result of the first processing---registers added to make use of pipeline, the 1st stagesignal A_MULT_B0: STD_LOGIC_VECTOR (3 downto 0);signal A_MULT_B1: STD_LOGIC_VECTOR (3 downto 0);signal A_MULT_B2: STD_LOGIC_VECTOR (3 downto 0);signal A_MULT_B3: STD_LOGIC_VECTOR (3 downto 0);---register to hold the result of the multipliersignal C_TEMP : STD_LOGIC_VECTOR (7 downto 0);beginPROCESS(CLK,AIN,BIN)beginif CLK'EVENT AND CLK='1' THEN-- multiplier operand inputs are registeredA<= AIN;B<= BIN;-----------------Fist stage of the multiplier------------------here we get the axb(0),axb(1),axb(2),axb(3),i.e.partial products---put them into the responding registersA_MULT_B0(0) <= A (0) and B (0);----- multi 1 , get the a(0) and b(0), & put it into the register A_MULT_B0(0)A_MULT_B0(1) <= A (1) and B (0);A_MULT_B0(2) <= A (2) and B (0);A_MULT_B0(3) <= A (3) and B (0);--10 × 9 = 90-- 1 0 1 0-- 1 0 0 1 =-- --------------- 0 0 0 0 1 0 1 0-- 0 0 0 0 0 0 0 0 --partial products-- 0 0 0 0-- 1 0 1 0-- -------------------- 1 0 1 1 0 1 0A_MULT_B1(0) <= A (0) and B (1);A_MULT_B1(1) <= A (1) and B (1);A_MULT_B1(2) <= A (2) and B (1);A_MULT_B1(3) <= A (3) and B (1);A_MULT_B2(0) <= A (0) and B (2);A_MULT_B2(1) <= A (1) and B (2);A_MULT_B2(2) <= A (2) and B (2);A_MULT_B2(3) <= A (3) and B (2);A_MULT_B3(0) <= A (0) and B (3);A_MULT_B3(1) <= A (1) and B (3);A_MULT_B3(2) <= A (2) and B (3);A_MULT_B3(3) <= A (3) and B (3);end if;end process;--------------------Second stage of the multiplier---------------add the all the partial products ,then get the result of the multiplier C_TEMP<=( "0000" & A_MULT_B0 )+( "000"& A_MULT_B1 &'0' )+( "00" & A_MULT_B2 & "00" )+( '0'&A_MULT_B3 & "000" );--build a signal register output---输出寄存,利于实现流水data_out <= C_TEMP; --output registerend multi_arch;九、实验总结。
4位乘法器的设计一、设计目的设计一个四位乘法器。
编写VHDL 源代码,得出正确的仿真波形,并在实验开发系统上进行硬件演示。
二、乘法器设计原理四位二进制乘法采用移位相加的方法。
即用乘数的各位数码,从高位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次得到的部分积左移一位并与第二次得到的部分积相加,将加得的和左移一位再与第三次得到的部分积相加,再将相加的结果左移一位与第四次得到的部分积相加,直到所的部分积都被加过一次。
原理框图:三、设计程序代码1)选通与门模块的源程序ANDARITH.VHDlibrary ieee;use ieee.std_logic_1164.all;entity andarith isport(abin:in std_logic;din:in std_logic_vector(3 downto 0);dout:out std_logic_vector(3 downto 0));end;architecture art3 of andarith isbeginprocess(abin,din)beginfor i in 0 to 3 loopdout(i)<=din(i) and abin;end loop; 锁存器 寄存器加法器选通与门 clk输入 输出end process;end art3;2)4位右移寄存器的源程序SREG4B.VHD library ieee;use ieee.std_logic_1164.all;entity sreg4b isport(clk,en:in std_logic;load:in std_logic;din:in std_logic_vector(3 downto 0);qb:out std_logic);end;architecture art1 of sreg4b issignal reg4:std_logic_vector(3 downto 0); beginprocess(clk,load,en)beginif clk'event and clk ='1' and en='1' then if load='0' then reg4<=din;elsereg4(2 downto 0)<=reg4(3 downto 1);end if;end if;end process;qb<=reg4(0);end art1;3)8位锁存器的源程序REG8.VHDlibrary ieee;use ieee.std_logic_1164.all;entity reg8 isport(clk,clr,en:in std_logic;d:in std_logic_vector(4 downto 0);q: out std_logic_vector(7 downto 0)); end;architecture art4 of reg8 issignal r8s:std_logic_vector(7 downto 0); beginprocess(clk,clr)beginif clr='0' then r8s<=(others=>'0');elsif clk'event and clk='1' and en='1' then r8s(2 downto 0)<=r8s(3 downto 1);r8s(7 downto 3)<=d;end if;end process;q<=r8s;end art4;4)乘法运算控制器的源程序ARICTL.VHD library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity arictl isport(clk,start: in std_logic;en,rstall,ariend:out std_logic);end;architecture art5 of arictl issignal cnt2b:std_logic_vector(2 downto 0); beginrstall<=start;process(clk,start) isbeginif start='0' then cnt2b<="000";elsif clk'event and clk='1' thenif cnt2b<4 thencnt2b<=cnt2b+1;end if;end if;end process;process(clk,cnt2b,start) isbeginif start='1' thenif cnt2b<4 thenen<='1';ariend<='0';else en<='0';ariend<='1';end if;else en<='1';ariend<='0';end if;end process;end art5;5)译码器的源程序YIMAQI.VHDlibrary ieee;use ieee.std_logic_1164.all;entity YIMAQI isPORT(code:IN STD_LOGIC_VECTOR(3 DOWNTO 0); LED7S: OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ); end;architecture ART6 of YIMA7 isbeginPROCESS(code)BEGINCASE code ISWHEN "0000" => LED7S <="0000001";WHEN "0001" => LED7S <="1001111";WHEN "0010" => LED7S <="0010010";WHEN "0011" => LED7S <="0000110";WHEN "0100" => LED7S <="1001100";WHEN "0101" => LED7S <="0100100";WHEN "0110" => LED7S <="0100000";WHEN "0111" => LED7S <="0001111";WHEN "1000" => LED7S <="0000000";WHEN "1001" => LED7S <="0000100";WHEN "1010" => LED7S <="0001000";WHEN "1011" => LED7S <="1100000";WHEN "1100" => LED7S <="0110001";WHEN "1101" => LED7S <="1000010";WHEN "1110" => LED7S <="0110000";WHEN "1111" => LED7S <="0111000";WHEN OTHERS => NULL;END CASE;END PROCESS;end ART6;6)4位乘法器的顶层文件四、程序设计步骤1.打开ispEXPERT软件,建立一个新的工程cnt10;1 单击菜单Fil e→New Project2 输入工程路径,工程名2.建立VHDL文件单击File→New菜单项,选择VHDL File选项,单击OK按钮以建立VHDL文件,分别建立4位乘法器的vhd文件ANDARITH.VHD,ARICTL.VHD,REG8.VHD,SREG4B.VHD。
实验:四位乘法器
一、实验目的及要求
通过本次实验进一步掌握 Modelsim SE 6.5c的仿真调试方法及过程思想,并且进一步学习理解加法器建模的原理及方法,通过仿真达到学习知识的目的。
通过反复阅读有关资料,并能够熟练掌握四位乘法器的程序代码设计及其仿真结果分析。
二、实验程序及仿真结果
描述模块:
module fadd (sum,inta,intb);
input [3:0] inta;
input [3:0] intb;
output[7:0] sum;
assign #5 sum=inta*intb;
endmodule
测试模块:
module T1;
reg[3:0] inta,intb;
//reg cin;
wire[7:0]sum;
fadd a(sum,inta,intb);
//always @(posedge clk)
initial
begin
inta=1;
intb=2;
#10 inta=4;
#10 intb=7;
#10 inta=3;
#10 intb=4;
end
endmodule
三、实验小结
通过这次四位乘法器的实验仿真,让我进一步熟练掌握了Modelsim SE 6.5c仿真环境及其使用方法,总结出在做实验时一定要先将思路理清楚,并画出图形来帮助理解。
最终将实验所得结果同理论分析相比较对知识的掌握力。