出租车自动计费器VHDL程序报告.docx
《出租车自动计费器VHDL程序报告.docx》由会员分享,可在线阅读,更多相关《出租车自动计费器VHDL程序报告.docx(16页珍藏版)》请在冰豆网上搜索。
出租车自动计费器VHDL程序报告
出租车自动计费器VHDL程序报告
EDA课程设计
课程____________
题目____________
学院____________
专业班级
学生姓名
学生学号
指导教师
****年**月**日
3、 用加法器将几项收费相加,P=P1+P2+P3
4、 P1为起价,P2为行车里程计费,P3为等候时间计费,用四个数码管表示总的计费结果。
四、系统设计原理及过程
1、基本原理
本次设计首先在QuartusⅡ环境中对出租车自动计费器的各个部分利用VHDL这一硬件描述语言予以设计,生成模块。
而整个设计的核心部分就在里程、计时、计费处理模块。
里程、计时模块完成行驶距离和等待时间的处理以及起步距离之后和等待时间的计费脉冲的产生。
计费处理模块完成起步价计费、在计费脉冲来临之际累加计费的功能。
随后运用QuartusⅡ中的仿真功能对其予以仿真,从仿真的结果中分析程序的正确性。
待所有模块的功能正确之后,运用原理图搭建电路并进行整体仿真直至达到最初的设计要求,最后再在实验箱上综合下载检验设计的正确与否。
2、系统框图
根据设计要求,电路具有计时、计程、计费功能,用数码管显示行驶公里数、等待时间、收费金额,行车里程和等待时间的处理电路将汽车行驶的里程数、转换成与之成正比的计费脉冲,然后由计费电路转换成收费金额,实验中以一个脉冲模拟汽车前进十米,则每100个脉冲表示1公里,3公里以后每公里产生一个计费脉冲,一个1HZ的脉冲用来表示等待时间,60个脉冲代表1分钟,5分钟即300个脉冲产生一个等待计费脉冲,然后用计费电路对计费脉冲进行计费。
实验箱中只有一个48MHZ的时钟,所以需要分频之后再送给其他模块,最后将等待时间、行驶里程、计费金额经过译码电路送到数码管显示。
其设计框图如图1所示:
图1整体系统框图
3、电路及模块分析
系统总体设计电路如图2:
图2出租车自动计费器顶层电路原理图
1)行驶里程、等待时间处理模块
本模块是系统的核心模块之一,能够对外部的行驶距离脉冲、等待时间脉冲进行计数。
因为行驶距离每脉冲代表10米,所以计满100个数就输出一个行驶距离计费脉冲,因为3公里之内属于起步价,所以前3公里内不输出行驶距离计费脉冲,因为用3位数码管来显示行驶距离,其中两位整数,一位小数,所以行驶距离最小分辨率为0.1公里,行驶距离脉冲每计10个数,行驶距离输出加0.1,行驶距离最大值为99.9公里。
等待时间脉冲频率为1HZ,所以一个脉冲代表1秒,60个等待脉冲是1分钟,输出等待时间加1,等待时间5分钟计一次费,所以对等待时间脉冲计数,计满300个数就输出一个等待计费脉冲。
等待时间最大值为99分钟。
将行驶距离、等待时间送到数据选择器,计费脉冲送到计费模块完成距离、时间的显示以及计费功能。
2)计费模块
计费模块也是本系统的核心,完成起步价计费,等待时间,行驶计费功能。
计费器启动,显示起步价8元,之后每来一个行驶距离计费脉冲或者等待时间计费脉冲,计费金额自动加1.7元。
计费显示用3位数码管,所以计费最大值为99.9元。
将计费输出送到数据选择器,最后送到译码电路显示。
3)分频模块
因为实验箱上只有一个48MHZ的时钟,所以我们要经过分频电路得到我们所需要的频率,本系统中用到了三个分频,1HZ分频用来作为等待时间脉冲,10HZ分频作为行驶距离脉冲,每个脉冲代表行驶10米。
还有一个分频是作为数码管动态显示的扫频脉冲,由此频率生成一个八进制计数器,作为数据选择器的选择信号,将各个数据位轮流送到数码管,利用人眼的视觉暂留实现动态显示。
4)八进制计数器模块
八进制计数器模块完成八进制计数,从000计到111后,回到000重新计数,并将此数据送到数据选择器作为选择信号。
5)八选一数据选择器模块
本模块主要是完成数码管的动态扫描,将八位数据在选择信号的作用下依次送到译码电路,完成动态显示。
本模块的主要特点是有一个小数点标志位输出以及段选信号。
6)译码模块
本模块主要完成数据的译码,在段选信号,小数点标志位的共同作用下完成数据在八位数码管上的动态显示。
五、系统调试及下载
完成个模块的设计之后,将各个模块封装成元件,建立一个原理图文件,将各个模块连接起来,即完成了整个系统的顶层设计,顶层设计框图如上图图2所示。
下面对系统的核心模块进行仿真。
1、里程、等待时间处理模块
里程、行驶距离计费脉冲仿真图
由图可以看出每10个脉冲里程数加0.1,三公里以后每公里有一个计费脉冲B1。
等待时间,等待计费脉冲仿真图
由图可以看出每60个脉冲,等待时间加1。
等待时间每5分钟产生一个计费脉冲。
2、计费模块
计费模块仿真图
由图可以看出在计费脉冲来临之前,计费金额始终是起步价8元,之后每来一个计费脉冲,计费金额加1.7元。
其他模块较简单,这里就不一一仿真了,设计好顶层原理图之后,就可以配置引脚了,在配置引脚之前,先选择芯片EP1C6P240C8,然后配置好START、WR、RST按键,数码管位选、段选引脚就可以下载了。
六、结论
下载完之后,我们可以看到,八位数码管的右三位显示起步价08.0,中间三个数码管在以0.1为步长进行加法显示行驶里程,当行驶里程超过3公里之后,每公里计费金额加1.7元,当我们按下K2键,每分钟左边两个数码管加1,其显示的等待时间,当等待时间到5分钟时,计费金额加1.7元,由此我们可以判断,系统设计符合要求。
实验感想:
附:
实验程序
1.1HZ分频
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitypulseis
port(clk:
instd_logic;
--D:
instd_logic_vector(7DOWNTO0);
Fout:
outstd_logic);
end;
architectureoneofpulseis
signalfull:
std_logic;
begin
p_reg:
process(clk)
variablecnt8:
integerrange24000000downto0;
begin
ifclk'eventandclk='1'then
ifcnt8=24000000then
cnt8:
=0;
full<='1';
elsecnt8:
=cnt8+1;
full<='0';
endif;
endif;
endprocessp_reg;
p_div:
process(full)
variablecnt2:
std_logic;
begin
iffull'eventandfull='1'then
cnt2:
=notcnt2;
Ifcnt2='1'thenfout<='1';
elsefout<='0';
endif;
endif;
endprocessp_div;
end;
2、10HZ分频
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitypulse10is
port(clk:
instd_logic;
--D:
instd_logic_vector(7DOWNTO0);
Fout:
outstd_logic);
end;
architectureoneofpulse10is
signalfull:
std_logic;
begin
p_reg:
process(clk)
variablecnt8:
integerrange2400000downto0;
begin
ifclk'eventandclk='1'then
ifcnt8=2400000then
cnt8:
=0;
full<='1';
elsecnt8:
=cnt8+1;
full<='0';
endif;
endif;
endprocessp_reg;
p_div:
process(full)
variablecnt2:
std_logic;
begin
iffull'eventandfull='1'then
cnt2:
=notcnt2;
Ifcnt2='1'thenfout<='1';
elsefout<='0';
endif;
endif;
endprocessp_div;
end;
3、扫频分频
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitypulsespis
port(clk:
instd_logic;
--D:
instd_logic_vector(7DOWNTO0);
Fout:
outstd_logic);
end;
architectureoneofpulsespis
signalfull:
std_logic;
begin
p_reg:
process(clk)
variablecnt8:
integerrange24000downto0;
begin
ifclk'eventandclk='1'then
ifcnt8=24000then
cnt8:
=0;
full<='1';
elsecnt8:
=cnt8+1;
full<='0';
endif;
endif;
endprocessp_reg;
p_div:
process(full)
variablecnt2:
std_logic;
begin
iffull'eventandfull='1'then
cnt2:
=notcnt2;
Ifcnt2='1'thenfout<='1';
elsefout<='0';
endif;
endif;
endprocessp_div;
end;
4、里程、等待时间处理模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYJIFEIIS
PORT(CLK0,CLK1:
INSTD_LOGIC;
START:
INSTD_LOGIC;
WR:
INSTD_LOGIC;
RST:
INSTD_LOGIC;
B1,B2:
OUTSTD_LOGIC;
KM0,KM1,KM2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
MIN1,MIN0:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDJIFEI;
ARCHITECTUREBEHAVEOFJIFEIIS
BEGIN
RUN:
PROCESS(CLK0,START,WR,RST)
VARIABLER1:
INTEGERRANGE0TO9;
VARIABLER2:
INTEGERRANGE0TO99;
VARIABLEK:
STD_LOGIC_VECTOR(7DOWNTO0);
VARIABLEK2,K1,K0:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFRST='0'THENK0:
="0000";K1:
="0000";K2:
="0000";R1:
=0;R2:
=0;
ELSIFCLK0'EVENTANDCLK0='1'THEN
IFSTART='1'ANDWR='1'THEN
IFR1=9THENR1:
=0;
IFK0="1001"THEN
K0:
="0000";
IFK1="1001"THEN
K1:
="0000";
IFK2="1001"THEN
K2:
="0000";
ELSE
K2:
=K2+1;
ENDIF;
ELSE
K1:
=K1+1;
ENDIF;
ELSE
K0:
=K0+1;
ENDIF;
ELSER1:
=R1+1;
ENDIF;
K:
=K2&K1;
IFK>"00000001"THEN
IFR2<99THENR2:
=R2+1;B1<='0';
ELSER2:
=0;B1<='1';
ENDIF;
ENDIF;
ENDIF;
ENDIF;
KM0<=K0;KM1<=K1;KM2<=K2;
ENDPROCESS;
W:
PROCESS(CLK1,START,WR,RST)
VARIABLEW1:
INTEGERRANGE0TO59;
VARIABLEW2:
INTEGERRANGE0TO299;
VARIABLEM1:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEM0:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFRST='0'THENM0:
="0000";M1:
="0000";W1:
=0;W2:
=0;
ELSIFCLK1'EVENTANDCLK1='1'THEN
IFSTART='1'ANDWR='0'THEN
IFW1=59THENW1:
=0;
IFM0="1001"THEN
M0:
="0000";
IFM1="1001"THEN
M1:
="0000";
ELSEM1:
=M1+1;
ENDIF;
ELSEM0:
=M0+1;
ENDIF;
ELSEW1:
=W1+1;
ENDIF;
IFW2<299THENW2:
=W2+1;B2<='0';
ELSEW2:
=0;B2<='1';
ENDIF;
ENDIF;
ENDIF;
MIN0<=M0;
MIN1<=M1;
ENDPROCESS;
ENDARCHITECTURE;
5、计费模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYJINIS
PORT(B:
INSTD_LOGIC;
START:
INSTD_LOGIC;
RST:
INSTD_LOGIC;
P0,P1,P2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDJIN;
ARCHITECTUREBEHAVEOFJINIS
BEGIN
P:
PROCESS(B,START,RST)
VARIABLEC2,C1,C0:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFRST='0'THENC0:
="0000";C1:
="1000";C2:
="0000";
ELSIFSTART='1'THEN
IFB'EVENTANDB='1'THEN
IFC0>2THEN--加0.7元
IFC1="1001"THENC1:
="0000";
IFC2="1001"THENC2:
="0000";
ELSEC2:
=C2+1;
ENDIF;
ELSEC1:
=C1+1;
ENDIF;
C0:
=C0-3;
ELSEC0:
=C0+7;
ENDIF;
IFC1="1001"THENC1:
="0000";
IFC2="1001"THENC2:
="0000";
ELSEC2:
=C2+1;
ENDIF;
ELSEC1:
=C1+1;
ENDIF;
ENDIF;
ENDIF;
P0<=C0;P1<=C1;P2<=C2;
ENDPROCESS;
END;
6、八进制计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT8IS
PORT(CLK:
INSTD_LOGIC;
OUTY:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDCNT8;
ARCHITECTUREbehavOFCNT8IS
BEGIN
PROCESS(CLK)
VARIABLECQI:
STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCQI<"111"THENCQI:
=CQI+1;
ELSECQI:
="000";
ENDIF;
ENDIF;
OUTY<=CQI;
ENDPROCESS;
ENDbehav;
7、八选一数据选择器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMAX81IS
PORT(P0,P1,P2,K0,K1,K2,M0,M1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
S:
INSTD_LOGIC_VECTOR(2DOWNTO0);
D:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
B:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
POINT:
OUTSTD_LOGIC);
ENDMAX81;
ARCHITECTUREbody_mAx81OFmAx81IS
BEGIN
process(P0,P1,P2,K0,K1,K2,M0,M1,S)
begin
caseSis
WHEN"000"=>D<=P0;B<="11111110";POINT<='0';
WHEN"001"=>D<=P1;B<="11111101";POINT<='1';
WHEN"010"=>D<=P2;B<="11111011";POINT<='0';
WHEN"011"=>D<=K0;B<="11110111";POINT<='0';
WHEN"100"=>D<=K1;B<="11101111";POINT<='1';
WHEN"101"=>D<=K2;B<="11011111";POINT<='0';
WHEN"110"=>D<=M0;B<="10111111";POINT<='0';
WHEN"111"=>D<=M1;B<="01111111";POINT<='0';
WHENothers=>null;
endcase;
endprocess;
ENDbody_MAX81;
8、数码管译码程序
Libraryieee;
useieee.std_logic_1164.all;
entitydecl7sis
port(a:
instd_logic_vector(3downto0);
POINT:
INSTD_LOGIC;
led7s:
outstd_logic_vector(7downto0));
enddecl7s;
architectureoneofdecl7sis
begin
process(a,POINT)
begin
IFPOINT='0'THEN
caseais
when"0000"=>led7s<="11000000";
when"0001"=>led7s<="11111001";
when"0010"=>led7s<="10100100";
when"0011"=>led7s<="10110000";
when"0100"=>led7s<="10011001";
when"0101"=>led7s<="10010010";
when"0110"=>led7s<="10000010";
when"0111"=>led7s<="11111000";
when"1000"=>led7s<="10000000";
when"1001"=>led7s<="10010000";
whenothers=>null;
endcase;
ELSE
caseais
when"0000"=>led7s<="01000000";
when"0001"=>led7s<="01111001";
when"0010"=>led7s<="00100100";
when"0011"=>led7s<="00110000";
when"0100"=>led7s<="00011001";
when"0101"=>led7s<="00010010";
when"0110"=>led7s<="00000010";
when"0111"=>led7s<="01111000";
when"1000"=>led7s<="00000000";
when"1001"=>led7s<="00010000";
whenothers=>null;
endcase;
ENDIF;
endprocess;
end;