出租车自动计费器VHDL程序报告

合集下载

出租车计价器代码VHDL

出租车计价器代码VHDL
SIGNAL X:integer range 0 to 1:=0; --记录是否加了燃油费。x=0表示没加,x=1表示已加。在复位以及idle状态时对x进行清零操作;
SIGNAL I:INTEGER RANGE 0 TO 5 :=0; --当状态从go/wait转到idle时,希望将价格等持续显示5秒。
ELSIF (SA='1' AND SB='0') THEN STATE<=GO;
W2<="0000"; W1<="0000"; W0<="0000"; K2<="0000"; K1<="0000"; K0<="0000"; I<=0; FIN<='1'; CLK3S<='0';COUNT3S<=0; --此刻进入go状态已经一秒。
ELSE
STATE<=GO;
W2<=W2; W1<=W1; W0<=W0; K2<=K2; K1<=K1; K0<=K0;I<=I+1;
END IF;
ELSIF (SA='1' AND SB='0') THEN STATE<= GO;
END IF;
END IF;
END PROCESS U1;
U2:PROCESS(CLK1HZ) --有限状态机设计模块
BEGIN
IF RST='1' THEN W2<="0000"; W1<="0000"; W0<="0000"; K2<="0000"; K1<="0000"; K0<="0000"; I<=0; FIN<='0';

(VHDL实验报告)出租车计费器的设计

(VHDL实验报告)出租车计费器的设计

电子科技大学成都学院学院标准实验报告(实验)课程名称数字电路EDA设计与应用姓名乱弹的枇杷学号 1240830专业电气工程及其自动化指导教师张一、实验名称出租车计费器的设计二、实验目的1、了解出租车计费器的工作原理。

2、学会用V HDL 语言编写正确的七段码管显示程序。

3、数量掌握用V HDL 编写复杂功能模块。

4、进一步数量状态积在系统设计中的应用。

三、实验原理出租车计费器一般都是按公里计费,通常是起步价xx元(xx元可以行走x公里),然后再是xx元/公里。

所以要完成一个出租车计费器,就要有两个计数单位,一个用来计公里,另外一个用来计费用。

通常在出租车的轮子上都有传感器,用来记录车轮转动的圈数,而车轮子的周长是固定的,所以知道了圈数自然也就知道了里程。

在这个实验中,就要模拟出租车计费器的工作过程,用直流电机模拟出租车轮子,通过传感器,可以得到电机每转一周输出一个脉冲波形。

结果的显示用8个七段码管,前四个显示里程,后三个显示费用。

在设计VHDL程序时,首先在复位信号的作用下将所有用到的寄存器进行清零,然后开始设定到起步价记录状态,在此状态时,在起步价规定的里程里都一直显示起步价,直到路程超过起步价规定的里程时,系统转移到每公里计费状态,此时每增加一公里,计费器增加相应的费用。

为了便于显示,在编写过程中的数据用BCD码来显示,这样就不存在数据格式转换的问题。

比如表示一个三位数,那么就分别用四位二进制码来表示,当个位数字累加大于9时,将其清零,同时十位数字加1,依此类推。

四、实验内容本实验要完成的任务就是设计一个简单的出租车计费器,要求是起步价3元,准行1公里,以后1元/公里。

显示部分的七段码管扫描时钟选择时钟模块的1KHz,电机模块的跳线选择GND端,这样通过旋钮电机模块的电位器,即可达到控制电机转速的目的。

另外用按键模块的S1来作为整个系统的复位按钮,每复位一次,计费器从头开始计费。

直流电机用来模拟出租车的车轮子,没转动一圈认为是行走1米,所以每旋转1000 圈,认为车子前进1公里。

EDA基于VHDL语言的出租车计价器课程设计报告书

EDA基于VHDL语言的出租车计价器课程设计报告书

远东理工学院EDA课程设计题目:基于VHDL语言出租车计费器本文介绍了一种采用单片FPGA芯片进行出租车计费器的设计方法,主要阐述如何使用新兴的EDA器件取代传统的电子设计方法,利用FPGA的可编程性,简洁而又多变的设计方法,缩短了研发周期,同时使出租车计费器体积更小功能更强大。

本设计实现了出租车计费器所需的一些基本功能,计费包括起步价、行车里程计费、等待时间计费,同时考虑到出租车行业的一些特殊性,更注重了把一些新的思路加入到设计中。

主要包括采用了FPGA芯片,使用VHDL语言进行编程,使其具有了更强的移植性,更加利于产品升级。

关键词:VHDL 计费器 FPGAAbstractThis paper describes the use of a single chip FPGA for the design of accounting-fee machine, mainly on how to use the emerging EDA electronic devices designed to replace traditional methods, using the programmable FPGA, concise and changing the design Ways to shorten the development cycle, so that taxi accounting-fee machine in a smaller more powerful. The design and implementation of the taxi accounting-fee machine for some basic functions, including billing starting price, driving metered, the waiting time billing, taking into account the special nature of some of the taxi industry, to pay more attention to a number of new Ideas into the design. Mainly including the use of the FPGA chip, the use of VHDL programming, so as to make it a stronger transplanted, and more conducive to product upgrades.Key words: VHDL,accounting-fee machine,FPGA前言 (1)第一部分设计要求 (2)一、设计目的 (2)二、系统要求 (2)三、功能描述 (2)四、补充说明 (2)第二部分系统设计方案 (3)第三部分主要模块设计 (5)一、计程计费模块 (5)二、显示模块 (5)三、控制模块 (6)第四部分仿真结果与分析 (7)一、计程计费模块仿真 (7)二、总体仿真 (7)第五部分硬件调试 (8)一、引脚锁定 (8)二、硬件验证情况 (8)总结 (10)致 (11)参考文献 (12)附录A 电路图 (13)一、电路图 (13)二、PCB图 (14)三、3D仿真图 (15)附录B 程序代码 (17)一、top顶层文件 (17)二、taxi控制模块 (18)二、display显示模块 (20)前言随着出租车行业的发展,对出租车计费器的要求也越来越高。

任务书及报告模板--出租车简易计费器设计VHDL语言

任务书及报告模板--出租车简易计费器设计VHDL语言

