




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
任务书:1、 十六位硬件乘法器电路2、 八位硬件除法器电路摘要:设计一个16位硬件乘法器电路。要求2位十进制乘法,能用LED数码管同时显示乘数,被乘数和积的值.本设计利用Quartus II软件为设计平台,通过移位相加的乘法原理:即从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。经软件仿真和硬件测试验证后,以达到实验要求。设计一个8位硬件除法器电路。要求2位十进制除法,能用LED数码管显示结果、除数和被除数的值。根据被除数(余数)和除数的大小来上商,被除数低位补零,再减去右移后的除数也可以改为左移余数,减去除数,这样可以确保参与运算的寄存器具有相同位数。商写到寄存器的低位,然后再左移一位。经软件仿真和硬件验证后,以达到实验要求。目录2.任务书23.摘要24.目录35.正文4 5.1.1 乘法器系统设计4 5.1.1.1 设计要求4 5.1.2.2系统设计方案4 5.1.2 单元电路设计4 十进制计算模块5 BCD码转二进制模块5 8位右移寄存器模块6 8位加法器模块7 1位乘法器multi_1模块7 16位移位寄存器reg_16模块8 16位二进制转BCD码B_BCD模块9 8位乘法器multi_8x8顶层设计105.1.3 乘法器的系统测试14 仿真分析14 硬件验证155.2.1 除法器系统设计5.2.2单元电路设计5.2.3 除法器的系统设计 仿真分析 硬件验证6. 结论157. 参考文献158. 分工155.正文题目要求设计基于fpga的乘法器和除法器。本小组想出的方案是利用位移相加和相减来制作乘法器和除法器。运用的模块主要包括:1、 输入模块:运用计数器设编码器将bcd码编译为二进制码;2、 运算模块:包括运算器和寄存器;3、 输出模块:将运算器运算的结果的二进制数译码位bcd码在数码管上显示出来。其余方法:可以将输入的二进制数转为十进制再进行运算,此方法适用于人工初学者计算不适于利用芯片计算,故不考虑。方案先进性:简单易懂,将乘法器和除法器分开制作便于分工。但缺点也显而易见,乘法器和除法器按照不同人的思维进行设计,不易于整合,变为两个独立的模块。方案可行性:易于设计,但使用不便,需要重新烧入程序实现乘除法切换。5.1乘法器系统设计1.1 设计要求题目要求设计一个16位硬件乘法器电路.要求2位十进制乘法;能用LED数码管同时显示乘数,被乘数和积的信息.设置一个乘法使能端,控制乘法器的计算和输出.1.2 系统设计方案此设计问题可分为乘数和被乘数输入控制模块,乘法模块和输出乘积显示模块基本分.乘数和被乘数的输入模块使输入的十进制数转化为二进制数输入乘法模块,乘法模块利用移位相加的方法将输入的两组二进制数进行相乘,并将16位乘积输出到乘积输出显示模块.显示模块将输入的二进制数按千,百,十,个位分别转化为十进制数输出.乘数和被乘数的输入可用数据开关K1K10分别代表数字1,2,9,0,用编码器对数据开关K1K10的电平信号进行编码后输入乘法器进行计算.但此方案所用硬件资源较多,输入繁琐,故不采取.方案二是利用硬件箱自带16进制码发生器,由对应的键控制输出4位2进制构成的1位16进制码,数的范围是00001111,即0HFH.每按键一次,输出递增1,输出进入目标芯片的4位2进制数将显示在该键对应的数码管.乘数和被乘数的输入模块将16进制码的AF码设计成输出为null.使得减少了无用码的输入.两数相乘的方法很多,可以用移位相加的方法,也可以将乘法器看成计数器,乘积的初始值为零,每一个时钟周期将乘数的值加到积上,同时乘数减一,这样反复执行,直到乘数为零.本设计利用移位相加的方法使得程序大大简化.系统总体电路组成原理图如下图所示:5.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时清零,用于输入乘数,被乘数的个位,十位Library ieee; -0到9计数器Use ieee.std_logic_unsigned.all;Use ieee.std_logic_1164.all;Entity cnt10 isPort (clk,clr: in std_logic; q: out std_logic_vector(3 downto 0);end cnt10;architecture behav of cnt10 isbegin process(clk,clr) variable cqi: std_logic_vector(3 downto 0); begin if clr=1 then cqi:=0000; elsif clkevent and clk=1 then if cqi=9 then cqi:=0000; else cqi:=cqi+1; end if; end if; q=cqi;end process;end behav;BCD码转二进制码BCD_B的设计将十进制计数器产生的十位和个位合并后,为BCD码,而计算时使用二进制码计算,所以采用该模块来转化Library ieee; -(0到99)BCD码转二进制码Use ieee.std_logic_unsigned.all;Use ieee.std_logic_1164.all;Entity BCD_B isPort ( a: in std_logic_vector(7 downto 0); q: out std_logic_vector(7 downto 0);end BCD_B;architecture behav of BCD_B is signal a1,a2,a3,a4,cq: std_logic_vector(7 downto 0);begin process(a) begin a1=0000&a(3 downto 0); a2=0000&a(7 downto 4); a3=a2(6 downto 0)&0; a4=a2(4 downto 0)&000; cq=a4+a3+a1; q=cq;end process;end behav;8位移位寄存器reg_8的设计8位移位寄存器是在时钟(r8_clkevent and r8_clk=1)信号作用下,当r8_load=1时,将8位乘数加载进入;而当r8_load=0时,对数据进行移位操作,同时定义一个信号reg8用来装载新数据及移位后的操作数,完成这些操作后,寄存器的最低位reg8(0)传送给r8_out输出。library ieee; -8位移位寄存器use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity reg_8 is port(r8_clk,clr,r8_load:in std_logic; r8_in:in std_logic_vector(7 downto 0); r8_out:out std_logic);end reg_8;architecture arc_reg_8 of reg_8 is signal reg8:std_logic_vector(7 downto 0); begin process(r8_clk,clr,r8_load) begin if clr=1then reg8=; elsif r8_clkevent and r8_clk=1 then if r8_load=1 then reg8=r8_in; else reg8(6 downto 0)=reg8(7 downto 1); end if; end if; end process; r8_out=reg8(0); end arc_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输出。library ieee; -8位加法器use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all; entity adder_8 is port(a8_a,a8_b:in std_logic_vector(7 downto 0); a8_s:out std_logic_vector(7 downto 0); a8_out:out std_logic); end adder_8; architecture arc_adder_8 of adder_8 is signal ss:std_logic_vector(8 downto 0); signal aa,bb:std_logic_vector(8 downto 0); begin aa=0&a8_a; bb=0&a8_b; ss=aa+bb; a8_s=ss(7 downto 0); a8_out=ss(8); end arc_adder_8;1位乘法器multi_1的设计 利用if语句来完成8位二进制数与1位二进制的乘法运算,最后将结果送到m1_out输出。即当m1_x为1时,m1_out输出为m1_y;当m1_x为0时,m1_out输出全为零。 library ieee; -1位乘法器use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity multi_1 is port(m1_x:in std_logic; m1_y:in std_logic_vector(7 downto 0); m1_out:out std_logic_vector(7 downto 0);end multi_1;architecture arc_multi_1 of multi_1 is begin process(m1_x,m1_y) begin if m1_x=1 then m1_out=m1_y; else m1_out=; end if; end process;end arc_multi_1;16位移位寄存器reg_16的设计当清零信号(clr=1)到来时,定义信号变量reg_16归零;信号(r16_clr=1)到来时,定义信号变量reg16清零;否则在时钟信号r16_clk上升沿到来时,将reg16的低8位进行移位操作,同时将8位的数据输入r16_in锁存到reg16的高8位,最后赋值给r16_out输出,cout控制位输出1。library ieee; - 16位移位寄存器 use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity reg_16 is port(r16_clk,clr,r16_clr:in std_logic; r16_in:in std_logic_vector(8 downto 0); cout:out std_logic; r16_out:out std_logic_vector(15 downto 0);end reg_16;architecture arc_reg_16 of reg_16 is signal reg16:std_logic_vector(15 downto 0); signal i: std_logic_vector(3 downto 0); begin process(r16_clk,r16_clr) begin if clr=1then cout=0;reg16=00000; elsif r16_clr=1 then reg16=00000; cout=0;i=0000; elsif r16_clkevent and r16_clk=1 then if (i=1000) then reg16=reg16;cout=1; else reg16(6 downto 0)=reg16(7 downto 1); reg16(15 downto 7)=r16_in; i=i+1; end if; end if; end process; r16_out=reg16; end arc_reg_16;16位二进制转BCD码B_BCD的设计当reg_16乘积结束时,cout输出1,为B_BCD的使能信号,r16_out为B_BCD的输入信号,随着时钟上升沿的到来,开始转化,16个周期后完成16为二进制码到BCD码的转化,输出接数码管显示Library ieee; -16位二进制转BCD码(0到9999)Use ieee.std_logic_unsigned.all;Use ieee.std_logic_1164.all;Entity B_BCD isPort ( clk,ena:in std_logic; a: in std_logic_vector(15 downto 0); q: out std_logic_vector(15 downto 0);end B_BCD;architecture behav of B_BCD is begin process(clk,a) variable i: std_logic_vector(4 downto 0); variable in_a,out_a :std_logic_vector(15 downto 0);begin if ena=0then in_a:=a; i:=00000; out_a:=00000; elsif clkevent and clk=1 then if i=10000 then out_a:=out_a; else out_a:=out_a(14 downto 0)&in_a(15); in_a:=in_a(14 downto 0)&0; i:=i+1; if i4 then out_a( 3 downto 0):=out_a( 3 downto 0)+3; end if; if out_a( 7 downto 4)4 then out_a( 7 downto 4):=out_a( 7 downto 4)+3; end if; if out_a(11 downto 8)4 then out_a(11 downto 8):=out_a(11 downto 8)+3; end if; if out_a(15 downto 12)4 then out_a(15 downto 12):=out_a(15 downto 12)+3; end if; end if; end if; end if ; q=out_a;end process; end behav;顶层设计8位乘法器multi_8x8当输入a,b后,随着STAR上升沿到来,将乘数a锁存到REG_8中,同时将16位的移位寄存器REG_16清零,然后随着时钟CLK上升沿的到来,对REG_8中的乘数进行移位操作,最低位在前,由低到高逐位输出。1位乘法器中进行与8位被乘数的相乘运算,并与锁存在16位寄存器reg_16中的高8位进行相加,其和(包含进位)在下一个时钟的上升沿到来时锁存到16位寄存器中。如此进行直到第八个时钟上升沿到来时,reg_16的输出即为所求的乘积,此时reg_16输出端cout输出高电平,B_BCD使能端有效,随着时钟的到来后,开始二进制到BCD码的转化,16个时钟后转化完成,输出结果。由(clr)清零端归零后,可以进行下一次的计算。其顶层程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity multi_8x8 is port(clk,clk_a1,clk_a0,clk_b1,clk_b0,clr,start:in std_logic; out_a1,out_a0,out_b1,out_b0: buffer std_logic_vector(3 downto 0); result: out std_logic_vector(15 downto 0);end multi_8x8;architecture arc_multi_8x8 of multi_8x8 is component cnt10 -调用0到9计数器声明Port (clk,clr: in std_logic; q: out std_logic_vector(3 downto 0);end component;component BCD_B -调用0到99)BCD码转二进制码声明Port ( a: in std_logic_vector(7 downto 0); q: out std_logic_vector(7 downto 0);end component;component B_BCD -调用16位二进制转BCD码(0到9999)声明Port ( clk,ena:in std_logic; a: in std_logic_vector(15 downto 0); q: out std_logic_vector(15 downto 0);end component;component multi_1 -调用1位乘法器声明port(m1_x:in std_logic; m1_y:in std_logic_vector(7 downto 0); m1_out:out std_logic_vector(7 downto 0);end component;component adder_8 -调用8位加法器声明port(a8_a,a8_b:in std_logic_vector(7 downto 0); a8_s:out std_logic_vector(7 downto 0); a8_out:out std_logic);end component;component reg_8 -调用8位寄存器声明port(r8_clk,clr,r8_load:in std_logic; r8_in:in std_logic_vector(7 downto 0); r8_out:out std_logic);end component;component reg_16 -调用16位寄存器声明port(r16_clk,clr,r16_clr:in std_logic; r16_in:in std_logic_vector(8 downto 0); cout:out std_logic; r16_out:out std_logic_vector(15 downto 0);end component;signal q_a,cout:std_logic; signal andsd,a,b,aa,bb:std_logic_vector(7 downto 0);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 光伏专业笔试题库及答案
- 2026届黑龙江省大庆市高三第一次质量检测生物试题(解析版)
- 安徽省皖南八校2024-2025学年高二上学期期中考试生物试卷(含答案)
- 体育产业发展趋势预测报告
- 汽车租赁行业优惠活动方案
- 27届八年级上数学入学测试卷
- 焦作古建祠堂施工方案
- 建筑电气临时施工方案
- 婚俗改革联谊活动方案策划
- 湖南职工讲堂活动方案策划
- 十八项核心制度培训培训课件
- 幼儿园警察职业介绍课件
- GB/T 37642-2019聚己内酯(PCL)
- 国防科技大学介绍
- 校音乐厅设计方案
- 新视野大学英语读写教程Unit1教案(含和译文)
- 机电一体化设计
- 新教材教科版五年级上册科学 第二单元 地球表面的变化 单元全套课时练
- (中职中专)财经法规与会计职业道德课件完整版电子教案
- DB37T 5151-2019 园林绿化工程资料管理规程
- 贝多芬F大调浪漫曲—小提琴谱(带钢伴谱)
评论
0/150
提交评论