您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 基于fpga的乘法器和除法器
任务书:1、十六位硬件乘法器电路2、八位硬件除法器电路摘要:设计一个16位硬件乘法器电路。要求2位十进制乘法,能用LED数码管同时显示乘数,被乘数和积的值.本设计利用QuartusII软件为设计平台,通过移位相加的乘法原理:即从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。经软件仿真和硬件测试验证后,以达到实验要求。设计一个8位硬件除法器电路。要求2位十进制除法,能用LED数码管显示结果、除数和被除数的值。根据被除数(余数)和除数的大小来上商,被除数低位补零,再减去右移后的除数也可以改为左移余数,减去除数,这样可以确保参与运算的寄存器具有相同位数。商写到寄存器的低位,然后再左移一位。经软件仿真和硬件验证后,以达到实验要求。2目录2.任务书………………………………………………………………………………………………23.摘要…………………………………………………………………………………………………24.目录…………………………………………………………………………………………………35.正文…………………………………………………………………………………………………45.1.1乘法器系统设计……………………………………………………………………………45.1.1.1设计要求…………………………………………………………………………45.1.2.2系统设计方案……………………………………………………………………45.1.2单元电路设计………………………………………………………………………………4十进制计算模块…………………………………………………………………5BCD码转二进制模块……………………………………………………………58位右移寄存器模块……………………………………………………………68位加法器模块…………………………………………………………………71位乘法器multi_1模块…………………………………………………………716位移位寄存器reg_16模块…………………………………………………816位二进制转BCD码B_BCD模块………………………………………………98位乘法器multi_8x8顶层设计…………………………………………………105.1.3乘法器的系统测试…………………………………………………………………………14仿真分析………………………………………………………………………………14硬件验证………………………………………………………………………………155.2.1除法器系统设计………………………………………………5.2.2单元电路设计………………………………………………5.2.3除法器的系统设计………………………………………………仿真分析………………………………………………硬件验证………………………………………………6.结论……………………………………………………………………………………………157.参考文献………………………………………………………………………………………158.分工……………………………………………………………………………………………1535.正文题目要求设计基于fpga的乘法器和除法器。本小组想出的方案是利用位移相加和相减来制作乘法器和除法器。运用的模块主要包括:1、输入模块:运用计数器设编码器将bcd码编译为二进制码;2、运算模块:包括运算器和寄存器;3、输出模块:将运算器运算的结果的二进制数译码位bcd码在数码管上显示出来。其余方法:可以将输入的二进制数转为十进制再进行运算,此方法适用于人工初学者计算不适于利用芯片计算,故不考虑。方案先进性:简单易懂,将乘法器和除法器分开制作便于分工。但缺点也显而易见,乘法器和除法器按照不同人的思维进行设计,不易于整合,变为两个独立的模块。方案可行性:易于设计,但使用不便,需要重新烧入程序实现乘除法切换。5.1乘法器系统设计1.1设计要求题目要求设计一个16位硬件乘法器电路.要求2位十进制乘法;能用LED数码管同时显示乘数,被乘数和积的信息.设置一个乘法使能端,控制乘法器的计算和输出.1.2系统设计方案此设计问题可分为乘数和被乘数输入控制模块,乘法模块和输出乘积显示模块基本分.乘数和被乘数的输入模块使输入的十进制数转化为二进制数输入乘法模块,乘法模块利用移位相加的方法将输入的两组二进制数进行相乘,并将16位乘积输出到乘积输出显示模块.显示模块将输入的二进制数按千,百,十,个位分别转化为十进制数输出.乘数和被乘数的输入可用数据开关K1~K10分别代表数字1,2,…,9,0,用编码器对数据开关K1~K10的电平信号进行编码后输入乘法器进行计算.但此方案所用硬件资源较多,输入繁琐,故不采取.方案二是利用硬件箱自带16进制码发生器,由对应的键控制输出4位2进制构成的1位16进制码,数的范围是0000~1111,即0H~FH.每按键一次,输出递增1,输出进入目标芯片的4位2进制数将显示在该键对应的数码管.乘数和被乘数的输入模块将16进制码的A~F码设计成输出为null.使得减少了无用码的输入.两数相乘的方法很多,可以用移位相加的方法,也可以将乘法器看成计数器,乘积的初始值为零,每一个时钟周期将乘数的值加到积上,同时乘数减一,这样反复执行,直到乘数为零.本设计利用移位相加的方法使得程序大大简化.系统总体电路组成原理图如下图所示:45.1.2乘法器单元电路设计下面分解8位乘法器的层次结构,分为以下7个模块:1.十进制计算模块:使用4个十进制计数模块,输入乘数的十位个位,被乘数的十位个位。2.BCD码转二进制模块:实现将输入的8位BCD码转化成二进制3.右移寄存器模块:这是一个8位右移寄存器,可将乘法运算中的被乘数加载于其中,同时进行乘法运算的移位操作。4.加法器模块:这是一个8位加法器,进行操作数的加法运算。5.1位乘法器模块:完成8位与1位的乘法运算。6.锁存器模块:这是一个16位锁存器,同时也是一个右移寄存器,在时钟信号的控制下完成输入数值的锁存与移位。7.二进制转BCD码模块:将16位寄存器的值(积)转化成BCD码,配合数码管显示十进制加计数器设计十进制计数器在每个时钟来临时计数,clk=1时清零,用于输入乘数,被乘数的个位,十位Libraryieee;--0到9计数器Useieee.std_logic_unsigned.all;Useieee.std_logic_1164.all;Entitycnt10isPort(clk,clr:instd_logic;q:outstd_logic_vector(3downto0));endcnt10;architecturebehavofcnt10isbeginprocess(clk,clr)variablecqi:std_logic_vector(3downto0);beginifclr='1'thencqi:=0000;elsifclk'eventandclk='1'thenifcqi=9thencqi:=0000;elsecqi:=cqi+1;endif;endif;q=cqi;endprocess;endbehav;5BCD码转二进制码BCD_B的设计将十进制计数器产生的十位和个位合并后,为BCD码,而计算时使用二进制码计算,所以采用该模块来转化Libraryieee;--(0到99)BCD码转二进制码Useieee.std_logic_unsigned.all;Useieee.std_logic_1164.all;EntityBCD_BisPort(a:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0));endBCD_B;architecturebehavofBCD_Bissignala1,a2,a3,a4,cq:std_logic_vector(7downto0);beginprocess(a)begina1=0000&a(3downto0);a2=0000&a(7downto4);a3=a2(6downto0)&'0';a4=a2(4downto0)&000;cq=a4+a3+a1;q=cq;endprocess;endbehav;8位移位寄存器reg_8的设计8位移位寄存器是在时钟(r8_clk'eventandr8_clk='1')信号作用下,当r8_load='1'时,将8位乘数加载进入;而当r8_load='0'时,对数据进行移位操作,同时定义一个信号reg8用来装载新数据及移位后的操作数,完成这些操作后,寄存器的最低位reg8(0)传送给r8_out输出。libraryieee;---8位移位寄存器useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityreg_8isport(r8_clk,clr,r8_load:instd_logic;r8_in:instd_logic_vector(7downto0);r8_out:outstd_logic);endreg_8;architecturearc_reg_8ofreg_8issignalreg8:std_logic_vector(7downto0);6beginprocess(r8_clk,clr,r8_load)beginifclr='1'thenreg8=00000000;elsifr8_clk'eventandr8_clk='1'thenifr8_load='1'thenreg8=r8_in;elsereg8(6downto0)=reg8(7downto1);endif;endif;endprocess;r8_out=reg8(0);endarc_reg_8;8位加法器adder_8的设计该加法器由八位二进制加法器组成。其中设计八位二进制加法器时,为了避免加法运算时产生溢出,故定义了三个信号量ss,aa,bb,将加数a8_a,a8_b分别与0连接后赋值给aa,bb,形成9位二进制数,然后aa,bb相加赋值给ss,最后将ss的低八位赋值给和a8_s,同时将ss的最高位送给a8_out输出。libraryieee;--8位加法器useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityadder_8isport(a8_a,a8_b:instd_logic_vector(7downto0);a8_s:outstd_logic_vector(7downto0);a8_out:outstd_logic);endadder_8;architecturearc_adder_8ofadder_8issignalss:std_logic_vector(8downto0);signalaa,bb:std_logic_vector(8downto0);beginaa='0'&a8_a;bb='0'&a8_b;ss=aa+bb;a8_s=ss(7downto0);a8_out=ss(8);endarc_adder_8;71位乘法器multi_1的设计利用if语句来完成8位二进制数与1位二进制的乘法运算,最后将结果送到m1_out输出。即当m1_x为1时,m1_out输出为m1_y;当m1_x为0时,m1_out输出全为零。libraryieee;--1位乘法器useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entitymulti_1isport(m1_x:instd_logic;m1_y:instd_logic_vector(7d
本文标题:基于fpga的乘法器和除法器
链接地址:https://www.777doc.com/doc-2569620 .html