EDA课程设计出租车计价器.docx
- 文档编号:29804791
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:21
- 大小:143.67KB
EDA课程设计出租车计价器.docx
《EDA课程设计出租车计价器.docx》由会员分享,可在线阅读,更多相关《EDA课程设计出租车计价器.docx(21页珍藏版)》请在冰豆网上搜索。
EDA课程设计出租车计价器
EDA课程设计
专题实践
题目:
出租车自动计费器
姓名:
学院:
电子与信息工程学院
专业:
电子信息科学与技术
班级:
电信1204班
一、设计题目:
出租车自动计费器
二、设计目标:
1、 设计一个出租车自动计费器,具有行车里程计费、等候时间计费、及起价三部分,用四位数码管显示总金额,最大值为99.99元;
2、 行车里程单价1.7元/公里,等候时间单价1.7元/5分钟,起价8元(3公里起价)。
3、 行车里程的计费电路将汽车行驶的里程数转换成与之成正比的脉冲数,然后由计数译码电路转换成收费金额,实验中以一个脉冲模拟汽车前进十米比例系数,从而计算出具体费用。
4、 用LED显示行驶公里数,四个数码管显示收费金额。
三、设计原理:
将汽车行驶的里程数和等候时间分别转换成与之成正比的脉冲数,然后将里程脉冲和等待脉冲乘以分别的单价得到具体的费用,再将几项收费相加,得到最终的金额。
再用分码器将钱的每一位分开,用四个数码管表示总的计费结果。
本次设计的模块包括:
分频器、计数器、比例乘法器、分码器、数码管扫频电路。
另设4个按键:
RST(停止)、EN(启动)、START(行驶)、STOP(等待),通过按下RST模拟汽车的停止,按下EN模拟汽车的发动此时计价器显示起步价8元,按下START键时模拟汽车在行驶,此时开始计公里数,按下STOP键时,模拟出租车在等待,计数器计等待时间。
总设计的实验框图如下:
图
(1)原理框图
四、设计内容:
(1)分频器模块
其功能是将实验室的48MH的频率分别分成1HZ、10HZ、1HZ。
将1HZ作为等待时间计数的脉冲,每一个脉冲代表1s。
10HZ的脉冲作为里程计数的输入脉冲,每一个脉冲代表10m。
1KHZ用于数码管扫频电路的扫频中。
图
(2)分频器
程序代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.NUMERIC_BIT.ALL;--包含移位函数等.
ENTITYint_divIS
GENERIC
(
F_DIV:
Integer:
=4800000;--分频系数
F_DIV_WIDTH:
Integer:
=32--分频计数器宽度
);
PORT(
clock:
INSTD_LOGIC;
clock_out:
OUTSTD_LOGIC
);
END;
ARCHITECTUREoneOFint_divIS
SIGNALclk_p_r:
STD_LOGIC;--上升沿输出时钟
SIGNALclk_n_r:
STD_LOGIC;--下降沿输出时钟
SIGNALcount_p:
STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);--上升沿脉冲计数器
SIGNALcount_n:
STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);--下降沿脉冲计数器
--SIGNALf_div_width_r:
STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);
SIGNALclock_out_r:
STD_LOGIC;
SIGNALfull_div_p:
STD_LOGIC;--上升沿计数满标志
SIGNALhalf_div_p:
STD_LOGIC;--上升沿计数半满标志
SIGNALfull_div_n:
STD_LOGIC;--下降沿计数满标志
SIGNALhalf_div_n:
STD_LOGIC;--下降沿计数半满标志
BEGIN
clock_out<=clock_out_r;
--clock_out<=clockWHEN(F_DIV=1)ELSE((clk_p_r='1'ANDclk_n_r='1')WHEN(F_DIV(0)='1')clk_p_r);-------------------------<<判断计数标志位置位与否.
full_div_p<='1'WHEN(count_p half_div_p<='1'WHEN(count_p<(F_DIV/2)-1)ELSE'0'; full_div_n<='1'WHEN(count_n half_div_n<='1'WHEN(count_n<(F_DIV/2)-1)ELSE'0'; PROCESS(clock)--上升沿脉冲计数 --VARIABLEi: IntegerRANGE0TO31; BEGIN IFRISING_EDGE(clock)THEN IFfull_div_p='1'THEN count_p<=count_p+1; IF(half_div_p='1')THEN clk_p_r<='0'; ELSE clk_p_r<='1'; ENDIF; ELSE count_p<=(OTHERS=>'0'); clk_p_r<='0'; ENDIF; ENDIF; ENDPROCESS; PROCESS(clock)--下降沿脉冲计数 BEGIN IFFALLING_EDGE(clock)THEN IFfull_div_n='1'THEN count_n<=count_n+1; IFhalf_div_n='1'THEN clk_n_r<='0'; ELSE clk_n_r<='1'; ENDIF; ELSE count_n<=(OTHERS=>'0'); clk_n_r<='0'; ENDIF; ENDIF; ENDPROCESS; PROCESS(clock) BEGIN IFRISING_EDGE(clock)THEN IFF_DIV=1THEN clock_out_r<=clock; ELSE IF(F_DIVREM2)=1THEN clock_out_r<=clk_p_rANDclk_n_r; ELSE clock_out_r<=clk_p_r; ENDIF; ENDIF; ENDIF; ENDPROCESS; END; (2)里程计数模块 其功能是得到出租车行驶的公里数。 每一个脉冲模拟的是10m,所以100个脉冲为1km,需要两个一百进制计数器,第一个计数器计满数后进位输出作为高位计数器的输入时钟,高位100计数器输出的是里程公里数。 当按下REST键时计数器清零。 按下EN键后,再按下START键,此时里程计数器开始计数,来一个脉冲加1,到99时为1公里,高位100进制计数器计数加1,并输出公里数。 图(3)里程计数器 程序代码: libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entityCNT0100is port(clk,start,stop,rst,EN: instd_logic; kilo: outintegerrange0to100); end; architecturebehavofCNT0100is begin process(clk,rst,start,stop,en) variablecqi,k: integerrange0to100; variableflag1,flag2: std_logic: ='0';--flag1控制计数器是否清零,flag2控制计数是否计数 begin ifrst='0'thencqi: =0;flag2: ='0';flag1: ='0';k: =0; elsifclk'eventandclk='1'then ifen='0'thenflag2: ='1'; elseflag2: =flag2; endif; ifstop='0'andflag2='1'thenflag1: ='0'; elseflag1: =flag1; endif; ifstart='0'andflag2='1'thenflag1: ='1';--计数器开始计数 elseflag1: =flag1; endif; ifflag1='0'thencqi: =cqi; elseifcqi<99thencqi: =cqi+1;--小于99时继续计数加1,否则计数清零 elsecqi: =0; endif; ifcqi=99then--计满99时加1 ifk<99thenK: =K+1; elsek: =0; endif; elseK: =K; endif; endif; endif; kilo<=k;--输出公里数 endprocess; end; (3)计时模块 其功能室得到等待的时间数。 每一个脉冲的是1s,所以60个脉冲为1分钟,需要两个一60进制计数器,第一个计数器计满数后进位输出作为高位计数器的时钟,高位60计数器输出的是分钟数。 当按下REST键时计数器清零。 按下EN键后,再按下STOP键,此时等待时间计数器开始计数,来一个脉冲加1,到59s时为1分钟,高位60进制计数器计数加1,并输出分钟数。 图(4)等待时间计数器 程序代码: libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entityWAIT60is port(clk,start,stop,rst,en: instd_logic; waitime: outintegerrange0to60); end; architecturebehavofWAIT60is begin process(clk,rst,start,stop,en) variablecqi,W: integerrange0to60; variableflag1,flag2: std_logic: ='0';--控制计数器的清零和计数,受rst,en,stop的控制 begin ifrst='0'thencqi: =0;flag2: ='0';flag1: ='0'; elsifclk'eventandclk='1'then ifen='0'thenflag2: ='1'; elseflag2: =flag2; endif; ifstop='0'ANDflag2='1'thenflag1: ='1';w: =0; elseflag1: =flag1; endif; ifstart='0'andflag2='1'thenflag1: ='0'; elseflag1: =flag1; endif; ifflag1='0'thencqi: =cqi;--计数保持 else ifcqi<59thencqi: =cqi+1;--计数加1 elsecqi: =0; endif; ifcqi=59then ifw<59thenW: =W+1; elsew: =0; endif; elseW: =W; endif; endif; endif; waitime<=W;--输出分钟数 endprocess; end; (4)费用计算模块 其功能是得到总的费用,并将其三个十进制数表示。 每1km是1.7元,所以将公里数乘上1.7元,得到公里数的钱的10倍。 每等待5分钟是1.7元,将等待时间对5去整再乘以1.7元,得到等待时间钱的10倍。 再将行驶时的费用,等待时的费用和起步价相加得到总费用。 再将费用对100取整得到十元位,再得到元位和角位。 当在3公里以内是固定输出8元,否则输出正常计数所得的钱。 按rest键时,输出钱为0元。 当按下en后,公里数小于3时输出8元,公里数大于3后,按正常计费的前输出。 图(5)费用计算模块 程序代码: libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entitysum_feeis PORT(kilo: inintegerrange0to100;--公里数 waitime: inintegerrange0to60;--等待时间数 REST,EN,clk: instd_logic; Y1,Y2,Y3: outintegerrange0to9);--分别输出费用的角位、元位和十元位 end; architectureoneofsum_feeis begin process(REST,EN,clk,kilo,waitime) variableshi1,yuan1,jiao1: integerrange0to9; variablesum: integerrange0to1000; VARIABLEFLAG: STD_LOGIC: ='0';--标志位控制是否将钱清零,受rest和start控制 begin IFREST='0'THENFLAG: ='0'; ELSEFLAG: =FLAG; ENDIF; IFEN='0'THENFLAG: ='1'; ELSEFLAG: =FLAG; ENDIF; IFFLAG='0'THENY1<=0;Y2<=0;Y3<=0;--当rest清零时,全部输出为0 ELSE ifclk'eventandclk='1'then sum: =(kilo-3)*17+(waitime/5)*17+80;--总钱数的十倍 shi1: =sum/100;--得到总钱数的十元位 yuan1: =(sum-shi1*100)/10;--得到总钱数的元位 jiao1: =sum-shi1*100-yuan1*10;--得到总钱数的角位 endif; ifkilo<3thensum1: =0;sum2: =8;sum3: =0;--在3公里以内固定输出8元 else--否则输出正常计数是的钱 sum1: =shi1; sum2: =yuan1; sum3: =jiao1; endif; Y1<=sum1;Y2<=sum2;Y3<=sum3;--将分开的位输出 ENDIF; endprocess; endarchitecture; (5)分码器 其功能是将公里数和等待时间数的十位和个位分开并输出。 将公里数和等待时间分别对10得到十位,再得到个位。 当按下rest键时,输出清零。 当在正常计数时,当按下的是start键,输出公里数;当按下stop键,输出等待时间数。 图(6)分码器 程序代码: libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entityCOUNTis port(clk,rest,stop,start: instd_logic; kilo: inintegerrange0to100;---输入公里时 waitime: inintegerrange0to60;---输入时间数 y1,y2: outintegerrange0to9);--分别代表个位和十位上的数 end; architecturebehavofCOUNTis begin process(clk,rest,stop,start,kilo,waitime) variableshi1,ge1,shi2,ge2: integerrange0to9; variableflag: std_logic: ='0'; begin ifstart='0'thenflag: ='1'; elseflag: =flag; endif; ifstop='0'thenflag: ='0'; elseflag: =flag; endif; ifrest='0'thenY1<=0;y2<=0; else ifclk'eventandclk='1'then shi1: =kilo/10;------公里数的十位 ge1: =kilo-shi1*10;----------公里数的个位 shi2: =waitime/10;--------等待时间的十位 ge2: =waitime-shi2*10;-----等待时间的个位 endif; ifflag='1'theny1<=ge1;y2<=shi1; elsey1<=ge2;y2<=shi2; endif; ENDIF; endprocess; end; (6)数码管扫频电路 其功能是将分开的费用、公里、等待时间的各个位上的数在8段数码管上显示出来。 图(7)数码管扫频电路 程序如下: LIBRARYIEEE; USEIEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_UNSIGNED.ALL; ENTITYSCAN_LEDIS PORT(Y1,Y2,Y3,Y6,Y7: INTEGERRANGE0TO9; CLK: INSTD_LOGIC; SG: OUTSTD_LOGIC_VECTOR(7DOWNTO0); BT: OUTSTD_LOGIC_VECTOR(7DOWNTO0)); END; ARCHITECTUREoneOFSCAN_LEDIS SIGNALCNT8: STD_LOGIC_VECTOR(2DOWNTO0); SIGNALA: INTEGERRANGE0TO15; SIGNALFLAG: STD_LOGIC; BEGIN P1: PROCESS(CNT8) BEGIN CASECNT8IS WHEN"000"=>BT<="11111110";A<=0;-------分 WHEN"001"=>BT<="11111101";A<=Y1;-------角 WHEN"010"=>BT<="11111011";A<=Y2;--------元 WHEN"011"=>BT<="11110111";A<=Y3;--------十元 WHEN"100"=>BT<="11101111";A<=10; WHEN"101"=>BT<="11011111";A<=10; WHEN"110"=>BT<="10111111";A<=Y6;-------个位 WHEN"111"=>BT<="01111111";A<=Y7;-------十位 WHENOTHERS=>NULL; ENDCASE; ENDPROCESSP1; P2: PROCESS(CLK) BEGIN IFCLK'EVENTANDCLK='1'THENCNT8<=CNT8+1; ifCNT8="001"thenFLAG<='1';elseFLAG<='0';endif;--------数码管输出元 位时,标志为1,段码输出时,元位上有小数点 ENDIF; ENDPROCESSP2; P3: PROCESS(A) VARIABLESG0: STD_LOGIC_VECTOR(7DOWNTO0); VARIABLEPOINT: STD_LOGIC_VECTOR(7DOWNTO0): ="01111111"; BEGIN CASEAIS WHEN0=>SG0: ="11000000";WHEN1=>SG0: ="11111001"; WHEN2=>SG0: ="10100100";WHEN3=>SG0: ="10110000"; WHEN4=>SG0: ="10011001";WHEN5=>SG0: ="10010010"; WHEN6=>SG0: ="10000010";WHEN7=>SG0: ="11111000"; WHEN8=>SG0: ="10000000";WHEN9=>SG0: ="10010000"; WHEN10=>SG0: ="10001000";WHEN11=>SG0: ="10000011"; WHEN12=>SG0: ="11000110";WHEN13=>SG0: ="10100001"; WHEN14=>SG0: ="10000110";WHEN15=>SG0: ="10001110"; WHENOTHERS=>NULL; ENDCASE; IFFLAG='1'THENSG<=SG0ANDPOINT; ELSESG<=SG0; ENDIF; ENDPROCESSP3; END; (7)顶层原理图 图(8)顶层原理图 (8)实验仿真 因为实验室按下键为低电平,所以REST,EN,START,STOP均为低电平有效。 Y3代表金额的十元位,Y2代表金额的元位,Y1代表角位。 LED1代表公里数或等待时间的个位,LED2代表公里数或等待时间的十位。 1.仿真图 (1) 从图中可以看出,当rest保持高电平时,en按下(即为一次低电平)时,金额Y2为8(代表8元钱),当按下START后,LED显示的公里数开始增加,但小于3时金额显示仍然为8,当大于3时,每增加一公里金额增加1.7元。 仿真图 (1) 2.仿真图 (2) 当按下STOP键(stop为一次地点平)时,LED开始显示等待时间的分钟数,当分钟数等于5时,计数金额的总数加1.7元。 仿真图 (2) 3.仿真图(3) 当按下rest键时,所有计数全部清零,等待EN键。 五、实验现象 当按下REST键时,全部显示复位,把段数码的右四位(金额)和左两位(里程数或时间数)都为0,中间两位不显示。 当按下EN键时,金额显示位8,里程和等待时间为0,当按下STRAT键时,左两位显示里程数开始增加,小于3公里时,金额显示仍然为8元,大
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 课程设计 出租车 计价器