EDA课程设计出租车计价器_第1页
EDA课程设计出租车计价器_第2页
EDA课程设计出租车计价器_第3页
EDA课程设计出租车计价器_第4页
EDA课程设计出租车计价器_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、EDA课程设计专题实践题目:出租车自动计费器姓 名: 学 院: 电子与信息工程学院 专 业:电子信息科学与技术 班 级: 电信1204班 一、 设计题目:出租车自动计费器二、 设计目标: 1、 设计一个出租车自动计费器,具有行车里程计费、等候时间计费、及起价三部分,用四位数码管显示总金额,最大值为99.99元;2、 行车里程单价1.7元/公里,等候时间单价1.7元/5分钟,起价8元(3公里起价)。3、 行车里程的计费电路将汽车行驶的里程数转换成与之成正比的脉冲数,然后由计数译码电路转换成收费金额,实验中以一个脉冲模拟汽车前进十米比例系数,从而计算出具体费用。4、&

2、#160;用LED显示行驶公里数,四个数码管显示收费金额。三、 设计原理: 将汽车行驶的里程数和等候时间分别转换成与之成正比的脉冲数,然后将里程脉冲和等待脉冲乘以分别的单价得到具体的费用,再将几项收费相加,得到最终的金额。再用分码器将钱的每一位分开,用四个数码管表示总的计费结果。本次设计的模块包括:分频器、计数器、比例乘法器、分码器、数码管扫频电路。另设4个按键:RST(停止)、EN(启动)、START(行驶)、STOP(等待),通过按下RST模拟汽车的停止,按下EN模拟汽车的发动此时计价器显示起步价8元,按下START键时模拟汽车在行驶,此时开始计公里数,按下STOP键时,模拟出租车在等待,

3、计数器计等待时间。总设计的实验框图如下:费用计算分码分频器里程计数费用显示输入时钟分码器时间计数图(1)原理框图四、 设计内容: (1) 分频器模块 其功能是将实验室的48MH的频率分别分成1HZ、10HZ、1HZ。将1HZ作为等待时间计数的脉冲,每一个脉冲代表1s。10HZ的脉冲作为里程计数的输入脉冲,每一个脉冲代表10m。1KHZ用于数码管扫频电路的扫频中。 图(2) 分频器程序代码:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE I

4、EEE.NUMERIC_BIT.ALL;-包含移位函数等.ENTITY int_divISGENERIC(F_DIV:Integer:=4800000;-分频系数F_DIV_WIDTH:Integer:=32-分频计数器宽度);PORT(clock :INSTD_LOGIC;clock_out:OUTSTD_LOGIC);END;ARCHITECTURE one OFint_divISSIGNAL clk_p_r:STD_LOGIC;-上升沿输出时钟SIGNAL clk_n_r:STD_LOGIC;-下降沿输出时钟SIGNAL count_p:STD_LOGIC_VECTOR(f_div_wi

5、dth-1DOWNTO 0);-上升沿脉冲计数器SIGNAL count_n:STD_LOGIC_VECTOR(f_div_width-1DOWNTO 0);-下降沿脉冲计数器-SIGNAL f_div_width_r:STD_LOGIC_VECTOR(f_div_width-1DOWNTO 0);SIGNAL clock_out_r:STD_LOGIC;SIGNAL full_div_p:STD_LOGIC;-上升沿计数满标志SIGNAL half_div_p:STD_LOGIC;-上升沿计数半满标志SIGNAL full_div_n:STD_LOGIC;-下降沿计数满标志SIGNAL ha

6、lf_div_n:STD_LOGIC;-下降沿计数半满标志BEGINclock_out<=clock_out_r;-clock_out<=clock WHEN (F_DIV=1) ELSE (clk_p_r='1' AND clk_n_r='1') WHEN (F_DIV(0)='1') clk_p_r); -<<判断计数标志位置位与否.full_div_p<='1' WHEN (count_p<F_DIV-1) ELSE '0'half_div_p<='1'

7、; WHEN (count_p<(F_DIV/2 )-1) ELSE '0'full_div_n<='1' WHEN (count_n<F_DIV -1) ELSE '0'half_div_n<='1' WHEN (count_n<(F_DIV/2)-1)ELSE '0'PROCESS(clock)-上升沿脉冲计数-VARIABLE i:Integer RANGE 0 TO 31;BEGINIFRISING_EDGE(clock)THENIF full_div_p='1'

8、; THENcount_p<=count_p+1;IF (half_div_p='1') THENclk_p_r<='0'ELSEclk_p_r<='1'END IF;ELSEcount_p<= (OTHERS =>'0');clk_p_r<= '0'END IF;END IF;END PROCESS;PROCESS(clock)-下降沿脉冲计数BEGINIFFALLING_EDGE(clock)THENIF full_div_n='1' THENcount_n&