课程设计报告书题目出租车简易计费器设计课程设计任务书课题题目摘要----------------jifei---------------library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jifei isport ( clk,rst,en,en1:in std_logic;lc0,lc1,lc2,lc3:out std_logic_vector(3 downto 0);jj0,jj1,jj2,jj3:out std_logic_vector(3 downto 0));end jifei;architecture lab10_4 of jifei issignal Q00:std_logic_VECTOR(3 DOWNTO 0);--jifei0 signal Q01:std_logic_VECTOR(3 DOWNTO 0);--jifei1 signal Q02:std_logic_VECTOR(3 DOWNTO 0);--jifei2 signal Q03:std_logic_VECTOR(3 DOWNTO 0);--jifei3 signal Q1:integer range 0 to 10000;--JIZONGLUCHENG signal Q10:std_logic_VECTOR(3 DOWNTO 0);--lc0 signal Q11:std_logic_VECTOR(3 DOWNTO 0);--lc1 signal Q12:std_logic_VECTOR(3 DOWNTO 0);--lc2 signal Q13:std_logic_VECTOR(3 DOWNTO 0);--lc3 signal Q2:integer range 0 to 10000;--jidengdaishijianbeginprocess ( clk, rst)beginif clk'event and clk='1' thenif en='1' thenif en1='1' then --JILUCHENGQ1<=Q1+1;if Q10= "1001" THENQ10<="0000" ;IF Q11="1001" THENQ11<="0000";if Q12= "1001" THENQ12<="0000" ;IF Q13="1001"THENQ13<="0000";ELSEQ13<=Q13+1;END IF;ELSEQ12<=Q12+1;END IF;ELSEQ11<=Q11+1;END IF;ELSEQ10<=Q10+1;END IF; --JILUCHENGJIESUIF Q1<=3 THEN --JISUANLUCHENGFEIYONGQ00<="0101";ELSEif Q00= "1001" THENQ00<="0000" ;IF Q01="1001" THENQ01<="0000";if Q02= "1001" THENQ02<="0000" ;IF Q03="1001"THENQ03<="0000";ELSEQ03<=Q03+1;END IF;ELSEQ02<=Q02+1;END IF;ELSEQ01<=Q01+1;END IF;ELSEQ00<=Q00+1;END IF; --LUCHENG FEIYONG JISUANJIESUEND IF;ELSEQ2<=Q2+1;IF Q2>5 THEN --JISUANDENGDAISHIJANDFEIYONGif Q00= "1001" THENQ00<="0000" ;IF Q01="1001" THENQ01<="0000";if Q02= "1001" THENQ02<="0000" ;IF Q03="1001"THENQ03<="0000";ELSEQ03<=Q03+1;END IF;ELSEQ02<=Q02+1;END IF;ELSEQ01<=Q01+1;END IF;ELSEQ00<=Q00+1;END IF;END IF;END IF;END IF;END IF;IF RST='0' THENQ00<="0000";Q01<="0000";Q02<="0000";Q03<="0000";Q1<=0;Q2<=0;Q10<="0000";Q11<="0000";Q12<="0000";Q13<="0000";END IF;LC0<=Q10;LC1<=Q11;LC2<=Q12;LC3<=Q13;JJ0<=Q00;JJ1<=Q01;JJ2<=Q02;JJ3<=Q03;end process;end lab10_4;首行空两个中文字符;文字采用小四、宋体;行间距:多倍行距1.3;字数:200-400字左右关键词课题相关关键词,以分号间隔目录课程设计任务书............................................. 错误!未定义书签。

VHDL语言的出租车计费器设计说明

VHDL语言的出租车计费器设计说明

用VHDL语言设计出租车计价器1个报价近年来,出租车行业发展迅速。

全国有数千家出租车公司,出租车计价器市场巨大。

随着电子科学技术的不断发展,特别是集成电路的飞速发展,电子设计自动化已经成为主要的设计手段。

随着EDA技术的蓬勃发展和FPGA等数字可编程器件的出现,数字出租车计价器的设计变得更加简单,性能更加稳定,可以实现更加复杂的功能。

此外,利用EDA软件可以方便地在计算机上实现设计和仿真。

本设计基于VHDL(FPGA)语言,是电子设计领域最具活力和前景的技术,未来必将取代一些过时的数字元件。

1.1课程设计的目的随着电子技术的不断发展和进步,集成电路的设计方法也在不断更新。

今天,传统的手工设计过程已经被先进的电子设计自动化(EDA)工具所取代。

只有基于硬件描述语言和逻辑综合的子项下的电路设计方法,才能满足集成电路系统设计日益复杂的要求,缩短设计周期,满足集成电路系统设计日益迫切的要求。

在这种情况下,传统的出租车计价器的设计方法已经跟不上现在的节奏,过去的出租车计价器的功能也远远不能满足实际需要。

以往出租车计价器的不稳定和功能短是大家开始寻找功能更强大、性能更稳定、价格更低廉的新型出租车计价器的缺点。

大规模可编程逻辑器件和VHDL硬件描述语言的出现使这一切成为可能。

本设计的研究目标和意义是使用价格低廉、性能稳定、价格低廉、扩展性强的出租车计价器,满足当前出租车市场的需求,从而解决当前出租车计价器存在的一系列问题。

1.2课程设计要求1.它可以实现充电功能。

收费标准为:按里程收费,起步费10.00元,车库3公里后再按2元/公里收费。

计价器收费或超过一定收费(如20元)时,每公里收取车费的50%,车停止收费。

2.实现预设功能:可以预设起步费,每公里收费,车行里程。

3.实现模拟功能:可以模拟汽车的启动、停止、暂停、速度等状态。

4.设计一个动态扫描电路:用两位小数显示票价。

5.用VHDL语言设计一个满足上述功能要求的出租车计价器,并用层次化设计方法设计电路。

出租车计价器-课程设计报告

出租车计价器-课程设计报告

软件学院课程设计报告课程题目出租车计价器班级集成13-4专业集成电路设计与集成系统学生学号指导教师(填写自己班的指导教师)年月日1.课程设计目的全面熟悉、掌握VHDL语言基本知识,掌握利用VHDL语言对常用的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用设计综合电路的能力,养成提供文档资料的习惯和规范编程的思想。

2。

课程设计题目描述和要求2.1.课程设计题目描述①.实现计费功能,计费标准为:按行驶里程计费,起步价为7.0元,并在车行3km后按2.2元/km计费,当计费器达到或超过20元时,每公里加收50%的车费,车停止不计费。

②.现场模拟功能:以开关或按键模拟公里计数,能模拟汽车起动、停止、暂停等状态。

③.将车费和路程显示出来,各有一位小数.2.2。

总体设计思路框架2.3.课程设计题目要求①.设计正确,方案合理。

②。

程序精炼,结构清晰。

③。

设计报告含程序设计说明,用户使用说明,源程序清单及程序框图.④。

上机演示。

⑤.有详细的文档。

文档中包括设计思路、设计仿真程序、仿真结果及相应的分析与结论。

3.设计思想和设计内容3。

1 出租车计费设计该出租车计费器按下开关S1后开始计费和计里程数,起步价是7元,行驶3公里,以后2。

2元/公里。

并且设计选择模块,在车费超过20元每公里加收50%车费即3。

3元/公里.3。

2 基本设计思想出租车计费器根据设计要求可初步分为3方面——显示、记里程数、记费。

之后再根据三方面分别设计模块。

1.显示模块.一般计数器显示数字为1-F即16进制,而16进制不方便观看,所以在设计这一模块时我们将16进制改为10进制输出进而设计了译码模块。

2、里程模块。

设计要求对里程计数主要分为两个方面,计数以及公里数比较。

即3公里之内收7元,3公里之后20元(通过计算为9公里)以内每公里2.2元,9公里以外为每公里3.3元。

基于VHDL语言的出租车计价器

基于VHDL语言的出租车计价器

(基于VHDL语言)出租车计价器自己做的大作业经过测试完全通过,不过里面的时间脉冲以及里程脉冲的时钟信号都比较难搞,不过可以修改其中的值来满足你们提供的时钟脉冲题目要求:(1)行程3公里内(包括3公里),且等待累计时间2分钟内(包括2分钟),起步费为10元;(2)3公里外(不包括3公里)以每公里2元,等待累计时间2分钟外(不包括2分钟)以每分钟以1.0元计费;(3)能显示行驶公里数、等待累计时间和最后的总费用;(4)本计费器的显示范围为0~99元,计价分辨率为1元;计程器显示范围为0~99公里,分辨率为1公里;计时器的显示范围是分钟的显示范围是0—99,分辨率为1分钟。

秒的显示范围是0—59。

分辨率为1秒本出租车计价器的设计共分4个模块:判断模块、时间模块、里程模块、计费模块。

