利用VHDL的实现通用计算器的源程序Word格式文档下载.docx

上传人:b****6 文档编号:17356484 上传时间:2022-12-01 格式:DOCX 页数:20 大小:19.67KB
下载 相关 举报
利用VHDL的实现通用计算器的源程序Word格式文档下载.docx_第1页
第1页 / 共20页
利用VHDL的实现通用计算器的源程序Word格式文档下载.docx_第2页
第2页 / 共20页
利用VHDL的实现通用计算器的源程序Word格式文档下载.docx_第3页
第3页 / 共20页
利用VHDL的实现通用计算器的源程序Word格式文档下载.docx_第4页
第4页 / 共20页
利用VHDL的实现通用计算器的源程序Word格式文档下载.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

利用VHDL的实现通用计算器的源程序Word格式文档下载.docx

《利用VHDL的实现通用计算器的源程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《利用VHDL的实现通用计算器的源程序Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。

利用VHDL的实现通用计算器的源程序Word格式文档下载.docx

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

=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:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1