9、lt;=count_n+1;IF half_div_n='1' THENclk_n_r<='0'ELSEclk_n_r<='1'END IF;ELSEcount_n<=(OTHERS =>'0');clk_n_r <= '0'END IF;END IF;END PROCESS;PROCESS(clock)BEGINIFRISING_EDGE(clock)THENIF F_DIV= 1 THENclock_out_r<=clock;ELSEIF (F_DIV REM 2) =1 T

10、HENclock_out_r<= clk_p_r AND clk_n_r;ELSEclock_out_r<=clk_p_r;END IF;END IF;END IF;END PROCESS;END;(2) 里程计数模块其功能是得到出租车行驶的公里数。每一个脉冲模拟的是10m,所以100个脉冲为1km,需要两个一百进制计数器,第一个计数器计满数后进位输出作为高位计数器的输入时钟,高位100计数器输出的是里程公里数。当按下REST键时计数器清零。按下EN键后,再按下START键,此时里程计数器开始计数,来一个脉冲加1,到99时为1公里,高位100进制计数器计数加1,并输出公里数。图(3

11、) 里程计数器程序代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity CNT0100 is port (clk,start,stop,rst,EN:in std_logic;kilo:out integer range 0 to 100);end;architecture behav of CNT0100 isbeginprocess(clk,rst,start,stop,en)variable cqi,k: integer range 0 to 100;variable flag

12、1,flag2:std_logic:='0' -flag1控制计数器是否清零,flag2控制计数是否计数beginif rst='0' then cqi:=0;flag2:='0'flag1:='0'k:=0; elsif clk 'event and clk='1' then if en='0' then flag2:='1' else flag2:=flag2; end if; if stop='0'and flag2='1' then f

13、lag1:='0' else flag1:=flag1; end if; if start='0'and flag2='1' then flag1:='1' -计数器开始计数 else flag1:=flag1; end if; if flag1='0' then cqi:=cqi; else if cqi<99 then cqi:=cqi+1; -小于99时继续计数加1,否则计数清零 else cqi:=0; end if; if cqi=99 then -计满99时加1 if k<99 then K

14、:=K+1; else k:=0; end if; else K:=K; end if; end if;end if;kilo<=k; -输出公里数end process;end;(3)计时模块 其功能室得到等待的时间数。每一个脉冲的是1s,所以60个脉冲为1分钟,需要两个一60进制计数器,第一个计数器计满数后进位输出作为高位计数器的时钟,高位60计数器输出的是分钟数。当按下REST键时计数器清零。按下EN键后,再按下STOP键,此时等待时间计数器开始计数,来一个脉冲加1,到59s时为1分钟,高位60进制计数器计数加1,并输出分钟数。图(4) 等待时间计数器程序代码:library ie

15、ee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity WAIT60 is port (clk,start,stop,rst,en:in std_logic;waitime:out integer range 0 to 60);end;architecture behav of WAIT60 isbeginprocess(clk,rst,start,stop,en)variable cqi,W:integer range 0 to 60;variable flag1,flag2:std_logic:='

16、0' -控制计数器的清零和计数,受rst,en,stop的控制beginif rst='0' then cqi:=0;flag2:='0'flag1:='0' elsif clk 'event and clk='1' then if en='0' then flag2:='1' else flag2:=flag2; end if; if stop='0'AND flag2='1' then flag1:='1'w:=0; else fl

17、ag1:=flag1; end if; if start='0'and flag2='1' then flag1:='0' else flag1:=flag1; end if; if flag1='0' then cqi:=cqi; -计数保持 else if cqi<59 then cqi:=cqi+1; -计数加1 else cqi:=0; end if; if cqi=59 then if w<59 then W:=W+1; else w:=0; end if; else W :=W; end if; end i

18、f;end if;waitime<=W; -输出分钟数end process;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) 费用计算模块程

19、序代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sum_fee is PORT( kilo:in integer range 0 to 100; -公里数 waitime:in integer range 0 to 60; -等待时间数 REST,EN,clk: in std_logic; Y1,Y2,Y3:out integer range 0 to 9); -分别输出费用的角位、元位和十元位end; architecture one of sum_fee isbeginp

20、rocess(REST,EN,clk,kilo,waitime)variable shi1,yuan1,jiao1:integer range 0 to 9;variable sum:integer range 0 to 1000;VARIABLE FLAG: STD_LOGIC:='0' -标志位控制是否将钱清零,受rest和start控制beginIF REST='0' THEN FLAG:='0' ELSE FLAG:=FLAG;END IF; IF EN='0' THEN FLAG:='1' ELSE FL