总的设计图如图1所示:计价开始控制判断模块library ieee;use ieee.std_logic_1164.all;--entity judge isport(sclk,sta,lclk: in std_logic;dge: out std_logic);end;architecture beh of judge isbeginprocess(sta,lclk,sclk)variable a: integer range 0 to 64;beginif sta='1' thenif lclk'event and lclk='1' thena:=a+1;end if;if sclk'event and sclk='1' thenif a=0 thendge<='0';--shijian processelsedge<='1';--licheng processend if;end if;if sclk='1' thena:=0;end if;elsedge<='Z';end if;end process;end;时间模块library ieee;use ieee.std_logic_1164.all;--entity time_count isport(sta,sclk,dge: in std_logic;t_count: out std_logic;minge: out integer range 0 to 10;minshi: out integer range 0 to 10); end;--architecture beh of time_count is beginprocess(sta,sclk,dge)variable count: integer range 0 to 60; variable ge: integer range 0 to 10; variable shi: integer range 0 to 10; variable t_c: std_logic;beginif sta='1' thenif dge='0' thenif sclk'event and sclk='1' then count:=count+1;if count=1 thent_c:='0';end if;if count=60 thencount:=0;ge:=ge+1;if ge>2 thent_c:='1';elsif ge>0 thent_c:='1';end if;if ge=10 thenge:=0;shi:=shi+1;if shi=10 thenshi:=0;end if;end if;end if;end if;end if;elsege:=0;shi:=0;t_c:='0';end if;minge<=ge;minshi<=shi;t_count<=t_c;end process;end;里程模块library ieee;use ieee.std_logic_1164.all; --entity time_count isport(sta,sclk,dge: in std_logic;t_count: out std_logic;minge: out integer range 0 to 10;minshi: out integer range 0 to 10); end;--architecture beh of time_count is beginprocess(sta,sclk,dge)variable count: integer range 0 to 60; variable ge: integer range 0 to 10; variable shi: integer range 0 to 10; variable t_c: std_logic;beginif sta='1' thenif dge='0' thenif sclk'event and sclk='1' then count:=count+1;if count=1 thent_c:='0';end if;if count=60 thencount:=0;ge:=ge+1;if ge>2 thent_c:='1';elsif ge>0 thent_c:='1';end if;if ge=10 thenge:=0;shi:=shi+1;if shi=10 thenshi:=0;end if;end if;end if;end if;end if;elsege:=0;shi:=0;t_c:='0';end if;minge<=ge;minshi<=shi;t_count<=t_c;end process;end;计费模块library ieee;use ieee.std_logic_1164.all;--entity price_count isport(sta,t_count,d_count: in std_logic;mge,mshi: out integer range 0 to 10); end;--architecture beh of price_count issignal t_ge,t_shi: integer range 0 to 10; signal d_ge,d_shi: integer range 0 to 10; begin--process(sta,t_count)variable tshi: integer range 0 to 10:=1; variable tge: integer range 0 to 10;beginif sta='1' thenif t_count'event and t_count='1' then tge:=tge+1;if tge=10 thentge:=0;tshi:=tshi+1;if tshi=10 thentshi:=0;end if;end if;end if;elsetge:=0;tshi:=1;end if;t_ge<=tge;t_shi<=tshi;end process;--process(sta,d_count)variable dge,dshi: integer range 0 to 10; beginif sta='1' thenif d_count'event and d_count='1' then dge:=dge+2;if dge=10 thendge:=0;dshi:=dshi+1;if dshi=10 thendshi:=0;end if;end if;end if;elsedge:=0;dshi:=0;end if;d_ge<=dge;d_shi<=dshi;end process;--process(d_ge,d_shi,t_ge,t_shi) variable cge: integer range 0 to 1; variable ge,shi:integer range 0 to 10; beginge:=d_ge+t_ge;if ge>=10 thenge:=ge-10;cge:=1;elsecge:=0;end if;shi:=d_shi+t_shi+cge;mge<=ge;mshi<=shi;end process;end;显示模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity display isport(CLK:in std_logic;sminge,sminshi: in integer range 0 to 10;skmge,skmshi: in integer range 0 to 10;smge,smshi: in integer range 0 to 10;weixuan:OUT std_logic_vector(2 downto 0);seg:out std_logic_vector(7 downto 0)); end;architecture one of display issignal cnt1:std_logic_vector(22 downto 0);signal S:std_logic_vector(2 downto 0);signal sel:std_logic_vector(2 downto 0);beginprocess(CLK)beginif CLK'event and CLK='1' THEN cnt1<=cnt1+1;end if;END PROCESS;S<=cnt1(5 downto 3);--300hzsel<="000" when S="000" else"001" when S="001" else"010" when S="010" else"011" when S="011" else"100" when S="100" else"101" when S="101" else"110" when S="110" else"111" when S="111" else"ZZZ";weixuan<=sel;process(sel,sminshi,sminge,skmshi,skmge,smshi,smge) variable num:integer range 0 to 10;begincase sel ISwhen"000"=>num:=sminge;when"001"=>num:=sminshi;when"011"=>num:=skmge;when"100"=>num:=skmshi;when"110"=>num:=smge;when"111"=>num:=smshi;when others=>num:=0;end case;case num ISwhen 0=>seg<="00111111";when 1=>seg<="00000110";when 2=>seg<="01011011";when 3=>seg<="01001111";when 4=>seg<="01100110";when 5=>seg<="01101101";when 6=>seg<="01111101";when 7=>seg<="00000111";when 8=>seg<="01111111";when 9=>seg<="01101111";when others=>seg<="00000000";end case;end process;end one;元件例化模块library ieee;use ieee.std_logic_1164.all;--entity comp isport(sclk,lclk,sta,dclk: in std_logic;weixuan:OUT std_logic_vector(2 downto 0);seg:out std_logic_vector(7 downto 0)); end;--architecture beh of comp is--component judge isport(sclk,sta,lclk: in std_logic;dge: out std_logic);end component;--component time_count isport(sta,sclk,dge: in std_logic;t_count: out std_logic;minge: out integer range 0 to 10;minshi: out integer range 0 to 10);end component;--component distance_count isport( sta,lclk,dge: in std_logic;kmge,kmshi: out integer range 0 to 10;d_count: out std_logic);end component;--component price_count isport(sta,t_count,d_count: in std_logic;mge,mshi: out integer range 0 to 10);end component;--component display isport(CLK:in std_logic;sminge,sminshi: in integer range 0 to 10;skmge,skmshi: in integer range 0 to 10;smge,smshi: in integer range 0 to 10;weixuan:OUT std_logic_vector(2 downto 0);seg:out std_logic_vector(7 downto 0));end component;--signal w,x,y: std_logic;signal time_ge,time_shi:integer range 0 to 10;signal pri_ge,pri_shi:integer range 0 to 10;signal dis_ge,dis_shi:integer range 0 to 10;--beginU1: judge port map(sta=>sta,sclk=>sclk,lclk=>lclk,dge=>w);U2: time_count port map(sta=>sta,sclk=>sclk,dge=>w,t_count=>x,minge=>time_ge,minshi=>time_shi);U3: distance_count port map(sta=>sta,lclk=>lclk,dge=>w,d_count=>y,kmge=>dis_ge,kmshi=>dis_shi);U4: price_count port map(sta=>sta,t_count=>x,d_count=>y,mge=>pri_ge,mshi=>pri_shi);U5: display port map(dclk,time_ge,time_shi,dis_ge,dis_shi,pri_ge,pri_shi,weixuan,seg);end;。

