VHDL简易出租车计价器.docx
《VHDL简易出租车计价器.docx》由会员分享,可在线阅读,更多相关《VHDL简易出租车计价器.docx(35页珍藏版)》请在冰豆网上搜索。
VHDL简易出租车计价器
------------------------------------------------------------------------------------------------------------------------顶层文件top.vhd
----------------------------------------------------------------------------------------------------------------------
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
entitytopis
port(
--输入300Hz时钟
clk:
instd_logic;
--按键输入开始信号
s:
instd_logic;
--按键输入等待信号
w:
instd_logic;
--按键输入加速信号
sp:
instd_logic;
--数码管位选
sel:
outstd_logic_vector(5downto0);
--七段数码管显示
show:
outstd_logic_vector(7downto0);
--点阵列显示
col:
outstd_logic_vector(7downto0);--lieshuchu
--点阵行显示
row:
outstd_logic_vector(7downto0)--hangshuchu
);
endtop;
architecturestructuraloftopis
--按键模块,加入防抖
componentanjian
port
(
clk:
instd_logic;
s:
instd_logic;
w:
instd_logic;
sp:
instd_logic;
--输出加入防抖后的等待信号
stop:
outstd_logic;
--输出加入防抖后的开始信号
start:
outstd_logic;
--输出加入防抖后的调速信号,共3档:
00,01,10
speeding:
outstd_logic_vector(1downto0)
);
endcomponent;
--计时,计里程,计费模块
componenttaxi
port(
--
clk:
instd_logic;
--
start:
instd_logic;
--
night:
instd_logic;
stop:
instd_logic;
--
mile:
instd_logic;
--总价格
char0:
outstd_logic_vector(3downto0);
char1:
outstd_logic_vector(3downto0);
char2:
outstd_logic_vector(3downto0);
--总等待时间
min0:
outstd_logic_vector(3downto0);
min1:
outstd_logic_vector(3downto0);
--单程总里程
km0:
outstd_logic_vector(3downto0);
km1:
outstd_logic_vector(3downto0)
);
endcomponent;
--数码管显示模块
componentdisplay
port(
--
reset:
instd_logic;
--
clk:
instd_logic;
--
char0:
instd_logic_vector(3downto0);
char1:
instd_logic_vector(3downto0);
char2:
instd_logic_vector(3downto0);
--
min0:
instd_logic_vector(3downto0);
min1:
instd_logic_vector(3downto0);
--
km0:
instd_logic_vector(3downto0);
km1:
instd_logic_vector(3downto0);
--
sel:
outstd_logic_vector(5downto0);
--
show:
outstd_logic_vector(7downto0)
);
endcomponent;
--调速模块
componentspeed
port
(clk:
instd_logic;
speeding:
instd_logic_vector(1downto0);
--输出公里脉冲信号
mile:
outstd_logic
);
endcomponent;
--点阵显示模块
componentdianzhen
port
(clk:
instd_logic;
Start,sp:
instd_logic;
col:
outstd_logic_vector(7downto0);--lieshuchu
row:
outstd_logic_vector(7downto0)--hangshuchu
);
endcomponent;
--
signalchar0:
std_logic_vector(3downto0);
signalchar1:
std_logic_vector(3downto0);
signalchar2:
std_logic_vector(3downto0);
--signalchar3:
std_logic_vector(3downto0);
signalmin0:
std_logic_vector(3downto0);
signalmin1:
std_logic_vector(3downto0);
signalkm0:
std_logic_vector(3downto0);
signalkm1:
std_logic_vector(3downto0);
signalmile:
std_logic;
signalstop:
std_logic;
signalstart:
std_logic;
signalspeeding:
std_logic_vector(1downto0);
begin
ss_control:
anjian
portmap(
clk=>clk,
s=>s,
w=>w,
start=>start,
stop=>stop,
sp=>sp,
speeding=>speeding
);
taxi_control:
taxi
portmap(
--
clk=>clk,
--
start=>start,
--
stop=>stop,
--
mile=>mile,
--
night=>night,
char0=>char0,
char1=>char1,
char2=>char2,
--char3=>char3,
--
min0=>min0,
min1=>min1,
--
km0=>km0,
km1=>km1
);
display_control:
display
portmap(
--
reset=>start,
--
clk=>clk,
--
char0=>char0,
char1=>char1,
char2=>char2,
--
min0=>min0,
min1=>min1,
--
km0=>km0,
km1=>km1,
--
sel=>sel,
--
show=>show
);
speed_control:
speed
portmap(
clk=>clk,
mile=>mile,
speeding=>speeding
);
dianzhen_control:
dianzhen
portmap(
clk=>clk,
start=>start,
col=>col,
row=>row,
Sp=>sp
);
endstructural;
------------------------------------------------------------------------------------------------------------------------按键模块anjian.vhd
----------------------------------------------------------------------------------------------------------------------
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityanjianis
port
(clk:
instd_logic;
s:
instd_logic;
w,sp:
instd_logic;
stop:
outstd_logic;
start:
outstd_logic;
speeding:
outstd_logic_vector(1downto0)
);
endanjian;
architectureoneofanjianis
signalstop1:
std_logic;
signalstart1:
std_logic;
SIGNALcount,scount,count1,scount1,count2,scount2:
INTEGERRANGE0TO1999;
SIGNALtkey,tkey1,tkey2:
STD_LOGIC;
SIGNALJO,jo1,jo2:
INTEGER;
BEGIN
------------------------------------------------------------------------------------------------------------------------加入防抖程序,利用按键控制输出开始信号
----------------------------------------------------------------------------------------------------------------------
p1:
PROCESS(clk)
BEGIN
IF(clk'eventANDclk='1')THEN--计数器
IFs='1'THEN
IFcount=1999THEN
count<=count;
ELSE
count<=count+1;
ENDIF;
IFcount=1998THEN
tkey<='1';
ELSE
tkey<='0';
ENDIF;
ELSEcount<=0;
ENDIF;
ENDIF;
ENDPROCESSp1;
p2:
PROCESS(tkey,scount)
BEGIN
IF(tkey'eventANDtkey='1')THEN
scount<=scount+1;
ELSEscount<=scount;
ENDIF;
JO<=scountrem2;
ENDPROCESSp2;
p3:
PROCESS(JO)
BEGIN
IFJO=0THEN--判断按键的次数,奇数为‘1’,偶数位‘0’
start1<='0';
ELSE
start1<='1';
ENDIF;
ENDPROCESSp3;
start<=start1;
------------------------------------------------------------------------------------------------------------------------加入防抖程序,利用按键控制输出等待信号
----------------------------------------------------------------------------------------------------------------------
p4:
PROCESS(clk)
BEGIN
IF(clk'eventANDclk='1')THEN
IFw='1'THEN
IFcount1=19THEN
count1<=count1;
ELSE
count1<=count1+1;
ENDIF;
IFcount1=18THEN
tkey1<='1';
ELSE
tkey1<='0';
ENDIF;
ELSEcount1<=0;
ENDIF;
ENDIF;
ENDPROCESSp4;
p5:
PROCESS(tkey1,scount1)
BEGIN
IF(tkey1'eventANDtkey1='1')THEN
scount1<=scount1+1;
ELSEscount1<=scount1;
ENDIF;
JO1<=scount1rem2;
ENDPROCESSp5;
p6:
PROCESS(JO1)
BEGIN
IFJO1=0THEN--判断按键的次数,奇数为‘1’,偶数位‘0’
stop1<='0';
ELSE
stop1<='1';
ENDIF;
ENDPROCESSp6;
stop<=stop1;
------------------------------------------------------------------------------------------------------------------------加入防抖程序,利用按键控制输出调速信号
----------------------------------------------------------------------------------------------------------------------
PROCESS(clk)
BEGIN
IF(clk'eventANDclk='1')THEN
IFsp='1'THEN
IFcount2=19THEN
count2<=count2;
ELSE
count2<=count2+1;
ENDIF;
IFcount2=18THEN
tkey2<='1';
ELSE
tkey2<='0';
ENDIF;
ELSEcount2<=0;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(tkey2,scount2)
BEGIN
IF(tkey2'eventANDtkey2='1')THEN
ifscount2=2then
scount2<=0;
else
scount2<=scount2+1;
endif;
ELSEscount2<=scount2;
endif;
ifscount2=0then--根据按键的次数判断调速的不同档,一次为‘00’,两次为‘01’,三次speeding<="00";--为‘10’
speeding<="00";
elsifscount2=1then
speeding<="01";
elsifscount2=2then
speeding<="10";
endif;
ENDPROCESS;
ENDone;
------------------------------------------------------------------------------------------------------------------------调速模块speed.vhd
----------------------------------------------------------------------------------------------------------------------
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
entityspeedis
port(
clk:
instd_logic;
mile:
outstd_logic;--输出公里脉冲信号
speeding:
instd_logic_vector(1downto0));--调速信号,分为三档
endspeed;
architectureoneofspeedis
signalmile1:
std_logic;
signalq_temp:
integerrange0to999999999;
signalq_temp1:
integerrange0to999999999;
begin
mile<=mile1;
process(clk,speeding)
begin
ifspeeding="00"then--根据调速信号的不同档,进行不同的分频
q_temp1<=99999999;
elsifspeeding="01"then
q_temp1<=49999999;
elsifspeeding="10"then
q_temp1<=24999999;
endif;
ifrising_edge(clk)then--计数器
ifq_temp>=q_temp1then
q_temp<=0;
mile1<='1';
else
q_temp<=q_temp+1;
mile1<='0';
endif;
endif;
endprocess;
endone;
------------------------------------------------------------------------------------------------------------------------计时计里程计费模块taxi.vhd
----------------------------------------------------------------------------------------------------------------------
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTiTYtaxiIS
PORT(
--输入时钟
clk:
INSTD_LOGIC;
--计价器启动
Start:
INSTD_LOGIC;
--等待信号
Stop:
INSTD_LOGIC;
--公里脉冲信号
mile:
instd_logic;
--SIGNALf_wait1:
outSTD_LOGIC;
--SIGNALf1:
outSTD_LOGIC;
--计费输出
Char0:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
Char1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
Char2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
--等待时间输出
min0:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
Min1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
--行驶公里输出
km0:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
Km1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDtaxi;
ARCHITECTUREbehaveoftaxiIS
--分频得1HZ时钟
SIGNALclk1hz:
STD_LOGIC;
--分频器
SIGNALq:
INTEGERRANGE0to49999999;
SIGNALsec:
iNTEGERRANGE0to2;
signala:
iNTEGERRANGE0to4;
--计费寄存器
SIGNALc3,c2,c1,c0:
STD_LOGIC_VECTOR(3DOWNTO0);
--公里寄存器
SIGNALk0:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALk1:
STD_LOGIC_VECTOR(3DOWNTO0);
--等待时间寄存器
SIGNALm1:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALm0:
STD_LOGIC_VECTOR(3DOWNTO0);
--路程大于3公里,使能有效
SIGNALen0:
STD_LOGIC;
SIGNALen1:
STD_LOGIC;
--等待时间,1脉冲/3秒
SIGNALf_wait:
STD_LOGIC;
--公里脉冲
signalf_mile_r:
std_logic;
--计费时钟
SIGNALf:
STD_LOGIC;
--单价
SIGNALc:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
--输出显示
min0<=m0;
Min1<=