您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 出租车计费器课程设计报告(VHDL语言)
电子技术课程设计—出租车计费器的设计学院:电子信息工程学院班级:姓名:学号:指导教师:日期:年月日出租车计费器设计一、设计任务与要求设计并制作一台出租车计费系统,要求如下:﹙1﹚实现计费功能,计费标准为:按行程里程收费,起步价为7.00元,在车行3公里后再按2.2元/公里计费,当计费器达到或超过20元时,每公里加收50﹪的车费。﹙2﹚实现模拟功能:能模拟汽车启动、停止、暂停、加速的状态﹙3﹚设计动态扫描电路,将车费和里程显示出来,各有两位小数。二、总体框图(1)系统总体结构出租车计费器的组成如上图所示,各部分主要功能包括输入信号模块对车轮传感器传送的脉冲信号进行计数,并以高低脉冲模拟出租汽车启动,停止,暂停,加速按钮,具有输入信号作用;数据转换器模块将计费模块输出的车费和路程转换成4位的十进制数据;译码/动态扫描模块将路程与费用的数值译码后用动态扫描的方式驱动数码管;数码管显示模块将公里数和计费金额均用4位LED数码管显示。(2)其流程图如下图所示:输入信号模块片选信号产生模块数据转换模块动态描述/译码/数码管显示模块数码管控制电路(3)各模块设计功能及设计思路★信号输入模块该模块主要实现计费功能和现场模拟功能。计费标准为:按行驶里程计费,起步价为7.00元,并在车行3km后按2.20元/km计费,当计费器达到或超过20元时,每公里加收50%的车费,车停止不计费。并以高低脉冲模拟出租汽车启动、停止、暂停、加速按钮,具有输入信号的作用。★数据转换模块数据转换模块是一个模为10的加法计数器,可将计费模块输出的车费和路程转换成4位的十进制数。★显示模块显示模块是由七段LED数码管译码和动态扫描显示两部分组成。采用的是共阴极七段数码管,根据十六进制数和七段显示段码表的对应关系,其中要求路程和车费都要用2位小数点来表示,所以须设置一个控制小数点的变量,即程序中的dp。这段程序所示的是在数码管的第二、第六个后面显示小数点,实现了路程和车费都用2位小数点表示的功能。数码管控制及译码显示模块将十进制的输入信号用七段数码管显示,由七段发光二极管组成数码显示器,利用字段的不同组合。可分别显示0~9十个数字。★片选信号产生模块片选信号产生模块是对数码管进行片选并让其能够按照要求显示数据的模块开始输入行车里程数xx0andx=3Y=7x3andx9Y=7+2.2x输出车费yY=3.3x+7结束三、选择器件设计开发软件:QuartusII6.0EDA实验箱:EL教学实验箱四、功能模块(1)jifei模块此模块为计费模块(即总体结构中的信号输入模块),实现计费功能,计费标准为:按行驶里程计费,起步价为7.00元,并在车行3公里后按2.20元/km计费,当计数器达到或超过20元时,每公里加收50%的车费,即按3.30元/km计费。CLK、START、STOP、PAUSE、JS为输入信号,分别代表汽车的起动、停止、暂停和加速,CLK为扫描时钟,硬件实现时加入时钟信号,另有两个输出,即CHEFEI和LUC,分别代表车费和路程,当车处于行驶状态时,此模块会自动记录下路程与车费状况并作为转换模块的输入。jifei模块源程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityjfmkisport(clk,start,stop,pause,js:instd_logic;chefei,luc:outintegerrange0to8000);endjfmk;architectureoneofjfmkisbeginprocess(clk,start,stop,pause,js)variablea,b:std_logic;variableaa:integerrange0to100;variablechf,lc:integerrange0to8000;variablenum:integerrange0to9;beginif(clk'eventandclk='1')thenif(stop='0')thenchf:=0;num:=0;b:='1';aa:=0;lc:=0;elsif(start='0')thenb:='0';chf:=700;lc:=0;elsif(start='1'andjs='1'andpause='1')thenif(b='0')thennum:=num+1;endif;if(num=9)thenlc:=lc+5;num:=0;aa:=aa+5;endif;elsif(start='1'andjs='0'andpause='1')thenlc:=lc+1;aa:=aa+1;endif;if(aa=100)thena:='1';aa:=0;elsea:='0';endif;if(lc300)thennull;elsif(chf2000anda='1')thenchf:=chf+220;elsif(chf=2000anda='1')thenchf:=chf+330;endif;endif;chefei=chf;luc=lc;endprocess;endone;模块分析:首先打开ieee库,用use语句声明使用std_logic_1164和std_logic_unsigned程序包。clk、start、stop、pause、js为敏感信号,定义a,b为中间变量,变量aa、num、chf为位矢量。当时钟上升沿到来时,如果STOP='0'则chf:=0,num:=0,b:=1,aa:=0,lc:=0,如果stop='1'且start='0'则chf:=700,lc:=0,stop='1’;如果stop='1'andstart='1'andjs='1'andpause='1'且b='0'则num:=num+1;如果stop='1'andstart='1'andjs='1'andpause='1'且num=9则lc:=lc+1;num:=0,aa:=aa+1。如果stop='1'andstart='1'andjs='0'andpause='1'则lc:=lc+1;aa:=aa+1;以上各状态分别代表汽车的停止、启动、加速、暂停。如果aa=100则a:='1',aa:=0,否则a:='0',如果chf2000且a='1'则chf:=chf+220;如果chf2000anda='1'则chf:=chf+330;以上各状态表示汽车在三公里以外车费在二十元以内的状态、车费在二十元以外的状态。结束进程,结束结构体。jifei模块的时序仿真图:时序仿真图分析:图中的stop为汽车停止输入端,上升沿有效;start为汽车启动输入端,上升沿有效;pause为汽车暂停输入端,上升沿有效;js为汽车加速输入端,上升沿有效。CLK为时钟源信号;chefei为汽车车费输出端,luc为汽车路程输出端。由图可知:当stop,Start,pause,js全为高电平时路程按5的速度增加,车费为700.当路程增加到300时,车费变为920,以后路程每增加100,车费增加220。模块生成图:(2)x模块此模块为数据转换模块,功能是将计费模块产生的车费与路程的模拟量转换成数字量并输出,它是一个模为10的加法计数器,可将计费模块输出的车费和路程转换成4位的十进制数。其中DACLK为时钟信号,ASCORE、BSCORE连接计费模块的CHEFEI和LUC,输出为2个4位的十进制数,可以分别表示路程和车费情况。当车运行于不同状况时,此模块会将不同的车费与路程状况转换为数字量并输出。x模块的源程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityxisport(daclk:instd_logic;ascore,bscore:inintegerrange0to8000;age,ashi,abai,aqian,bge,bshi,bbai,bqian:outstd_logic_vector(3downto0));endx;architecturert1ofxisbeginprocess(daclk,ascore)variablecomb1:integerrange0to8000;variablecomb1a,comb1b,comb1c,comb1d:std_logic_vector(3downto0);beginif(daclk'eventanddaclk='1')thenif(comb1ascore)thenif(comb1a=9andcomb1b=9andcomb1c=9)thencomb1a:=0000;comb1b:=0000;comb1c:=0000;comb1d:=comb1d+1;comb1:=comb1+1;elsif(comb1a=9andcomb1b=9)thencomb1a:=0000;comb1b:=0000;comb1:=comb1+1;comb1c:=comb1c+1;elsif(comb1a=9)thencomb1a:=0000;comb1b:=comb1b+1;comb1:=comb1+1;elsecomb1a:=comb1a+1;comb1:=comb1+1;endif;elseashi=comb1b;age=comb1a;abai=comb1c;aqian=comb1d;comb1:=0;comb1a:=0000;comb1b:=0000;comb1c:=0000;comb1d:=0000;endif;endif;endprocess;process(daclk,bscore)variablecomb2:integerrange0to8000;variablecomb2a,comb2b,comb2c,comb2d:std_logic_vector(3downto0);beginif(daclk'eventanddaclk='1')thenif(comb2bscore)thenif(comb2a=9andcomb2b=9andcomb2c=9)thencomb2a:=0000;comb2b:=0000;comb2c:=0000;comb2d:=comb2d+1;comb2:=comb2+1;elsif(comb2a=9andcomb2b=9)thencomb2a:=0000;comb2b:=0000;comb2:=comb2+1;comb2c:=comb2c+1;elsif(comb2a=9)thencomb2a:=0000;comb2b:=comb2b+1;comb2:=comb2+1;elsecomb2a:=comb2a+1;comb2:=comb2+1;endif;elsebshi=comb2b;bge=comb2a;bbai=comb2c;bqian=comb2d;comb2:=0;comb2a:=0000;comb2b:=0000;comb2c:=0000;comb2d:=0000;endif;endif;endprocess;endrt1;程序分析:首先打开ieee库,用use语句声明使用std_logic_1164和std_logic_unsigned程序包。定义实体,daclk、ascore、bscore为输入,age、ashi、abai、aqian、bge、bshi、bbai、bqian为输出位矢量。然后定义结构体,daclk、ascore、bscore为敏感信号,定义变量comb1a,comb1b,comb1c,comb1d为位矢量,变量comb1为0到7000范围。当时钟上升沿到来时,各个变量分别实现个、十、百、千的进位。然后实现一个循环。然后再将各个变量付给各个位矢量。模块生成图:X模块的时序仿真图时序仿真图的分析转换模块的时序仿真图如下图所示:可见能将路程和车费转换为4位的十进制数,便于8位数码管显示。由
本文标题:出租车计费器课程设计报告(VHDL语言)
链接地址:https://www.777doc.com/doc-2055025 .html