出租车自动计费器EDA设计.docx
《出租车自动计费器EDA设计.docx》由会员分享,可在线阅读,更多相关《出租车自动计费器EDA设计.docx(14页珍藏版)》请在冰豆网上搜索。
出租车自动计费器EDA设计
出租车自动计费器EDA设计
6.7.1设计要求
设计一个出租车自动计费器,计费包括起步价、行车里程计费、等待时间计费三部分,用三位数码管显示金额,最大值为元,最小计价单元为元,行程3公里内,且等待累计时间3分钟内,起步费为8元,超过3公里,以每公里元计费,等待时间单价为每分钟1元。
用两位数码管显示总里程。
最大为99公里,用两位数码管显示等待时间,最大值为59min。
6.7.2原理描述
根据层次化设计理论,该设计问题自顶向下可分为分频模块,控制模块计量模块、译码和动态扫描显示模块,其系统框图如图6-63所示,各模块功能如下:
图6-63出租车自动计费器系统框图
1分频模块
分频模块对频率为240Hz的输入脉冲进行分频,得到的频率为16Hz,10Hz和1Hz的三种频率。
该模块产生频率信号用于计费,每个1HZ脉冲为元计费控制,10HZ信号为1元的计费控制,16Hz信号为元计费控制。
2计量控制模块
计量控制模块是出租车自动计费器系统的主体部分,该模块主要完成等待计时功能、计价功能、计程功能,同时产生3分种的等待计时使能控制信号en1,行程3公里外的使能控制信号en0。
其中计价功能主要完成的任务是:
行程3公里内,且等待累计时间3分钟内,起步费为8元;3公里外以每公里元计费,等待累计时间3分钟外以每分钟1元计费;计时功能主要完成的任务是:
计算乘客的等待累计时间,计时器的量程为59分,满量程自动归零;计程功能主要完成的任务是:
计算乘客所行驶的公里数。
计程器的量程为99公里,满量程自动归零。
3译码显示模块
该模块经过8选1选择器将计费数据(4位BCD码)、计时数据(2位BCD码)、计程数据(2位BCD码)动态选择输出。
其中计费数据jifei4~jifei1~送入显示译码模块进行译码,最后送至百元、十元、元、角为单位对应的数码管上显示,最大显示为元;计时数据送入显示译码模块进行译码,最后送至分为单位对应的数码管上显示,最大显示为59秒;计程数据送入显示译码模块进行译码,最后送至以公里为单位的数码管上显示,最大显示为99公里。
6.7.3层次化设计方案
1出租车自动计费器系统的主体FPGA电路txai的VHDL设计
根据6.7.2节的功能描述,该电路的核心部分就是计数分频电路,通过VHDL语言的顺序语句IF-THEN-ELSE根据一个或一组条件来选择某一特定的执行通道,生成计费数据、计时数据和里程数据。
其VHDL源程序如下:
LIBRARYIEEE;
USE
USEtaxiis
port(clk_240:
instd_logic;--频率为240Hz的时钟
start:
instd_logic;--计价使能信号
stop:
instd_logic;--等待信号
fin:
instd_logic;--公里脉冲信号
cha3,cha2,cha1,cha0:
outstd_logic_vector(3downto0);--费用数据
km1,km0:
outstd_logic_vector(3downto0);--公里数据
min1,min0:
outstd_logic_vector(3downto0));--等待时间
endtaxi;
architecturebehavoftaxiis
signalf_10,f_16,f_1:
std_logic;--频率为10Hz,16Hz,1Hz的信号
signalq_10:
integerrange0to23;--24分频器
signalq_16:
integerrange0to14;--15分频器
signalq_1:
integerrange0to239;--240分频器
signalw:
integerrange0to59;--秒计数器
signalc3,c2,c1,c0:
std_logic_vector(3downto0);--十进费用计数器
signalk1,k0:
std_logic_vector(3downto0);--公里计数器
signalm1:
std_logic_vector(2downto0);--分的十位计数器
signalm0:
std_logic_vector(3downto0);--分的个位计数器
signalen1,en0,f:
std_logic;--使能信号
begin
feipin:
process(clk_240,start)
begin
ifclk_240'eventandclk_240='1'then
ifstart='0'thenq_10<=0;q_16<=0;f_10<='0';f_16<='0';f_1<='0';f<='0';
else
ifq_10=23thenq_10<=0;f_10<='1';--此IF语句得到频率为10Hz的信号
elseq_10<=q_10+1;f_10<='0';
endif;
ifq_16=14thenq_16<=0;f_16<='1';--此IF语句得到频率为16Hz的信号
elseq_16<=q_16+1;f_16<='0';
endif;
ifq_1=239thenq_1<=0;f_1<='1';--此IF语句得到频率为1Hz的信号
elseq_1<=q_1+1;f_1<='0';
endif;
ifen1='1'thenf<=f_10;--此IF语句得到计费脉冲f
elsifen0='1'thenf<=f_16;
elsef<='0';
endif;
endif;
endif;
endprocess;
main:
process(f_1)
begin
iff_1'eventandf_1='1'then
ifstart='0'then
w<=0;en1<='0';en0<='0';m1<="000";m0<="0000";k1<="0000";k0<="0000";
elsifstop='1'then
ifw=59thenw<=0;--此IF语句完成等待计时
ifm0="1001"thenm0<="0000";--此IF语句完成分计数
ifm1<="101"thenm1<="000";
elsem1<=m1+1;
endif;
elsem0<=m0+1;
endif;
ifm1&m0>"0000010"thenen1<='1';--此IF语句得到en1使能信号
elseen1<='0';
endif;
elsew<=w+1;en1<='0';
endif;
elsiffin='1'then
ifk0="1001"thenk0<="0000";--此IF语句完成公里脉冲计数
ifk1="1001"thenk1<="0000";
elsek1<=k1+1;
endif;
elsek0<=k0+1;
endif;
ifk1&k0>"00000010"thenen0<='1';--此IF语句得到en0使能信号
elseen0<='0';
endif;
elseen1<='0';en0<='0';
endif;
cha3<=c3;cha2<=c2;cha1<=c1;cha0<=c0;--费用数据输出
km1<=k1;km0<=k0;min1<='0'&m1;min0<=m0;--公里数据、分钟数据输出
endif;
endprocessmain;
jifei:
process(f,start)
begin
ifstart='0'thenc3<="0000";c2<="0000";c1<="1000";c0<="0000";
elsiff'eventandf='1'then
ifc0="1001"thenc0<="0000";--此IF语句完成对费用的计数
ifc1="1001"thenc1<="0000";
ifc2="1001"thenc2<="0000";
ifc3<="1001"thenc3<="0000";
elsec3<=c3+1;
endif;
elsec2<=c2+1;
endif;
elsec1<=c1+1;
endif;
elsec0<=c0+1;
endif;
endif;
endprocessjifei;
endbehav;
该源程序包含3个进程模块。
fenpin进程对频率为240Hz的输入脉冲进行分频,得到的频率为16Hz,10Hz和1Hz的三种计费频率信号,供main进程和jifei进程进行计费、计时、计程之用;main进程完成等待计时功能、计程功能,该模块将等待时间和行驾公里数变换成脉冲个数计算,同时产生3分种的等待计时使能控制信号en1,行程3公里外的使能控制信号en0;jifei进程将起步价8元预先固定在电路中,通过对计费脉冲数的统计,计算出整个费用数据。
源程序中输入信号fin是汽车传感器提供的距离脉冲信号;start为汽车计价启动信号,当star=1时,表示开始计费(高电平有效),此时将计价器计费数据初值80(即元)送入,计费信号变量(cha3cha2cha1cha0=0080),里程数清零(km1km0=00),计时计数器清零(min1min0=00);stop为汽车停止等待信号(高电平有效),当stop=1时,表示停车等待状态,并开始等待计时计费。
其部分仿真输出波形如图6-64和图6-65所示,元件符号如图6-66所示。
在图6-64中,stop=0即全程无停止等待时间,因此计时显示输出为00,该图中出租车总行驶5公里,等待累计时间为0分钟,总费用为元;图6-65中共有3次停车等待累计时间为3分钟,出租车总行驶21公里,总费用为元,仿真结果正确。
图6-64出租车自动计费器系统的主体电路仿真输出波形
(1)
图6-65出租车自动计费器系统的主体电路仿真输出波形
(2)
图6-66出租车自动计费器系统的主体FPGA电路元件符号
2扫描显示电路
该模块包含8选1选择器,模8计数器,七段数码显示译码器三个子模块,其VHDL源程序和仿真输出如下:
1)模8计数器se的VHDL源程序和仿真
LIBRARYIEEE;
USE
ENTITYseIS;
port(clk:
instd_logic;
a:
outstd_logic_vector(2downto0));
EDNse;
ARCHITECTURErt1ofseIS
begin
process(clk)
variableb:
std_logic_vector(2downto0);
begin
if(clk'eventandclk='1')then
if(b="111")then
b:
="000";
else
b:
=b+1;
endif;
endif;
a<=b;
endprocess;
endrt1;
源程序中输入信号clk为系统输入的240HZ基准时钟,输出a为3位二进制编码,其仿真输出波形如图6-67(a)所示,元件符号如图6-67(b)所示。
(a)(b)
图6-67模8计数器se
(a)仿真输出波形;(b)元件符号图
2)8选1选择器mux8_1的VHDL源程序和仿真
LIBRARYIEEE;
USE
ENTITYmux8_1IS;
port(c:
instd_logic_vector(2downto0);
dp:
outstd_logic;
a1,a2,a3,a4,b1,b2,t1,t2:
instd_logic_vector(3downto0);
d:
outstd_logic_vector(3downto0));
endmux8_1;
architecturert1ofmux8_1is
begin
process(c,a1,a2,a3,a4,b1,b2,t1,t2)
variablecomb:
std_logic_vector(2downto0);
begin
comb:
=c;
casecombis
when"000"=>d<=a1;dp<='0';
when"001"=>d<=a2;dp<='0';
when"010"=>d<=a3;dp<='1';
when"011"=>d<=a4;dp<='0';
when"100"=>d<=b1;dp<='0';
when"101"=>d<=b2;dp<='0';
when"110"=>d<=t1;dp<='0';
when"111"=>d<=t2;dp<='0';
whenothers=>null;
endcase;
endprocess;
endrt1;
源程序中输入信号c[2..0]为系统选择输入,a1a2a3a4为计费数据BCD码输入,b1b2为里程数BCD码输入,t1t2为计时时间的BCD码输入,d为4位BCD码输出,dp为小数点指示信号(仅计费数据输出时有一位小数)。
其仿真输出波形和元件符号如图6-68所示。
(a)(b)
图6-68选择器mux8_1
(a)仿真输出波形;(b)元件符号图
3)七段数码显示译码器di_LED的VHDL源程序和仿真
LIBRARYIEEE;
USE
ENTITYdi_LEDIS;
port(d:
instd_logic_vector(3downto0);
q:
outstd_logic_vector(6downto0));
enddi_LED;
architecturert1ofdi_LEDis
begin
process(d)
begin
casedis
when"0000"=>q<="0111111";--gfedcba
when"0001"=>q<="0000110";
when"0010"=>q<="1011011";
when"0011"=>q<="1001111";
when"0100"=>q<="1100110";
when"0101"=>q<="1101101";
when"0110"=>q<="1111101";
when"0111"=>q<="0100111";
when"1000"=>q<="1111111";
whenothers=>q<="1101111";
endcase;
endprocess;
endrt1;
源程序中输入信号d[3..0]为BCD码输入,q[6..0]为4七段译码输出(高电平有效)。
其仿真输出波形如图6-69(a)所示,元件符号如图6-69(b)所示:
(a)(b)
图6-69七段数码显示译码器di_LED
(a)仿真输出波形;(b)元件符号图
6.7.4出租车自动计费器顶层电路的设计和仿真
根据图6-63出租车自动计费器系统框图,出租车自动计费器顶层电路分为四个模块,它们是出租车自动计费器系统的主体FPGA电路txai模块,8选1选择器mux8_1模块,模8计数器se模块,七段数码显示译码器di_LED模块,生成动态扫描显示片选信号的3-8译器模块decode3_8,图6-70所示的是自动计费器顶层电路原理图。
按已确立的层次化设计思路,在QuartusII图形编缉器中分别调入前面的层次化设计方案中所设计的低层模块的元件符号、、、、并加入相应的输入输出引脚与辅助元件。
而3-8译码器模块可利用宏功能向导“MegaWizardPlug-InManager...”定制(详细步骤参见第5章节)。
而后根据图6-70完成出租车自动计费器的顶层原理图输入。
电路连好线,对其编译和仿真。
正确编译后仿真输出波形和元件符号如图6-71所示。
在图6-71(a)中,K2=0即全程无停止等待时间,因此计时显示输出为3F(00),该图中出租车总行驶3F(0)5B
(2)(即2公里),等待累计时间为3F(0)3F(0)(0分钟),总费用为(元),仿真结果正确。
图6-70出租车自动计费器顶层电路原理图
(a)(b)
图6-71出租车自动计费器顶层电路
(a)仿真输出波形;(b)元件符号图
6.7.5硬件测试
为了能对所设计的出租车自动计费器电路进行硬件测试,应将其输入输出信号锁定在开发系统的目标芯片引脚上,并重新编译,然后对目标芯片进行编程下载,完成出租车自动计费器电路的最终开发,其硬件测试示意图如图6-72。
不失一般性,本设计选用的EDA开发平台GW48电路模式为,选择目标器件为EP1C6Q240C8芯片。
图6-72中,clk是基准时钟,锁定引脚时将clk接至clock0(接受240Hz的时钟频率);计价使能信号K1(1:
开始计价、0停止计价)同键8(PIO7)相连;停车等待信号K2(1:
停车等待、0:
正常行驶)接键5(PIO4);公里脉冲信号clk_R(每按一次就输出一个脉冲)接键4(PIO13);输出se[7..0]是8个数码管的位选控制信号,对应EP1C6Q240C8芯片的PIO34、PIO35、PIO36、PIO37、PIO38、PIO39、PIO40、PIO41,该信号高电平有效,由低位至高位分别接通数码管8、数码管7、数码管6、数码管5、数码管4、数码管3、数码管2、数码管1;输出dp和out[6..0]为8段控制信号,由高位至低位分别接并联数码管的输入信号p(小数点)、g、f、e、d、c、b、a,该信号将锁定对应EPIC6芯片引脚的PIO49、PIO48、PIO47、PIO46、PIO45、PIO44、PIO43、PIO42。
图6-72出租车自动计费器硬件测试示意图
数码管8数码管7数码管6数码管5显示行车计费数据,数码管4数码管3显示行车里程数据,数码管2数码管1显示停车等待的计时时间