出租车自动计费器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技术以及多种计算机语言的设计概念;在现代电子学方面融入了诸如计算机设计技术,电子线路设计理论,数字信号处理技术,数字系统建模和优化技术以积极与微波技术的长线技术理论等。

  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;。

相关文档
最新文档