基于VHDL的通用计算器源程序文件Word文件下载.docx
《基于VHDL的通用计算器源程序文件Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于VHDL的通用计算器源程序文件Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
ENDbehave;
顶层模块:
8位二进制并行进位加法器的部分程序ADDER8B.VHD如下:
ENTITYADDER8BIS
INSTD_LOGIC_VECTOR(7DOWNTO0);
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
OUTSTD_LOGIC
ENDADDER8B;
ARCHITECTUREaOFADDER8BIS
Componentadder4B--引用4位二进制并行进位加法器
ENDCOMPONENT;
SIGNALCARRY_OUT:
STD_LOGIC;
--4位加法器的进位标志
U1:
ADDER4B--安装一个4位二进制加法器U1
PORTMAP(ci=>
ci,a=>
a(3DOWNTO0),b=>
b(3DWONTO0),s=>
(3DOWNTO0),co=>
CARRY_OUT);
U2:
ADDER4B--安装一个4位二进制加法器U2
CARRY_OUT,a=>
a(7DOWNTO4),b=>
b(7DWONTO4),s=>
(7DOWNTO4),co=>
co);
加法器VHDL程序如下
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYadderIS
port(a:
instd_logic;
--被加数a
--加数b
ci:
--输入进位
outstd_logic;
--结果输出
outstd_logic--输出进位
endadder;
architecturebehaveofadderis
signaltem:
std_logic;
--暂存
signalstem:
begin
tem<
=axorb;
--中间变量
stem<
=temxorci;
--结果
co<
=(temandci)or(aandb);
--进位输出
s<
=stem;
--输出
endbehave;
4位二进制并行进位减法器的源程序suber.VHD如下
:
ENTITYsub4IS
PORT(a:
--4位被减数
--4位减数
--结果输出
OUTSTD_LOGIC--输出进位
endsuber;
architecturebehaveofsuberis
componentadderis--引用加法器的模块
outstd_logic
endcomponent;
signalbtem:
std_logic_vector(3downto0);
--减数寄存
signalctem:
std_logic_vector(4downto0);
--进位寄存
--结果寄存
btem(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);
=notctem(4);
--求反输出进位
乘法器的源程序:
Entitymulis
Port(
a:
instd_logic_vector(3downto0);
--4位被乘数
--4位乘数
y:
outstd_logic_vector(7downto0)--乘积
);
endmul;
architecturearchofmulis
y(7downto0)<
=a(3downto0)*b(3downto0);
endarch;
除法器的源程序:
entitydiveris
--8位被除数输入
--4位除数输入
clk:
--时钟
str:
--启动信号
--4位商输出
OUTSTD_LOGIC_VECTOR(3DOWNTO0)--4位余数输出
End;
Architecturebehaveofdiveris
Componentsuberis--引用减法器
Endcomponent;
typestate_typeis(start,one,two,three,eror);
--状态定义
signalstate:
state_type;
--定义状态变量
signalain:
std_logic_vector(7downto0);
--被除数寄存
signalbin:
std_logic_vector(3downto0);
--除数寄存
signalatem:
--减法器被减数输入
--减法器减数输入
--结果寄存
signalcitem:
--减法器借位输入
signalcotem:
std_logic;
--减法器借位输出
p2:
process(clk)
variablen:
integerrange0to3;
--移位次数计数值
ifclk’eventandclk=’1’then
casestateis
whenatart=>
--开始状态
ifstr=’1’then--收到启动信号
state<
=one;
--转到状态one
atem(3downto0)<
=a(7downto4);
--把高4位放到减法器被减数端
=b(3downto0);
--把除数放到减法器减数端
ain(7downto0)<
=a(7downto0);
--寄存被除数
bin(3downto0)<
--寄存除数
endif;
whenone=>
--第一次移位
ifcotem=’0’then--被除数高4位小于除数,溢出!
=eror;
--转到出错状态
else--不溢出
ain(3downto1)<
=ain(2downto0);
--被除数做移位
ain(0)<
=notcotem;
--在最低位接收该位商值
=ain(6downto3);
--把除数寄存器高4位输到减法器,作为减法器被减数
=two;
--转到下一状态
whentwo=>
--再做3此移位
ifn=2then--第四次移位
=three;
--是,则跳转到下一状态
n:
=0;
--移位计数器清零
else--否则
state<
--还回到这个状态
n:
=n+1;
--移位计数器加1
endif;
ifcotem=’0’then--不够减,有借位
atem(3downto1)<
=stem(2downto0);
--减法器结果移位作为下一次的输入
else--够减,没有借位
=atem(2downto0);
--结果输出移位作为下一次的输入
ain(3downto1)<
--结果寄存器左移一位
ain(0)<
--这次运算借位输出,输入到寄存器ain最后一位
atem(0)<
=ain(3);
--寄存器ain的最高位作为减法器输入被减数的低位
whenthree=>
--正常运算结果输出
s(3downto1)<
--寄存器ain低3位作为输出结果高3位
s(0)<
--最后一次减法运算的借位输出求反作为结果输出最低位
ifcotem=’0’then--最后一次减法运算,够减(无借位)
y(3downto0)<
=atem(3downto0);
--则减法器输出结果为整个除法的余数
else--否则,不够减
--则最后一次减法运算的被减数为整个除法的余数
atem(3downto0)<
="
0"
;
--寄存器清零
btem(3downto0)<
=start;
--回到开始状态
wheneror=>
--溢出状态
endcase;
endprocessp2;
citem<
=’0’;
--4位减法器借位输入接地
U1:
suberportmap(atem,btem,citem,stem,cotem);
数字按键译码电路VHDL语言描述
entitynumdecoderis
port(reset:
inclk:
innum:
std_logic_vetctor(9downto0);
outnum:
bufferstd_logic_vector(3woento0);
outflag:
outstd_logic);
end;
architecturebehaveofnumdecoeris]
ifreser=’1’then
outnum<
=”0000”;
elsifinclk’eventandinclk=’1’then
caseinnumis
when”0000000001”=>
outnum<
outflag<
=’1’;
--按下第一个键表示输入0
when”0000000010”=>
=”0001”;
--按下第二个键表示输入1
when”0000000100”=>
=”0010”;
--按下第三个键表示输入2
when”0000001000”=>
=”0011”;
--按下第四个键表示输入3
when”0000010000”=>
=”0100”;
--按下第五个键表示输入4
when”0000100000”=>
=”0101”;
--按下第六个键表示输入5
when”0001000000”=>
=”0110”;
--按下第七个键表示输入6
when”0010000000”=>
=”0111”;
--按下第八个键表示输入7
when”010*******”=>
=”1000”;
--按下第九个键表示输入8
when”1000000000”=>
=”1001”;
--按下第十个键表示输入9
whenothers=>
=outnum;
--不按键时保持
endprocess;
7段译码器的vhdl语言描述
entityvdecodeis
port(indata:
outdata:
outstd_logic_vector(0to6)
Atchitecturebehaveofvdecodeis
Begin
Withindataselect
Outdata<
=”1111110”when”0000”,
”0110000”when”0000”,
”1111001”when”0000”,
”0110011”when”0000”,
”1011011”when”0000”,
”1011111”when”0000”,
”1110000”when”0000”,
”1111111”when”0000”,
”1111110”when”0000”,
”1111110”when”0000”,
”1111011”when”0000”,
”0000000”whenothers;
Endbehave;
8位二进制数转换成个位、十位、百位的进程:
Ctrview:
process(c,clk)
Begin
Ifc=’1’then
view1<
view2<
view<
viewstep<
=takenum;
elsifclk’eventandclk=’1’then
casevirestepis
whentakenum=>
ktemp<
=keep;
=hundred=>
ifktemp>
=”11001000”then
=ktemp-“11001000;
elsifktemp>
=”01100100”then
=ktemp-“01100100”;
elsifview1<
viewstep<
=ten;
whenten=>
=”01011010”then
=ktemp-“01011010”;
=”01010000”then
view2<
=ktemp-“01010000”;
=”01000110”then
view2<
=ktemp-“01000110”;
=”00111100”then
=ktemp-“00111100”;
=”00110010”then
=ktemp-“00110010”;
=”00101000”then
=ktemp-“00101000”;
=”00011110”then
=ktemp-“00011110”;
=”00010100”then
=ktemp-“00010100”;
=”00001010”then
=ktemp-“00001010”;
elsifview2<
=one
view3<
=ktemp(3downto0);
NULL;
endprocessctrview;
计算器的VHDL语言
Entitycalis
Port(inclk:
num:
instd_logic_vector(9downto0);
plus:
instd_logic;
subt:
mult:
mdiv:
equal:
c:
onum1,onum2,onum3:
outstd_logic_vector(0to0)
);
endcal;
architecturebehaveofcalis
typestateis(takenum,hundred,ten,one);
signalviewstep:
state;
signalktemp:
signalflag:
signalfl:
signalacc:
signalreg:
signalkeep:
signalans:
std_logic_vector(7downto0);
signaldans:
signalnumbuff:
signalvf:
signalstrdiv