基于VHDL语言编写的出租车计价器程序

基于VHDL语言编写的出租车计价器程序

电子技术课程设计报告课程名称:基于VHDL语言编写的出租车计价器程序学院:专业:班级:学号:姓名:成绩:2010年12月30日前言电子设计自动化(Electronics Design Automation—EDA)技术是现代电子工程领域的一门新技术。

它提供了基于计算机和信息技术的电路系统设计方法。

EDA技术就是依赖功能强大的计算机,对用电路描述语言描述的设计文件,自动地完成编译、化简、分割、综合、布线、优化、仿真等,直至实现既定的电子电路系统的功能。

EDA技术打破了软件设计和硬件设计间的壁垒,是一门综合性学科,一种新的技能技术。

它将设计效率和产品性能合二为一,代表了电子设计技术和电子应用技术的发展方向。

EDA技术是指以计算机为工作平台,融合应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动化设计。

随着计算机的普及,EDA软件已广泛地应用于电子电路的分析与设计中,它改变了以定量估算和电路实验为基础的传统设计方法,代表了当今电子设计技术的最新发展方向,成为现代电子线路设计的必不可少的工具与手段。

EDA(Electronic Design Automation)技术是指以计算机为工作平台,融合应用电子技术,计算机技术,信息处理及智能化技术,进行电子产品自动化设计的一门新技术。

EDA技术作为现代电子设计技术的核心,依赖于功能强大的计算机,在EDA 工具软件平台上,对硬件描述语言微逻辑描述手段完成的设计文件,自动地完成逻辑编译,逻辑化简,逻辑分割,逻辑宗和,布局布线,以及逻辑优化和仿真测试,直至实现既定的电子电路的功能。

在硬件方面,EDA技术融饿了大规模集成电路制造技术,集成电路板图设计技术,可编程器件编程技术,自动测试技术等;在计算机辅助工程方面融合了计算机辅助设计CAD,计算机辅助制造CAM,计算机辅助分析CAA,计算机辅助测试CAT,计算机辅助工程CAE技术以及多种计算机语言的设计概念;在现代电子学方面融入了诸如计算机设计技术,电子线路设计理论,数字信号处理技术,数字系统建模和优化技术以积极与微波技术的长线技术理论等。

基于VHDL的出租车计价器设计的开题报告

基于VHDL的出租车计价器设计的开题报告

基于VHDL的出租车计价器设计的开题报告一、选题依据出租车计价器是出租车上的设备之一,它可以计算出乘客的乘车费用。

随着物联网技术的发展,出租车计价器也逐渐向智能化、数字化方向发展。

本设计通过利用FPGA和VHDL技术,开发一款基于VHDL的出租车计价器。

该计价器可以实现乘车计费、显示乘车距离和时间以及支持优惠券的使用等功能。

二、选题意义出租车计价器是一种必需品,它直接与乘客的乘车费用挂钩。

但是,传统的计价器对于不同时间段的计费标准较为简单,不足以满足现代出租车行业的需要。

同时,人工计算费用容易出现误差,影响乘客和司机的利益。

因此,设计和实现一款基于VHDL的出租车计价器具有较高的实用价值和研究意义。

三、设计目标和难点1. 设计目标本设计的目标是实现基于VHDL的出租车计价器。

该计价器可以通过计算乘车的时间和距离,自动计算乘客的费用,同时支持优惠券的使用。

该计价器采用FPGA作为核心芯片,通过VHDL语言实现各种计算和逻辑控制功能。

2. 设计难点本设计的主要难点包括:(1)设计乘车计费的算法,确保计算准确无误;(2)实现计价器的显示功能,包括乘车距离、乘车时间和费用等信息的显示;(3)支持优惠券的使用,包括对优惠券的扫描和识别功能;(4)保证计价器的稳定性和可靠性。

四、设计方法和技术路线1. 设计方法本设计采用分步骤开发的方法,分别完成基础功能的实现和优化功能的添加。

具体包括:(1)初步设计:确定整体框架、设计思路和技术路线;(2)电路设计:根据设计要求,设计各种控制逻辑、计算电路和显示电路;(3)FPGA实现:将电路设计转化为VHDL代码,并利用FPGA实现功能;(4)测试和优化:对设计的计价器进行实际测试,发现问题并及时优化。

2. 技术路线本设计的技术路线包括:(1)FPGA芯片的选择和开发板的选购;(2)乘车计费的算法设计和实现,包括时间、距离和费用的计算;(3)设计和实现乘车信息的显示,包括乘车距离、时间和费用等信息的显示;(4)支持优惠券的使用,包括对优惠券的扫描和识别功能。

用VHDL语言开发的出租车计费系统设计

用VHDL语言开发的出租车计费系统设计

用VHDL语言开发的出租车计费系统设计
0 引言
出租车计价系统较多的是利用单片机进行控制,但较易被私自改装,且
故障率相对较高,且不易升级;而FPGA具有高密度、可编程及有强大的软件支
持等特点,所以设计的产品具有功能强、可靠性高、易于修改等特点。

本文正是基于FPGA,设计了一种出租车的计费系统,它可以直观地显
示出租车行驶的里程和乘客应付的费用。

1 系统功能设计
所设计的计价器的计费标准为:车在行驶3 km以内,只收起步价9.0元;车行驶超过3 km后,按每公里2元计费。

行驶路程达到或超过9 km后,车费按
每公里3.0元开始计费。

车遇红灯或中途暂停时,每3分钟计0.5元。

若停止(rst)则车费清零,等待下一次计费的开始。

要求能够显示里程数和乘客应付的
费用,其中里程数精确到0.01 km,乘客应付的费用精确到0.1元,显示范围为:里程为0~99.99公里,费用为0~999.9元。

2 系统设计方案
基于FPGA的出租车计费系统的组成如3 各模块设计
设计FPGA控制部分,包括控制计价模块,BCD转换模块,动态扫描译
码模块以及分频模块。

采用混合设计的方法,各子部分用VHDL编程,顶层部
分用原理3.1 控制计价模块(jijia)
控制计价模块由里程计费模块、等待计费模块、总价模块组成。

里程计费模块,主要对传感器公里脉冲信号pulse计数(20m一个脉冲),
计算出租车本次交易行驶的路程以及里程费用。

每数到50个pulse为1 km,总。

出租车自动计费器VHDL程序报告

出租车自动计费器VHDL程序报告

出租车自动计费器VHDL程序报告EDA 课程设计课程 ____________题目 ____________学院 ____________专业班级学生姓名学生学号指导教师****年**月**日3、 用加法器将几项收费相加,P=P1+P2+P34、 P1为起价,P2为行车里程计费,P3为等候时间计费,用四个数码管表示总的计费结果。

四、系统设计原理及过程1、 基本原理本次设计首先在Quartus Ⅱ环境中对出租车自动计费器的各个部分利用VHDL 这一硬件描述语言予以设计,生成模块。

而整个设计的核心部分就在里程、计时、计费处理模块。

里程、计时模块完成行驶距离和等待时间的处理以及起步距离之后和等待时间的计费脉冲的产生。

计费处理模块完成起步价计费、在计费脉冲来临之际累加计费的功能。

随后运用Quartus Ⅱ中的仿真功能对其予以仿真,从仿真的结果中分析程序的正确性。

待所有模块的功能正确之后,运用原理图搭建电路并进行整体仿真直至达到最初的设计要求,最后再在实验箱上综合下载检验设计的正确与否。

