8位十进制乘法器汇总_第1页
8位十进制乘法器汇总_第2页
8位十进制乘法器汇总_第3页
8位十进制乘法器汇总_第4页
8位十进制乘法器汇总_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

XX学院课程论文(2012-2013学年第一学期)课程论文题目:8位乘法器的设计学生姓名:提交日期:2012年12月30日学生签名:学 号班级10电本2班同组成员课程编号XZ0202111专业电子信息工程课程名称EDA技术任课教师教师评语:成绩评定: 分 任课教师签名: 年月曰

EDA期末考试

设计报告设计题目:8位乘法器的设计学校:XX学院系别:电子信息工程系系别:电子信息工程系班别:10电本2班姓名:XXX学号:组员:指导老师:摘要:本设计通过对一个8X8的二进制乘法器的设计。在此次设计中该乘法器是由十进制计数器、BCD码(输入)转二进制码、8位寄存器、8位加法器、16位寄存器、8x1乘法器、二进制码转BCD码(输出显示)7个模块构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。设计中乘数,被乘数的十位和个位分别采用cnt10(十进制加法器)来输入,经拼接符“&”拼接成8位BCD码,再由BCD_B(BCD码转二进制码)转化成二进制码后计算,计算结果由B_BCD(二进制转BCD码)转化成BCD码输入到数码管中显示。关键词:VHDL语言、十进制计数器、BCD码转二进制码、8位寄存器、8位加法器、16位寄存器、8x1乘法器、二进制转BCD码一、 设计功能要求能设置输入两个乘数(十进制),按操作键后以十进制的方式显示乘积。二、 设计原理本设计中该乘法器是由十进制计数器,BCD码(输入)转二进制码,8位寄存器,8位加法器,16位寄存器,8x1乘法器,二进制码转BCD码(输出显示)7个模块构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。设计中乘数,被乘数的十位和个位分别采用 cntlO(十进制加法器)来输入,经拼接符“&”拼接成8位BCD码,再由BCD_B(BCD码转二进制码)转化成二进制码后计算,计算结果由B_BCD(二进制转BCD码)转化成BCD码输入到数码管中显示。使用中只要输入乘数,被乘数,按下键 3(脉冲)就可以直接得出结果,显示结果稳定。可以满足两位十进制乘法的计算。三、整体结构图: 输出高八位四、设计步骤:利用VHDL语言来实现各个结构模块,其实现的用途及功能如下:十进制计算模块:使用4个十进制计数模块,输入乘数的十位个位,被乘数的十位个位。BCD码转二进制模块:实现将输入的8位BCD码转化成二进制8位右移寄存器模块:将乘法运算中的被乘数加载于其中,同时进行乘法运算的移位操作。8位加法器模块:进行操作数的加法运算。1位乘法器模块:完成8位与1位的乘法运算。16位锁存器模块:这是一个16位锁存器,同时也是一个右移寄存器,在时钟信号的控制下完成输入数值的锁存与移位。二进制转BCD码模块:将16位寄存器的值(积)转化成BCD码,配合数码管显示利用VHDL语言来实现各个结构模块如下:十进制加计数器设计:十进制计数器在每个时钟来临时计数,clk=1时清零,用于输入乘数,被乘数的个位,十位。Libraryieee;--使用ieee设计库 --0到9计数器Useieee.std_logic_unsigned.all;---允许用户对操作符重新定义Useieee.std_logic_1164.all;--使用std_logic_1164程序包Entitycnt10is --实体名cnt10Port(clk,clr:instd_logic; --clk时钟频率,rst清零q:outstd_logic_vector(3downto0)); --四位输出endcnt10;architecturebehavofcnt10is--结构体名behavbeginprocess(clk,clr)-时钟,清零为敏感信号variablecqi:std_logic_vector(3downto0); --定义计数器beginifclr='1'thencqi:="0000";--如果clr='1',则cqi:="0000"elsifclk'eventandclk='1'then----否则,若clk为上升沿,即上升沿触发ifcqi=9thencqi:="0000";--如果cqi=9,则cqi:="0000"elsecqi:=cqi+1;--否则cqi自加1endif;endif;q<=cqi;输出endprocess;endbehav;编译cnt10.vhd生成原理图文件,如下图图^cntiox封装图BCD码转二进制码BCD_B的设计:将十进制计数器产生的十位和个位合并后,为BCD码,而计算时使用二进制码计算,所以采用该模块来转化。Libraryieee;--使用ieee设计库 --(0到99)BCD码转二进制码Useieee.std_logic_unsigned.all;--允许用户对操作符重新定义Useieee.std_logic_ii64.all;--使用std_logic_ii64程序包EntityBCD_Bis --实体名BCD_BPort(a:instd_logic_vector(7downto0);--输入8位q:outstd_logic_vector(7downto0));--输出8位endBCD_B;architecturebehavofBCD_Bis --结构体名behavsignalai,a2,a3,a4,cq:std_logic_vector(7downto0);-- 定义四个内部信号begin

