VHDL简易出租车计价器.docx

上传人:b****9 文档编号:25662818 上传时间:2023-06-11 格式:DOCX 页数:35 大小:20.15KB
下载 相关 举报
VHDL简易出租车计价器.docx_第1页
第1页 / 共35页
VHDL简易出租车计价器.docx_第2页
第2页 / 共35页
VHDL简易出租车计价器.docx_第3页
第3页 / 共35页
VHDL简易出租车计价器.docx_第4页
第4页 / 共35页
VHDL简易出租车计价器.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

VHDL简易出租车计价器.docx

《VHDL简易出租车计价器.docx》由会员分享,可在线阅读,更多相关《VHDL简易出租车计价器.docx(35页珍藏版)》请在冰豆网上搜索。

VHDL简易出租车计价器.docx

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

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

当前位置:首页 > IT计算机 > 互联网

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

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