2、 系统框图根据设计要求,电路具有计时、计程、计费功能,用数码管显示行驶公里数、等待时间、收费金额,行车里程和等待时间的处理电路将汽车行驶的里程数、转换成与之成正比的计费脉冲,然后由计费电路转换成收费金额,实验中以一个脉冲模拟汽车前进十米,则每100个脉冲表示1公里,3公里以后每公里产生一个计费脉冲,一个1HZ 的脉冲用来表示等待时间,60个脉冲代表1分钟,5分钟即300个脉冲产生一个等待计费脉冲,然后用计费电路对计费脉冲进行计费。

实验箱中只有一个48MHZ 的时钟,所以需要分频之后再送给其他模块,最后将等待时间、行驶里程、计费金额经过译码电路送到数码管显示。

其设计框图如图1所示:48MHZ行驶、分八分数据计译码显图1整体系统框图3、 电路及模块分析 系统总体设计电路如图2:VCCCLKINPUT VCC START INPUT VCC WR INPUT VCCRSTINPUT led7s[7..0]OUTPUT B[7..0]OUTPUT CLK OUTY[2..0]CNT8insta[3..0]POINTled7s[7..0]decl7s inst1P0[3..0]P1[3..0]P2[3..0]K0[3..0]K1[3..0]K2[3..0]M0[3..0]M1[3..0]S[2..0]D[3..0]B[7..0]POINTMAX81inst3clkFoutpulse inst4clk Foutpulse10inst5clkFoutpulsesp inst6B START RST P0[3..0]P1[3..0]P2[3..0]JIN inst7CLK0CLK1START WR RSTB1B2KM0[3..0]KM1[3..0]KM2[3..0]MIN1[3..0]MIN0[3..0]JIFEI inst2OR2inst8图2 出租车自动计费器顶层电路原理图1)行驶里程、等待时间处理模块本模块是系统的核心模块之一,能够对外部的行驶距离脉冲、等待时间脉冲进行计数。

出租车计价器实验报告

出租车计价器实验报告

大规模集成电路实验报告院系:电子工程学院班级:研2-093专业:电路与系统任课教师:任爱峰姓名:冀晓涛学号:0911120640出租车计价器的VHDL设计与仿真一、设计要求及主要技术指标(1)、设计要求1、设计一个出租车计价器。

2、该计价器的计费系统:行程3公里内,且等待累计时间2分钟内,起步费为10元;3公里外以每公里1.6元计费,等待累计时间2分钟外以每分钟以1.5元计费。

3、并能显示行驶公里数、等待累计时间、总费用。

(2)、主要技术指标1、计价范围:0~999.9元计价分辨率:0.1元。

2、计程范围:0~99公里计程分辨率:1公里。

3、计时范围:0~59分计时分辨率:1分。

二、系统组成它由外部输入模块、FPGA模块、显示模块三部分组成。

三、模块设计(1)、分频模块1、分频模块对频率为240Hz的输入脉冲进行分频,2、得到的频率为16Hz,15Hz和1Hz的三种频率。

(2)、控制模块控制模块是系统的核心部分,对计价器的状态进行控制。

(3)、计量模块1、计价部分:行程3公里内,且等待累计时间2分钟内,起步费为10元;3公里外以每公里1.6元计费,等待累计时间2分钟外以每分钟1.5元计费。

2、计时部分:计算乘客的等待累计时间。

计时器的量程为59分,满量程自动归零。

3、计程部分:计算乘客所行驶的公里数。

计程器的量程为99公里,满量程自动归零。

(4)、译码模块1、计费数据送入显示译码模块进行译码,最后送至百元、十元、元、角为单位对应的数码管上显示。

2、计时数据送入显示译码模块进行译码,最后送至分为单位对应的数码管上显示。

3、计程数据送入显示译码模块进行译码,最后送至以公里为单位的数码管上显示。

(5)、显示模块1、计价数据在以百元、十元、元、角为单位对应的数码管上显示。

2、计时数据在以分为单位对应的数码管上显示。

3、计程数据在以公里为单位的数码管上显示显示。

四、程序设计与仿真出租车计价器电路符号(1)、出租车计价器VHDL程序:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity taxi isport ( clk_240 :in std_logic; --频率为240Hz的时钟start :in std_logic; --计价使能信号stop:in std_logic; --等待信号fin:in std_logic; --公里脉冲信号cha3,cha2,cha1,cha0:out std_logic_vector(3 downto 0); --费用数据km1,km0:out std_logic_vector(3 downto 0); --公里数据min1,min0: out std_logic_vector(3 downto 0)); --等待时间end taxi;architecture behav of taxi issignal f_15,f_16,f_1:std_logic; --频率为15Hz,16Hz,1Hz的信号signal q_15:integer range 0 to 15; --分频器signal q_16:integer range 0 to 14; --分频器signal q_1:integer range 0 to 239; --分频器signal w:integer range 0 to 59; --秒计数器signal c3,c2,c1,c0:std_logic_vector(3 downto 0); --费用计数器signal k1,k0:std_logic_vector(3 downto 0); --公里计数器signal m1:std_logic_vector(2 downto 0); --分的十位计数器signal m0:std_logic_vector(3 downto 0); --分的个位计数器signal en1,en0,f:std_logic; --使能信号beginfeipin:process(clk_240,start)beginif clk_240'event and clk_240='1' thenif start='0' then q_15<=0;q_16<=0;f_15<='0';f_16<='0';f_1<='0';f<='0';elseif q_15=15 then q_15<=0;f_15<='1'; --此IF语句得到频率为15Hz的信号else q_15<=q_15+1;f_15<='0';end if;if q_16=14 then q_16<=0;f_16<='1'; --此IF语句得到频率为16Hz的信号else q_16<=q_16+1;f_16<='0';end if;if q_1=239 then q_1<=0;f_1<='1'; --此IF语句得到频率为1Hz的信号else q_1<=q_1+1;f_1<='0';end if;if en1='1' then f<=f_15; --此IF语句得到计费脉冲felsif en0='1' then f<=f_16;else f<='0';end if;end if;end if;end process;process(f_1)beginif f_1'event and f_1='1' thenif start='0' thenw<=0;en1<='0';en0<='0';m1<="000";m0<="0000";k1<="0000";k0<="0000";elsif stop='1' thenif w=59 then w<=0; --此IF语句完成等待计时if m0="1001" then m0<="0000"; --此IF语句完成分计数if m1<="101" then m1<="000";else m1<=m1+1;end if;else m0<=m0+1;end if;if m1&m0>"0000001"then en1<='1'; --此IF语句得到en1使能信号else en1<='0';end if;else w<=w+1;en1<='0';end if;elsif fin='1' thenif k0="1001" then k0<="0000"; --此IF语句完成公里脉冲计数if k1="1001" then k1<="0000";else k1<=k1+1;end if;else k0<=k0+1;end if;if k1&k0>"00000010" then en0<='1'; --此IF语句得到en0使能信号else en0<='0';end if;else en1<='0';en0<='0';end if;cha3<=c3;cha2<=c2;cha1<=c1;cha0<=c0; --费用数据输出km1<=k1;km0<=k0;min1<='0'&m1;min0<=m0; --公里数据、分钟数据输出end if;end process;process(f,start)beginif start='0' then c3<="0000";c2<="0001";c1<="0000";c0<="0000";elsif f'event and f='1' thenif c0="1001" then c0<="0000"; --此IF语句完成对费用的计数if c1="1001" then c1<="0000";if c2="1001" then c2<="0000";if c3<="1001" then c3<="0000";else c3<=c3+1;end if;else c2<=c2+1;end if;else c1<=c1+1;end if;else c0<=c0+1;end if;end if;end process;end behav;(2)、程序仿真图注:1. 仿真图中秒跟分的关系为3进制,即w为2时就归0;2. 出租车总行驶5公里,等待累计时间为4分钟,总费用为16.2元。