process(a)--a为敏感信号begina1<="0000"&a(3downto0);--"0000"与a的低四位连接a2<="0000"&a(7downto4);--"0000"与a的高四位连接a3<=a2(6downto0)&'0';--a2的0位到6位与'0'连接a4<=a2(4downto0)&"000";--a2的0位到4位与"000"连接cq<=a4+a3+a1;--赋值q<=cq;--输出endprocess;endbehav;编译BCD_B.vhd生成原理图文件,如下图图严BCD_B图严BCD_B封装图andr8_clk='1')信号作用下,当andr8_clk='1')信号作用下,当r8_load='0'时,对数据进行移位操8位移位寄存器reg_8的设计:8位移位寄存器是在时钟(r8_clk'eventr8_load='1'时,将8位乘数加载进入;而当作,同时定义一个信号reg8用来装载新数据及移位后的操作数,完成这些操作后,寄存器的最低位reg8(0)传送给r8_out输出。libraryieee;--使用ieee设计库---8位移位寄存器useieee.std_logic_1164.all;--使用std_logic_1164程序包useieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义useieee.std_logic_arith.all;--定义了相关的算术运算符和数据类型转换函数entityreg_8is --实体名reg_8port(r8_clk,clr,r8_load:instd_logic;r8_in:instd_logic_vector(7downto0);--输入端口r8_out:outstd_logic);--输出端口endreg_8;architecturearc_reg_8ofreg_8is --结构体名arc_reg_8signalreg8:std_logic_vector(7downto0); --定义一个内部信号,其位宽为8位beginprocess(r8_clk,clr,r8_load) 三个敏感信号beginifclr='1'thenreg8<="00000000";--如果clr='1,则执行reg8<="00000000"elsifr8_clk'eventandr8_clk='1'then-- 否则,若r8_clk为上升沿,即上升沿触发ifr8_load='1'thenreg8<=r8_in;--如果r8_load='1',则执行reg8<=r8_inelsereg8(6downto0)<=reg8(7downto1);--否则执行endif;--reg8(6downto0)<=reg8(7downto1)endif;endprocess;r8_out<=reg8(0);--输出endarc_reg_8;编译reg_8.vhd生成原理图文件,如下图3reg_88位加法器adder_8的设计:该加法器由八位二进制加法器组成。其中设计八位二进制加法器时,为了避免加法运算时产生溢出,故定义了三个信号量ss,aa,bb,将加数a8_a,a8_b分别与0连接后赋值给aa,bb,形成9位二进制数,然后aa,bb相加赋值给ss,最后将ss的低八位赋值给和a8_s,同时将ss的最高位送给a8_out输出。libraryieee;--使用ieee设计库--8位加法器useieee.std_logic_1164.all 使用std_logic_1164程序包;useieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义useieee.std_logic_arith.all;--定义了相关的算术运算符和数据类型转换函数entityadder_8is --实体名adder_8port(a8_a,a8_b:instd_logic_vector(7downto0);--定义两个输入端口a8_s:outstd_logic_vector(7downto0);--定义输出端口a8_out:outstd_logic);--定义输出端口endadder_8;architecturearc_adder_8ofadder_8is --结构体名arc_adder_8signalss:std_logic_vector(8downto0); --定义一个内部信号signalaa,bb:std_logic_vector(8downto0);--定义两个内部信号begin

aa<='0'&a8_a;bb<='0'&a8_b;ss<=aa+bb;aa<='0'&a8_a;bb<='0'&a8_b;ss<=aa+bb;a8_s<=ss(7downto0);a8_out<=ss(8);endarc_adder_8;编译adder_8.vhd生成原理图文件,如下图图4adder_8编译adder_8.vhd生成原理图文件,如下图图4adder_8封装图dBout1位乘法器multi_1的设计:利用if语句来完成8位二进制数与1位二进制的乘法运算,最后将结果送到m1_out输出。即当m1_x为1时,m1_out输出为m1_y;当m1_x为0时m1_out输出全为零。libraryieee;--使用ieee设计库 --1位乘法器useieee.std_logic_1164.all;--使用std_logic_1164程序包useieee.std_logic_unsigned.all;--允许用户对操作符重新定义useieee.std_logic_arith.all;--定义了相关的算术运算符和数据类型转换函数entitymulti_1is--entitymulti_1is--实体名multi_1port(m1_x:instd_logic;m1_y:instd_logic_vector(7downto0);---输入m1_out:outstd_logic_vector(7downto0));---输出endmulti_1;architecturearc_multi_1ofmulti_1is---结构体名arc_multi_1beginprocess(m1_x,m1_y)---两个敏感信号beginifm1_x='1'thenm1_out<=m1_y;--如果m1_x='1'则执行m1_out<=m1_yelsem1_out<="00000000";--否则执行m1_out<="00000000"endif;endprocess;endarc_multi_1;编译multi_1.vhd生成原理图文件,如下图:图5multi_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。libraryieee;--使用ieee设计库--16位移位寄存器useieee.std_logic_1164.all;--使用std_logic_1164程序包useieee.std_logic_unsigned.all;-- 允许用户对操作符重新定义useieee.std_logic_arith.all;--定义了相关的算术运算符和数据类型转换函数entityreg_16is--实体名reg_16port(r16_clk,clr,r16_clr:instd_logic;r16_in:instd_logic_vector(8downto0);---输入cout:outstd_logic;--定义进位信号r16_out:outstd_logic_vector(15downto0));---输出endreg_16;architecturearc_reg_16ofreg_16is--结构体名arc_reg_16signalreg16:std_logic_vector(15downto0);--定义内部信号reg16,位宽为16位signali:std_logic_vector(3downto0);--定义内部信号i,位宽为4位beginprocess(r16_clk,r16_clr) --两个敏感信号begin --当清零信号(clr='1')到来时ifclr='1'thencout<='0';reg16<="0000000000000000";--定义信号变量reg_16归零elsifr16_clr='1'then--否则信号(r16_clr='1')到来时reg16<="0000000000000000"; cout<='0';i<="0000";-定义信号变量reg16清零elsifr16_clk'eventandr16_clk='1'then--时钟信号r16_clk上升沿到来时if(i="1000")thenreg16<=reg16;cout<='1';elsereg16(6downto0)<=reg16(7downto1);reg16(15downto7)<=r16_in;i<=i+1;endif;

endif;endprocess;r16_out<=reg16;--r16_out输出endarc_reg_16;编译reg_16.vhd生成原理图文件,如下图16位二进制转BCD码B_BCD的设计:当reg_16乘积结束时,cout输出1,为B_BCD的使能信号,r16_out为B_BCD的输入信号,随着时钟上升沿的到来,开始转化,16个周期后完成16为二进制码到BCD码的转化,输出接数码管显示Libraryieee;---使用ieee设计库--16位二进制转BCD码(0到9999)Useieee.std_logic_unsigned.all;--- 允许用户对操作符重新定义Useieee.std_logic_1164.all;---使用std_logic_1164程序包EntityB_BCDis ---实体名B_BCDPort(clk,ena:instd_logic;---clk时钟,ena使能a:instd_logic_vector(15downto0);---输入端口q:outstd_logic_vector(15downto0));--输出端口endB_BCD;architecturebehavofB_BCDis ---结构体名behavbeginprocess(clk,a)---敏感信号clk,avariablei:std_logic_vector(4downto0);variablein_a,out_a:std_logic_vector(15downto0);beginifena='0'thenin_a:=a;i:="00000";out_a:="0000000000000000";elsifclk'eventandclk='1'thenifi="10000"thenout_a:=out_a;elseout_a:=out_a(14downto0)&in_a(15);in_a:=in_a(14downto0)&'0';i:=i+1;ifi<"10000"then-检查半字节+3是否大于7,也就是检查半字节是否大于4

ifout_a(3downto0)+3;endif; --如果大于4加3ifout_a(7downto4)>4thenout_a(7downto4):=out_a(7downto4)+3;endif;ifout_a(11downto8)>4thenout_a(11downto8):=out_a(11downto8)+3;endif;ifout_a(15downto12)>4thenout_a(15downto12):=out_a(15downto12)+3;endif;endif;endif; endif;q<=out_a;endprocess;endbehav;编译B_BCD.vhd生成原理图文件,如下图图7B_BCD封装图4.2.88位乘法器的顶层设计:当输入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)清零端归零后,可以进行下一次的计算。其顶层程序如下:libraryieee;---使用ieee设计库useieee.std_logic_1164.all;---使用std_logic_1164程序包useieee.std_logic_unsigned.all;---允许用户对操作符重新定义useieee.std_logic_arith.all;--- 定义了相关的算术运算符和数据类型转换函数entitymulti_8x8isport(clk,clk_a1,clk_a0,clk_b1,clk_b0,clr,start:in std_logic;--7个输入out_a1,out_a0,out_b1,out_b0:bufferstd_logic_vector(3downto0);4个输出result:outstd_logic_vector(15downto0));--- 结果输出endmulti_8x8;architecturearc_multi_8x8ofmulti_8x8is--结构体名arc_multi_8x8componentcnt10--调用0到9计数器声明Port(clk,clr:instd_logic;q:outstd_logic_vector(3downto0));endcomponent;componentBCD_B--调用0到99)BCD码转二进制码声明Port(a:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0));endcomponent;componentB_BCD--调用16位二进制转BCD码(0到9999)声明Port(clk,ena:instd_logic;a:instd_logic_vector(15downto0);q:outstd_logic_vector(15downto0));endcomponent;componentmulti_1--调用1位乘法器声明port(m1_x:instd_logic;m1_y:instd_logic_vector(7downto0);m1_out:outstd_logic_vector(7downto0));endcomponent;componentadder_8--调用8位加法器声明port(a8_a,a8_b:instd_logic_vector(7downto0);a8_s:outstd_logic_vector(7downto0);a8_out:outstd_logic);endcomponent;componentreg_8--调用8位寄存器声明port(r8_clk,clr,r8_load:instd_logic;r8_in:instd_logic_vector(7downto0);r8_out:outstd_logic);endcomponent;componentreg_16--调用16位寄存器声明port(r16_clk,clr,r16_clr:instd_logic;r16_in:instd_logic_vector(8downto0);cout:outstd_logic;r16_out:outstd_logic_vector(15downto0));endcomponent;signalq_a,cout:std_logic;signalandsd,a,b,aa,bb:std_logic_vector(7downto0);signaldtbin:std_logic_vector(8downto0);signaldtbout:std_logic_vector(15downto0);beginaa<=out_a1&out_a0;bb<=out_b1&out_b0;u1:cnt10--例化语句portmap(clk_a1,clr,out_a1);u2:cnt10portmap(clk_a0,clr,out_a0);u3:cnt10portmap(clk_b1,clr,out_b1);u4:cnt10portmap(clk_b0,clr,out_b0);u5:BCD_Bportmap(aa,a);u6:BCD_B