21、AG:=FL AG; END IF; IF FLAG='0' THEN Y1<=0;Y2<=0;Y3<=0; -当rest清零时,全部输出为0 ELSE if clk 'event and clk='1' then sum:=(kilo-3)*17+(waitime/5)*17+80; -总钱数的十倍 shi1:=sum/100; -得到总钱数的十元位 yuan1:=(sum-shi1*100)/10; -得到总钱数的元位 jiao1:=sum-shi1*100-yuan1*10; -得到总钱数的角位 end if; if kilo&l

22、t;3 then sum1:=0;sum2:=8;sum3:=0; -在3公里以内固定输出8元 else -否则输出正常计数是的钱 sum1:=shi1; sum2:=yuan1; sum3:=jiao1; end if;Y1<=sum1;Y2<=sum2;Y3<=sum3; -将分开的位输出 END IF; end process; end architecture;(5)分码器其功能是将公里数和等待时间数的十位和个位分开并输出。将公里数和等待时间分别对10得到十位,再得到个位。当按下rest键时,输出清零。当在正常计数时,当按下的是start键,输出公里数;当按下stop

23、键,输出等待时间数。图(6) 分码器程序代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity COUNT is port (clk,rest,stop,start:in std_logic; kilo:in integer range 0 to 100; -输入公里时 waitime:in integer range 0 to 60; -输入时间数 y1,y2: out integer range 0 to 9); -分别代表个位和十位上的数end;architecture beha

24、v of COUNT isbegin process(clk,rest,stop,start,kilo,waitime)variable shi1,ge1,shi2,ge2:integer range 0 to 9;variable flag:std_logic:='0'begin if start='0' then flag:='1' else flag:=flag; end if; if stop='0' then flag:='0' else flag:=flag; end if;if rest='0

25、' then Y1<=0;y2<=0;elseif clk 'event and clk='1' thenshi1:=kilo/10; -公里数的十位ge1:=kilo-shi1*10;-公里数的个位shi2:=waitime/10;-等待时间的十位ge2:=waitime-shi2*10;-等待时间的个位end if;if flag='1' then y1<=ge1;y2<=shi1;else y1<=ge2;y2<=shi2;end if;END IF;end process;end;(6)数码管扫频电路

26、其功能是将分开的费用、公里、等待时间的各个位上的数在8段数码管上显示出来。图(7) 数码管扫频电路程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SCAN_LED ISPORT (Y1,Y2,Y3,Y6,Y7:INTEGER RANGE 0 TO 9; CLK : IN STD_LOGIC; SG: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); BT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END;ARCHITECTURE

27、 one OF SCAN_LED IS SIGNAL CNT8 : STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL A : INTEGER RANGE 0 TO 15; SIGNAL FLAG : STD_LOGIC;BEGIN P1:PROCESS(CNT8)BEGIN CASE CNT8 ISWHEN "000"=> BT <="11111110"A<=0; -分WHEN "001"=> BT <="11111101"A<=Y1; -角WHEN &qu

28、ot;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&q

29、uot;A<=Y6;-个位WHEN "111"=> BT <="01111111"A<=Y7;-十位WHEN OTHERS=> NULL;END CASE;END PROCESS P1;P2:PROCESS(CLK)BEGINIF CLK'EVENT AND CLK = '1' THEN CNT8<=CNT8+1;if CNT8="001" then FLAG<='1' ;else FLAG<='0' end if; -数码管输出元

30、位时,标志为1,段码输出时,元位上有小数点END IF;END PROCESS P2;P3: PROCESS(A) VARIABLE SG0 : STD_LOGIC_VECTOR(7 DOWNTO 0); VARIABLE POINT : STD_LOGIC_VECTOR(7 DOWNTO 0):="01111111"BEGIN CASE A ISWHEN 0 =>SG0:="11000000"WHEN 1=>SG0:="11111001"WHEN 2 =>SG0:="10100100"WHEN

31、3=>SG0:="10110000"WHEN 4 =>SG0:="10011001"WHEN 5=>SG0:="10010010"WHEN 6 =>SG0:="10000010"WHEN 7=>SG0:="11111000"WHEN 8 =>SG0:="10000000"WHEN 9=>SG0:="10010000"WHEN 10 =>SG0:="10001000"WHEN 11=>SG0:="10000011"WHEN 12 =>SG0:="11000110"WHEN 13=>SG0:="10100001"WHEN 14 =>SG0:="10000110"WHEN 15=>SG0:="10001110"WHEN OTHERS=> NUL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论