出租车计费器VHDL语言

出租车计费器VHDL语言

《数字逻辑电路》课程设计——出租车计费器的设计计算机学院软件工程1401赵雷3140608027出租车计费器的设计一、系统设计任务及要求(1)能实现计费功能,计费标准为:按行驶里程收费,起步价为7.00元,并在车行3千米后再按2元/千米,当总费用达到或超过40元时,每千米收费4元,客户端需要停车等待时按时间收费,计费单价每20秒1元。

(2)设计动态扫描电路:以十进制显示出租车行驶的里程与车费,在数码管上显示(前四个显示里程,后三个显示车费)。

(3)用VHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。

(4)完成电路全部设计后,通过系统试验箱下载验证设计的正确性。

二、系统设计方案根据系统设计设计要求不难得知,整个出租车计费系统按功能主要分为速度选择模块、计程模块、计时模块、计费模块4个模块。

车速控制模块计数器模块译码模块动态扫描电路模块顶层原理图1.速度模块:通过对速度信号sp的判断,决定行使的路程,这里是通过速度信号来模拟一个变量的取值。

如kinside变量,其含义是行进100m所需的时钟周期数,然后每行进100m,则产生一个脉冲clkout来驱动计费模块。

VHDL语言:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity Taxi_part1 isport(clk,reset,start,stop:in std_logic;sp :in std_logic_vector(2 downto 0);clkout :out std_logic);end Taxi_part1;architecture behavior of Taxi_part1 isbeginprocess(clk,reset,stop,start,sp)type state_type is(s0,s1);variable s_state:state_type;variable cnt:integer range 0 to 1400;variable kinside:integer range 0 to 1400;begincase sp iswhen "000"=> kinside:=0;when "001"=> kinside:=1400;when "010"=> kinside:=1200;when "011"=> kinside:=1000;when "100"=> kinside:=800;when "101"=> kinside:=600;when "110"=> kinside:=400;when "111"=> kinside:=200;end case;if(reset='1') then s_state:=s0;elsif(clk'event and clk='1') thencase s_state iswhen s0=>cnt:=0;clkout<='0';if(start='1') then s_state:=s1;else s_state:=s0;end if;when s1=>clkout<='0';if(stop='1') then s_state:=s0; --相当于无客户上车elsif(sp="000") then s_state:=s1; ---有客户上车,但车速位0,即客户刚上车还未起步elsif(cnt=kinside) then cnt:=0;clkout<='1'; s_state:=s1;else cnt:=cnt+1; s_state:=s1;end if;end case;end if;end process;end behavior;2.计程模块:由于一个clkout信号代表行进100m,故通过对clkout计数,可以获得共行进的距离kmcount。

出租车计价器程序vhdl语言编写的

出租车计价器程序vhdl语言编写的

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity taxi isport(clk,clk1,start,stop,pause :in std_logic;seg7out: out std_logic_vector(6 downto 0);pianxuan:out std_logic_vector(7 downto 0);dp:out std_logic);end taxi;architecture behave of taxi iscomponent add_cashport(clk,start,stop,pause:in std_logic;xingshi_money,lengths :out integer range 0 to 8000);end component;component pause_cashport(clk2,start,stop,pause:in std_logic;lengths:in integer range 0 to 8000;zanting_money,length:out integer range 0 to 8000);end component;component addport(x_money,p_money:in integer range 0 to 8000;money:out integer range 0 to 8000);end component;component dec_binport(clk1:in std_logic;money,length:in integer range 0 to 8000;aqian,abai,ashi,age,bqian,bbai,bshi,bge:out std_logic_vector(3 downto 0));end component;component xianshiport(clk1:in std_logic;s0,s1,s2,s3,s4,s5,s6,s7:in std_logic_vector (3 downto 0);seg7 : out std_logic_vector (6 downto 0);dp:out std_logic;pianxuan:out std_logic_vector (7 downto 0));end component;component clk_10hzport(clk1:in std_logic;clkout:out std_logic);end component;signal clk3:std_logic;signal money1,money2,money3,length1,length2:integer range 0 to 8000;signal h0,h1,h2,h3,h4,h5,h6,h7:std_logic_vector(3 downto 0);beginu1: add_cash port map (clk, start, stop, pause,lengths=>length1,x_money=>money1);u2: pause_cash port map (clk2=>clk3,start,stop,pause,lengths=>length1,p_money=>money2,length=>length2);u3: add port map (x_money=>money1,p_money=>money2,money=>money3);u4: dec_bin port map ( clk1, money=>money3,length=>length2,aqian=>h0,abai=>h1,ashi=>h2,age=>h3,bqian=>h4,bbai=>h5,bshi=>h6,bge=>h7);u5: xianshi port map (clk1,seg7=>seg7out,s0=>h0,s1=>h1,s2=>h2,s3=>h3,s4=>h4,s5=>h5,s6=>h6,s7=>h7,dp,pianxuan);u6: clk_10hz port map (clk1,clkout=>clk3);end behave;--12MHZ分频为10HZlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity clk_10hz isport(clk1:in std_logic;clkout:out std_logic );end clk_10hz;architecture behave of clk_10hz issignal clk_outQ: std_logic :='0';signal countQ : integer range 0 to 1600000 := 0;beginprocess(clk1)beginif(clk1'event and clk1='1')thenif(countQ /=599999) then --N/2-1countQ<=countQ+1;elseclk_outQ<=not clk_outQ;countQ <=0;end if;end if;end process;clkout <=clk_outQ;end behave;--行驶中计费library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity add_cash isport(clk,start,stop,pause:in std_logic;xingshi_money,lengths:out integer range 0 to 8000);end add_cash;architecture behave of add_cash isbeginprocess(clk,start,stop,pause)variable a:std_logic;variable aa:integer range 0 to 100;variable chf,lc:integer range 0 to 8000;variable num:integer range 0 to 9;beginif(clk'event and clk='1')thenif(stop='0')thenchf:=0;num:=0;aa:=0;lc:=0;elsif(start='0')then --启动时,起步价10.00元,里程为0aa:='0';chf:=1000;lc:=0;elsif(start='1'and pause='1')thenlc:=lc+1;aa:=aa+1;end if;if(aa>=100)thena:='1';aa:=0;elsea:='0';end if;if(lc<500)thennull;elsif(chf<5000 and a='1')thenchf:=chf+140; --行驶5KM后按1.4元/KMelsif(chf>5000 and a='1')thenchf:=chf+210; --计费超过50元,每公里收2.1元end if;end if;xingshi_money<=chf;length<=lc;end process;end behave;--暂停计费library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity pause_cash isport(clk2,start,stop,pause:in std_logic;length:in integer range 0 to 8000;zanting_money,length:out integer range 0 to 8000);end pause_cash;architecture behave of pause_cash isbeginprocess(clk2,start,stop,pause,lengths)variable b:std_logic;variable chf:integer range 0 to 8000;variable num:integer range 0 to 30;beginif(clk2'event and clk2='1')thenif(stop='0')thenchf:=0;num:=0;b:='1';elsif(start='0')thenb:='0';chf:=0;elsif(start='1'and pause='0' and lengths >500)thenif(b='0')thennum:=num+1;end if;if(num=30)thenchf:=chf+50;num:=0;end if;end if;end if;p_money<=chf;length<=lengths;end process;end behave;--两部分钱相加模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity add isport(x_money,p_money:in integer range 0 to 8000;money:out integer range 0 to 8000);end add;architecture behave of add isbeginprocess( x_money,p_money)variable chf,lc:integer range 0 to 8000;beginchf:=x_money+p_money;money<=chf;end process;end behave;--进制转换模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dec_bin isport(clk1:in std_logic;money,length:in integer range 0 to 8000;aqian,abai,ashi,age,bqian,bbai,bshi,bge:out std_logic_vector(3 downto 0) );end dec_bin;architecture behave of dec_bin isbeginprocess(clk1)variable coma :integer range 0 to 8000 :=0;variable com0a,com1a,com2a,com3a:std_logic_vector(3 downto 0);beginif(clk1'event and clk1='1')thenif(coma<money)thenif(com0a ="1001" and com1a ="1001" and com2a ="1001")then com0a :="0000";com1a :="0000";com2a :="0000";com3a :=com3a +1;coma :=coma +1;elsif(com0a="1001" and com1a="1001")thencom0a :="0000";com1a :="0000";com2a :=com2a +1;coma :=coma +1;elsif(com0a="1001")thencom0a :="0000";com1a :=com1a +1;coma :=coma +1;elsecom0a :=com0a +1;coma :=coma +1;end if;end if;end if;age<=com0a;ashi<=com1a;abai<=com2a;aqian<=com3a;end process;process(clk1)variable comb:integer range 0 to 8000 :=0;variable com0b,com1b,com2b,com3b:std_logic_vector(3 downto 0);beginif(clk1'event and clk1='1')thenif(comb<length)thenif(com0b ="1001" and com1b ="1001" and com2b ="1001")then com0b :="0000";com1b :="0000";com2b :="0000";com3b :=com3b+1;comb :=comb +1;elsif(com0b="1001" and com1b="1001")thencom0b :="0000";com1b :="0000";com2b :=com2b +1;comb :=comb+1;elsif(com0b="1001")thencom0b :="0000";com1b :=com1b +1;comb :=comb +1;elsecom0b :=com0b +1;comb :=comb +1;end if;end if;end if;bge<=com0b;bshi<=com1b;bbai<=com2b;bqian<=com3b;end process;end behave;--显示模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity xianshi isport(clk1:in std_logic;s0,s1,s2,s3,s4,s5,s6,s7:in std_logic_vector (3 downto 0);seg7 : out std_logic_vector (6 downto 0);pianxuan: out std_logic_vector(7 downto 0);dp:out std_logic);end xianshi;architecture behave of xianshi issignal outdata: std_logic_vector (3 downto 0) ;beginprocess(clk1)variable data : integer range 0 to 8 ;beginif(clk1'event and clk1='1')thendata:=data+1;if(data=8)thendata:=0;end if;end if;case data iswhen 0=>outdata<=s0;dp<='0';pianxuan<="00000001";when 1=>outdata<=s1;dp<='1';pianxuan<="00000010";when 2=>outdata<=s2;dp<='0';pianxuan<="00000100";when 3=>outdata<=s3;dp<='0';pianxuan<="00001000";when 4=>outdata<=s4;dp<='0';pianxuan<="00010000";when 5=>outdata<=s5;dp<='1';pianxuan<="00100000";when 6=>outdata<=s6;dp<='0';pianxuan<="01000000";when 7=>outdata<=s7;dp<='0';pianxuan<="10000000";when others => null;end case;case outdata iswhen "0000" =>seg7<="0111111";when "0001" =>seg7<="0000110";when "0010" =>seg7<="1011011";when "0011" =>seg7<="1001111";when "0100" =>seg7<="1100110";when "0101" =>seg7<="1101101";when "0110" =>seg7<="1111101";when "0111" =>seg7<="0000111";when "1000" =>seg7<="1111111";when "1001" =>seg7<="1101111";when others => null;end case;end process;end behave;。

「基于VHDL语言的出租车计费器设计」

「基于VHDL语言的出租车计费器设计」

「基于VHDL语言的出租车计费器设计」出租车计费器是一种广泛应用于出租车行业的设备,用于计算车辆的费用并实时显示给乘客。

本文将基于VHDL语言设计一个简单的出租车计费器。

设计一个出租车计费器需要考虑以下几个方面:车辆里程计算、时间计费、费用显示和控制。

首先,我们将从车辆里程计算开始设计。

假设出租车的速度传感器每隔一段时间测量一次速度,我们可以通过速度传感器数据和时间信息计算车辆的里程。

这里我们可以设计一个有限状态机来记录车辆的行驶状态和位置信息,并计算里程。

可以使用计算机存储器来存储车辆位置信息,并使用计数器来记录总里程。

接下来,我们需要设计时间计费模块。

假设每分钟的计费费率为X元,我们可以使用一个计数器来记录车辆行驶的时间,并将计数器的值与X元相乘得到计费金额。

我们还可以通过设置计数器的初始值和最大值来控制计费的时间间隔和最长计费时间。

费用显示模块是出租车计费器的核心功能之一、我们可以使用七段数码管或LCD显示屏来实时显示费用信息。

设计费用显示模块需要确定费用显示的格式,例如小数点位置、位数等。

我们还可以设计一个使费用显示模块能够显示不同运行状态下的附加信息的控制模块。

最后,我们需要设计一个控制模块来实现出租车计费器的整体控制。

这个模块可以通过读取车辆速度和时间计费器的值,并将这些值传递给里程计算器和时间计费器。

此外,控制模块还可以实现一些功能,如启动和停止计费器、调整计费费率、重置里程和时间等。

综上所述,基于VHDL语言的出租车计费器设计涉及到车辆里程计算、时间计费、费用显示和控制等多个方面。

我们可以使用VHDL语言来实现这些功能模块,并通过模块化设计方法将它们组合在一起,实现一个功能完善的出租车计费器。

这个设计不仅可以提高出租车行业的计费效率,还可以为乘客提供准确的费用信息,提升用户体验。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

EDA 课程设计课程 ____________题目 ____________学院 ____________专业班级学生姓名学生学号指导教师****年**月**日题目出租车自动计费器摘要本系统是基于FPGA的模拟出租车计费系统,是在实验室实验箱EP1C6P240C8芯片及其外围电路的基础上完成程序的下载仿真。

本系统模拟了出租车计费系统的过程,其中出租车的状态分为等待、行驶,系统能够完成起步价计费,等待、行驶状态计费。

关键字:出租车计费系统起步价等待行驶一、设计目的1.掌握出租车计费的工作原理2.进一步熟悉用VHDL语言编写出租车计费程序二、开发软件: QuartusII三、设计任务1、设计一个出租车自动计费器,具有行车里程计费、等候时间计费、及起价三部分,用三位数码管显示总金额,最大值为99.9元;2、行车里程单价1.7元/公里,等候时间单价1.7元/5分钟,起价8元(3公里起价)。

3、行车里程的计费电路将汽车行驶的里程数转换成与之成正比的脉冲数,然后由计数译码电路转换成收费金额,实验中以一个脉冲模拟汽车前进十米,则每100个脉冲表示1公里,然后用乘法器将里程数乘以每公里单价的比例系数,从而计算出具体费用。

4、用数码管显示行驶公里数,三个数码管显示行驶里程。

提示:1、等候时间计费需将等候时间转换成脉冲个数,用每个脉冲表示的金额与脉冲数相乘即得计费数,脉冲周期为1秒,例如60个脉冲表示1分钟,而5分钟收费1.7元。

2、用2个LED显示等候时间。

3、用加法器将几项收费相加,P=P1+P2+P34、 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分频library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity pulse isport(clk: in std_logic;-- D: in std_logic_vector(7 DOWNTO 0);Fout: out std_logic);end;architecture one of pulse issignal full:std_logic;beginp_reg:process(clk)variable cnt8: integer range 24000000 downto 0;beginif clk'event and clk='1' thenif cnt8=24000000 thencnt8:=0;full<='1';else cnt8:=cnt8+1;full<='0';end if;end if;end process p_reg;p_div:process (full)variable cnt2:std_logic;beginif full'event and full='1' thencnt2:=not cnt2;If cnt2='1'then fout<='1';else fout<='0';end if;end if;end process p_div;end;2、10HZ分频library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity pulse10 isport(clk: in std_logic;-- D: in std_logic_vector(7 DOWNTO 0);Fout: out std_logic);end;architecture one of pulse10 issignal full:std_logic;beginp_reg:process(clk)variable cnt8: integer range 2400000 downto 0;beginif clk'event and clk='1' thenif cnt8=2400000 thencnt8:=0;full<='1';else cnt8:=cnt8+1;full<='0';end if;end if;end process p_reg;p_div:process (full)variable cnt2:std_logic;beginif full'event and full='1' thencnt2:=not cnt2;If cnt2='1'then fout<='1';else fout<='0';end if;end if;end process p_div;end;3、扫频分频library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity pulsesp isport(clk: in std_logic;-- D: in std_logic_vector(7 DOWNTO 0);Fout: out std_logic);end;architecture one of pulsesp issignal full:std_logic;beginp_reg:process(clk)variable cnt8: integer range 24000 downto 0;beginif clk'event and clk='1' thenif cnt8=24000 thencnt8:=0;full<='1';else cnt8:=cnt8+1;full<='0';end if;end if;end process p_reg;p_div:process (full)variable cnt2:std_logic;beginif full'event and full='1' thencnt2:=not cnt2;If cnt2='1'then fout<='1';else fout<='0';end if;end if;end process p_div;end;4、里程、等待时间处理模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY JIFEI ISPORT(CLK0,CLK1:IN STD_LOGIC;START:IN STD_LOGIC;WR:IN STD_LOGIC;RST:IN STD_LOGIC;B1,B2:OUT STD_LOGIC;KM0,KM1,KM2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);MIN1,MIN0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END JIFEI;ARCHITECTURE BEHA VE OF JIFEI ISBEGINRUN:PROCESS(CLK0,START,WR,RST)V ARIABLE R1:INTEGER RANGE 0 TO 9;V ARIABLE R2:INTEGER RANGE 0 TO 99;V ARIABLE K:STD_LOGIC_VECTOR (7 DOWNTO 0);V ARIABLE K2,K1,K0 :STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINIF RST='0' THEN K0:="0000";K1:="0000";K2:="0000";R1:=0;R2:=0; ELSIF CLK0'EVENT AND CLK0='1' THENIF START='1'AND WR='1' THENIF R1=9 THEN R1:=0;IF K0="1001" THENK0:="0000";IF K1="1001" THENK1:="0000";IF K2="1001" THENK2:="0000";ELSEK2:=K2+1;END IF;ELSEK1:=K1+1;END IF;ELSEK0:=K0+1;END IF;ELSE R1:=R1+1;END IF;K:=K2&K1;IF K>"00000001" THENIF R2<99 THEN R2:=R2+1;B1<='0';ELSE R2:=0;B1<='1';END IF;END IF;END IF;END IF;KM0<=K0;KM1<=K1;KM2<=K2;END PROCESS;W:PROCESS(CLK1,START,WR,RST)V ARIABLE W1:INTEGER RANGE 0 TO 59;V ARIABLE W2:INTEGER RANGE 0 TO 299;V ARIABLE M1:STD_LOGIC_VECTOR(3 DOWNTO 0);V ARIABLE M0:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINIF RST='0' THEN M0:="0000";M1:="0000";W1:=0;W2:=0;ELSIF CLK1'EVENT AND CLK1='1' THENIF START='1' AND WR='0'THENIF W1=59 THEN W1:=0;IF M0="1001"THENM0:="0000";IF M1="1001"THENM1:="0000";ELSE M1:=M1+1;END IF;ELSE M0:=M0+1;END IF;ELSE W1:=W1+1;END IF;IF W2<299 THEN W2:=W2+1;B2<='0';ELSE W2:=0;B2<='1';END IF;END IF;END IF;MIN0<=M0;MIN1<=M1;END PROCESS;END ARCHITECTURE ;5、计费模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY JIN ISPORT(B:IN STD_LOGIC;START:IN STD_LOGIC;RST:IN STD_LOGIC;P0,P1,P2: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END JIN;ARCHITECTURE BEHA VE OF JIN ISBEGINP:PROCESS(B,START,RST)V ARIABLE C2,C1,C0:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF RST='0' THEN C0:="0000";C1:="1000";C2:="0000";ELSIF START='1' THENIF B'EVENT AND B='1' THENIF C0>2 THEN --加0.7元IF C1="1001"THEN C1:="0000";IF C2="1001"THEN C2:="0000";ELSE C2:=C2+1;END IF;ELSE C1:=C1+1;END IF;C0:=C0-3;ELSE C0:=C0+7;END IF;IF C1="1001"THEN C1:="0000";IF C2="1001"THEN C2:="0000";ELSE C2:=C2+1;END IF;ELSE C1:=C1+1;END IF;END IF;END IF;P0<=C0;P1<=C1;P2<=C2;END PROCESS;END;6、八进制计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT8 ISPORT (CLK : IN STD_LOGIC;OUTY : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END CNT8;ARCHITECTURE behav OF CNT8 ISBEGINPROCESS(CLK)V ARIABLE CQI : STD_LOGIC_VECTOR(2 DOWNTO 0);BEGINIF CLK'EVENT AND CLK='1' THENIF CQI < "111" THEN CQI := CQI + 1;ELSE CQI := "000";END IF;END IF;OUTY <= CQI;END PROCESS;END behav;7、八选一数据选择器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY MAX81 ISPORT (P0,P1,P2,K0,K1,K2,M0,M1: IN STD_LOGIC_VECTOR(3 DOWNTO 0);S : IN STD_LOGIC_VECTOR(2 DOWNTO 0);D : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);B : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);POINT:OUT STD_LOGIC);END MAX81;ARCHITECTURE body_mAx81 OF mAx81 ISBEGINprocess (P0,P1,P2,K0,K1,K2,M0,M1,S)begincase S isWHEN "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';WHEN others => null;end case;end process;END body_MAX81;8、数码管译码程序Library ieee;use ieee.std_logic_1164.all;entity decl7s isport(a:in std_logic_vector(3 downto 0);POINT:IN STD_LOGIC;led7s:out std_logic_vector(7 downto 0));end decl7s;architecture one of decl7s isbeginprocess(a,POINT)beginIF POINT='0' THENcase a iswhen "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"; when others=>null;end case;ELSEcase a iswhen "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"; when others=>null;end case;END IF;end process;end;。

相关文档
最新文档