portmap(bb,b);u7:reg_8portmap(clk,clr,start,a,q_a);u8:multi_1portmap(q_a,b,andsd);u9:adder_8portmap(dtbout(15downto8),andsd,dtbin(7downto0),dtbin(8));u10:reg_16portmap(clk,clr,start,dtbin,cout,dtbout);u11:B_BCDportmap(clk,cout,dtbout,result);endarc_multi_8x8;编译multi_8x8.vhd生成原理图文件,如下图:加 k...k...k...^...k <zzl33elkout_al[3..0]elk_j3lout_30[3..0]clk_aOout_b1[3..0]cik_b1aut_bfi[3..O]clk_bOc4fstartre£ult[15..Q]……一…一…>H>N・;H・>N・;H••…:…一五.软件设计5.1程序流程方框图幵始信号到来,蜀start为2寄存器gCM寄存器reg_8蛊乘数酬start为零*」reg_S移出1位后与被乘数放入multi_l中进行乘法运霽七结果送至adde_8*J^g_l&取出高8位送adder_8中尺与muki」得到结果进行加法运算,结果送至reg16右移后并进行锁存亠输出每一步的运算结果,即输出reg_16的饥.其中第八个《即为求得的积,再将樓值通过16个脉冲转化成BCD码2结束a图10简单流程图分析说明:首先由计数器输入乘数被乘数,经BCD_B转化成二进制码记作a,b。图中8位移位寄存器reg_8存放(二进制)乘数a,从a的最低位开始,每次从reg_8中移出一位,送至1x8位乘法器multi_l中,同时将被乘数加至multi_1中,进行乘法运算,运算的结果再送至8位加法器adder_8中同时取出16位移位寄存器reg_16的高8位与之进行相加,相加后结果即部分积存入reg_16中,进行移位后并保存。这样经过8次对乘数a的移位操作,所以的部分积已全加至reg_16中,此时锁存器reg_16存放的值即所要求的积,再经过B_BCD转化成BCD码显示六.引脚锁定:根据乘法器原理图选择最佳电路图结构模式,这里我们选择模式3,以下是模式3电路结构图:271^*92°Q01iiToPIN26.2PIN36Coiun.r-I/O7oiuriinI/OPIN65PIN67PIN_38PIN^PIN41PIN12PIN10PIN17PINIB2348_£75□6D7疣DE ^D&LocationEnab实验弓脚分配如下图:□16<D15C-lGeneralFunctionSpecialFunctionReservedPIN126DedicatedInputPIN13E3护PIN19PIN309■C^result[l]PIN32PIN33C^result[4]CdlumnI/OPIN37ColumnI/OmlumnI/OColumnI/O匚cilumnI/OLOCKCcilumnI/OPIN68ColumnI/O译码黠I|诵砒器I也修Ih271^*92°Q01iiToPIN26.2PIN36Coiun.r-I/O7oiuriinI/OPIN65PIN67PIN_38PIN^PIN41PIN12PIN10PIN17PINIB2348_£75□6D7疣DE ^D&LocationEnab实验弓脚分配如下图:□16<D15C-lGeneralFunctionSpecialFunctionReservedPIN126DedicatedInputPIN13E3护PIN19PIN309■C^result[l]PIN32PIN33C^result[4]CdlumnI/OPIN37ColumnI/OmlumnI/OColumnI/O匚cilumnI/OLOCKCcilumnI/OPIN68ColumnI/O译码黠I|诵砒器I也修Ih旳帚1石PICM5.、PICM4IPIOIMIPIQ位\PICi11\PIQ10k,PICi9PIO39-PIO36PIO4S-PIO4CPIO47-PIO44FPGA/CPLD目标芯片pioi&-Picaaelk卧d「2L^startl^dkbOl^dkaOB^dkalresult[0]<^result[2jresult^■^result[5]result[6]謬「亡sult[7]■^result[3]■^result[9]■jffi^result[10]■fi^result[llj禅「亡suit[闵|i■他器PIQ19-PI016PIO2S-PIO20PIO27-PIO24PIO31-PIO23PIOa&-PIO32PIN42PIO7PIO6PIO5PIO4PIO3PIO2PIO1PIOOCLOCKSCLOCKSclocksClocks-HH0S0S21锣「亡sult[U]PIN69ColumnI/OYes22裁=result]1叫]PIN70ColumnI/OYes23■4^result[15jPIN72ColumnI/OYes24■S^outb0[0]PIN73ColumnI/OYes25<^outbO[l]PIN78RowI/OYes26«^outb0[2]PIN79RowI/OYes(27脅autbiD[习PIN80RowI/OYes28■E^outbl[0]PIN31RjowI/OYes23■E^outbl[ljPIN82RowI/OYes30■S^outbl[2]PIN83RjowI/OYes31毎0Llttil[可PIN86RowI/OYes32■fl^ou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论