您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 基于VHDL的通用计算器源程序文件
word格式精心整理版范文范例学习指导源程序4位二进制并行进位加法器的源程序ADDER4B.VHD如下LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYADDER4BIS--四位二进制并行加法器PORT(ci:INSTD_LOGIC;--低位进位a:INSTD_LOGIC_VECTOR3DOWNTO0);--4位加数b:INSTD_LOGIC_VECTOR(3DOWNTO0);--4位被加数s:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--4位和co:OUTSTD_LOGIC--进位输出);ENDADDER4B;ARCHITECTUREbehaveOFADDER4BISSIGNALSINT:STD_LOGIC_VECTOR(4DOWNTO0);--部定义的一个数据SIGNALaa,bb:STD_LOGIC_VECTOR(4DOWNTO0);BEGINaa=’0’&a;--将4位加数矢量扩为5位,为进位提供空间bb=’0’&b;--将4位被加数矢量扩为5位,为进位提供空间INT=aa+bb+ci;--相加s=SINT(3DOWNTO0);co=SINT(4);--最高位为输出进位ENDbehave;顶层模块:8位二进制并行进位加法器的部分程序ADDER8B.VHD如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYADDER8BISPORT(ci:INSTD_LOGIC;a:INSTD_LOGIC_VECTOR(7DOWNTO0);b:INSTD_LOGIC_VECTOR(7DOWNTO0);s:OUTSTD_LOGIC_VECTOR(7DOWNTO0);co:OUTSTD_LOGIC);ENDADDER8B;ARCHITECTUREaOFADDER8BISComponentadder4B--引用4位二进制并行进位加法器word格式精心整理版范文范例学习指导PORT(ci:INSTD_LOGIC;a:INSTD_LOGIC_VECTOR3DOWNTO0);b:INSTD_LOGIC_VECTOR(3DOWNTO0);s:OUTSTD_LOGIC_VECTOR(3DOWNTO0);co:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALCARRY_OUT:STD_LOGIC;--4位加法器的进位标志BEGINU1:ADDER4B--安装一个4位二进制加法器U1PORTMAP(ci=ci,a=a(3DOWNTO0),b=b(3DWONTO0),s=(3DOWNTO0),co=CARRY_OUT);U2:ADDER4B--安装一个4位二进制加法器U2PORTMAP(ci=CARRY_OUT,a=a(7DOWNTO4),b=b(7DWONTO4),s=(7DOWNTO4),co=co);ENDbehave;加法器VHDL程序如下LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYadderISport(a:instd_logic;--被加数ab:instd_logic;--加数bci:instd_logic;--输入进位s:outstd_logic;--结果输出co:outstd_logic--输出进位);endadder;architecturebehaveofadderissignaltem:std_logic;--暂存signalstem:std_logic;begintem=axorb;--中间变量stem=temxorci;--结果co=(temandci)or(aandb);--进位输出s=stem;--输出endbehave;word格式精心整理版范文范例学习指导4位二进制并行进位减法器的源程序suber.VHD如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYsub4ISPORT(a:INSTD_LOGIC_VECTOR(3DOWNTO0);--4位被减数b:INSTD_LOGIC_VECTOR(3DOWNTO0);--4位减数ci:INSTD_LOGIC;--输入进位s:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--结果输出co:OUTSTD_LOGIC--输出进位);endsuber;architecturebehaveofsuberiscomponentadderis--引用加法器的模块port(a:instd_logic;b:instd_logic;ci:instd_logic;s:outstd_logic;co:outstd_logic);endcomponent;signalbtem:std_logic_vector(3downto0);--减数寄存signalctem:std_logic_vector(4downto0);--进位寄存signalstem:std_logic_vector(3downto0);--结果寄存beginbtem(3downto0)=notb(3downto0);--先把减数求反ctem(0)=notci;--输入的进位也求反,从而对减数求补码g1:forIin0to3generate--连用4位全加器add:adderportmap(a(i),btem(i),ctem(i),stem(i),ctem(i+1));endgenerate;s(3downto0)=stem(3downto0);--结果输出co=notctem(4);--求反输出进位word格式精心整理版范文范例学习指导endbehave;乘法器的源程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;EntitymulisPort(a:instd_logic_vector(3downto0);--4位被乘数b:instd_logic_vector(3downto0);--4位乘数y:outstd_logic_vector(7downto0)--乘积);endmul;architecturearchofmulisbeginy(7downto0)=a(3downto0)*b(3downto0);endarch;除法器的源程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;entitydiverisPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);--8位被除数输入b:INSTD_LOGIC_VECTOR(3DOWNTO0);--4位除数输入clk:INSTD_LOGIC;--时钟str:INSTD_LOGIC;--启动信号s:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--4位商输出y:OUTSTD_LOGIC_VECTOR(3DOWNTO0)--4位余数输出);End;ArchitecturebehaveofdiverisComponentsuberis--引用减法器PORT(a:INSTD_LOGIC_VECTOR(3DOWNTO0);b:INSTD_LOGIC_VECTOR(3DOWNTO0);ci:INSTD_LOGIC;s:OUTSTD_LOGIC_VECTOR(3DOWNTO0);co:OUTSTD_LOGIC);Endcomponent;word格式精心整理版范文范例学习指导typestate_typeis(start,one,two,three,eror);--状态定义signalstate:state_type;--定义状态变量signalain:std_logic_vector(7downto0);--被除数寄存signalbin:std_logic_vector(3downto0);--除数寄存signalatem:std_logic_vector(3downto0);--减法器被减数输入signalbtem:std_logic_vector(3downto0);--减法器减数输入signalstem:std_logic_vector(3downto0);--结果寄存signalcitem:std_logic;--减法器借位输入signalcotem:std_logic;--减法器借位输出beginp2:process(clk)variablen:integerrange0to3;--移位次数计数值beginifclk’eventandclk=’1’thencasestateiswhenatart=--开始状态ifstr=’1’then--收到启动信号state=one;--转到状态oneatem(3downto0)=a(7downto4);--把高4位放到减法器被减数端btem(3downto0)=b(3downto0);--把除数放到减法器减数端ain(7downto0)=a(7downto0);--寄存被除数bin(3downto0)=b(3downto0);--寄存除数endif;whenone=--第一次移位ifcotem=’0’then--被除数高4位小于除数,溢出!state=eror;--转到出错状态else--不溢出ain(3downto1)=ain(2downto0);--被除数做移位ain(0)=notcotem;--在最低位接收该位商值atem(3downto0)=ain(6downto3);--把除数寄存器高4位输到减法器,作为减法器被减数state=two;--转到下一状态endif;whentwo=--再做3此移位ifn=2then--第四次移位state=three;--是,则跳转到下一状态n:=0;--移位计数器清零else--否则state=two;--还回到这个状态n:=n+1;--移位计数器加1endif;ifcotem=’0’then--不够减,有借位atem(3downto1)=stem(2downto0);--减法器结果移位作为下一次的输入else--够减,没有借位word格式精心整理版范文范例学习指导atem(3downto1)=atem(2downto0);--结果输出移位作为下一次的输入endif;ain(3downto1)=ain(2downto0);--结果寄存器左移一位ain(0)=notcotem;--这次运算借位输出,输入到寄存器ain最后一位atem(0)=ain(3);--寄存器ain的最高位作为减法器输入被减数的低位whenthree=--正常运算结果输出s(3downto1)=ain(2downto0);--寄存器ain低3位作为输出结果高3位s(0)=notcotem;--最后一次减法运算的借位输出求反作为结果输出最低位ifcotem=’0’then--最后一次减法运算,够减(无借位)y(3downto0)=atem(3downto0);--则减法器输出结果为整个除法的余数else--否则,不够减y(3downto0)=atem(3downto0);--则最后一次减法运算的被减数为整个除法的余数endif;atem(
本文标题:基于VHDL的通用计算器源程序文件
链接地址:https://www.777doc.com/doc-5407420 .html