vdhl语言出租车计费器课程设计报告_第1页
vdhl语言出租车计费器课程设计报告_第2页
vdhl语言出租车计费器课程设计报告_第3页
vdhl语言出租车计费器课程设计报告_第4页
vdhl语言出租车计费器课程设计报告_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、. . . . 目录第1章总体设计思路11.1系统总体结构11.2 各模块设计功能与设计思路2第二章各模块功能32.1 jifei模块32.2 x模块62.3 sel模块102.4 xxx1模块122.5 di模块142.6 div模块152.7 decode3_8模块17第3章总体电路图183.1、模块连接:183.2、硬件连接:193.3、结果分析:19第4章硬件实现22第5章总结23第6章参考文献24第1章总体设计思路1.1系统总体结构动态扫描/译码/数码管显示模块片选信号产生模块数据转换模块数码管控制模块信号输入模块图1.1 系统总体框图出租车计费器的组成如上图所示,各部分主要功能包括

2、输入信号模块对车轮传感器传送的脉冲信号进行计数,并以高低脉冲模拟出租汽车启动,停止,暂停,速度按钮,具有输入信号作用;数据转换器模块将计费模块输出的车费和路程转换成4位的十进制数据;译码/动态扫描模块将路程与费用的数值译码后用动态扫描的方式驱动数码管;数码管显示模块将公里数和计费金额均用4位LED数码管显示 。1.2 各模块设计功能与设计思路信号输入模块实现计费功能和现场模拟功能。计费标准为:按行驶里程计费,起步价为7.00元,并在车行3 km后按2.20元km计费,当计费器达到或超过20元时,每公里加收50的车费,车停止不计费。并以高低脉冲模拟出租汽车启动、停止、暂停、速度按钮,具有输入信号

3、的作用。数据转换模块数据转换模块是一个模为10的加法计数器,可将计费模块输出的车费和路程转换成4位的十进制数。显示模块显示模块是由七段LED数码管译码和动态扫描显示两部分组成。采用的是共阴极七段数码管,根据十六进制数和七段显示段码表的对应关系,其中要求路程和车费都要用2位小数点来表示,所以须设置一个控制小数点的变量,即程序中的dp。这段程序所示的是在数码管的第二、第六个后面显示小数点,实现了路程和车费都用2位小数点表示的功能。数码管控制与译码显示模块将十进制的输入信号用七段数码管显示,由七段发光二极管组成数码显示器,利用字段的不同组合。可分别显示09十个数字。片选信号产生模块片选信号产生模块是

4、对数码管进行片选并让其能够按照要求显示数据的模块第二章 各模块功能2.1 jifei模块此模块为计费模块(即总体结构中的信号输入模块),实现计费功能,计费标准为:按行驶里程计费,起步价为7.00元,并在车行3公里后按2.20元/km计费,当计数器达到或超过20元时,每公里加收50%的车费,即按3.30元/km计费。CLK、START、STOP、PAUSE、speed为输入信号,分别代表汽车的起动、停止、暂停和速度,CLK为扫描时钟,硬件实现时加入时钟信号,另有两个输出,即MONEY和RUN,分别代表车费和路程,当车处于行驶状态时,此模块会自动记录下路程与车费状况并作为转换模块的输入。jifei

5、模块源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jfmk is port(clk,start,stop,pause,speed:in std_logic;money,run:out integer range 0 to 8000);end jfmk;architecture one of jfmk isbegin process(clk,start,stop,pause,speed) variable a,b:std_logic; variable aa:integer r

6、ange 0 to 100; variable chf,lc:integer range 0 to 8000; variable num:integer range 0 to 9; begin if(clk'event and clk='1')then if(stop='0') then chf:=0; num:=0; b:='1' aa:=0; lc:=0; elsif(start='0') then b:='0'chf:=700; lc:=0; elsif(start='1' and s

7、peed='1' and pause='1') then if(b='0')then num:=num+1; end if; if(num=9)then lc:=lc+5; num:=0; aa:=aa+5; end if; elsif(start='1' and speed='0' and pause='1')then lc:=lc+1; aa:=aa+1; end if; if(aa>=100)then a:='1' aa:=0; else a:='0' e

8、nd if; if(lc<300)then null; elsif(chf<2000 and a='1') then chf:=chf+220; elsif(chf>=2000 and a='1')then chf:=chf+330; end if; end if;money<=chf; run<=lc; end process; end one;模块分析:首先打开ieee库,用use语句声明使用std_logic_1164和std_logic_unsigned程序包。clk、start、stop、pause、speed为敏感信号,

9、定义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'and speed='1'and pause='1'且 b='0'则num:=num+1;如果stop='1'andstart='1'a

10、nd speed='1'and pause='1'且num=9则lc:=lc+1;num:=0,aa:=aa+1。如果stop='1'and start='1'and speed='0'and pause='1'则lc:=lc+1;aa:=aa+1;以上各状态分别代表汽车的停止、启动、速度、暂停。如果aa>=100则a:='1',aa:=0,否则a:='0',如果chf<2000且a='1'则chf:=chf+220;如果chf>20

11、00 and a='1'则chf:=chf+330;以上各状态表示汽车在三公里以外车费在二十元以的状态、车费在二十元以外的状态。结束进程,结束结构体。jifei模块的时序仿真图:时序仿真图分析: 图中的stop为汽车停止输入端,上升沿有效;start为汽车启动输入端,上升沿有效;pause为汽车暂停输入端,上升沿有效;speed为汽车速度输入端,上升沿有效。CLK为时钟源信号;money为汽车车费输出端,run为汽车路程输出端。由图可知:当stop,Start,pause,speed全为高电平时路程按5的速度增加,车费为700.当路程增加到300时,车费变为920,以后路程每增

12、加100,车费增加220。2.2 x模块此模块为数据转换模块,功能是将计费模块产生的车费与路程的模拟量转换成数字量并输出,它是一个模为10的加法计数器,可将计费模块输出的车费和路程转换成4位的十进制数。其中DACLK为时钟信号,ASCORE、BSCORE连接计费模块的MONEY和run,输出为2个4位的十进制数,可以分别表示路程和车费情况。当车运行于不同状况时,此模块会将不同的车费与路程状况转换为数字量并输出。x模块的源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity x is

13、port(daclk:in std_logic; ascore,bscore:in integer range 0 to 8000; age,ashi,abai,aqian,bge,bshi,bbai,bqian:out std_logic_vector(3 downto 0);end x;architecture rt1 of x isbeginprocess(daclk,ascore)variable comb1:integer range 0 to 8000;variable comb1a,comb1b,comb1c,comb1d:std_logic_vector(3 downto 0)

14、; begin if (daclk'event and daclk='1')then if(comb1<ascore)then if(comb1a=9 and comb1b=9 and comb1c=9)then comb1a:="0000" comb1b:="0000" comb1c:="0000" comb1d:=comb1d+1; comb1:=comb1+1; elsif(comb1a=9 and comb1b=9)then comb1a:="0000" comb1b:=&qu

15、ot;0000" comb1:=comb1+1; comb1c:=comb1c+1; elsif(comb1a=9)then comb1a:="0000" comb1b:=comb1b+1; comb1:=comb1+1; else comb1a:=comb1a+1;comb1:=comb1+1; end if; elseashi<=comb1b;age<=comb1a;abai<=comb1c;aqian<=comb1d;comb1:=0;comb1a:="0000"comb1b:="0000"co

16、mb1c:="0000" comb1d:="0000" end if; end if; end process; process(daclk,bscore) variable comb2:integer range 0 to 8000; variable comb2a,comb2b,comb2c,comb2d:std_logic_vector(3 downto 0); begin if(daclk'event and daclk='1')then if(comb2<bscore)then if(comb2a=9 and co

17、mb2b=9 and comb2c=9)thencomb2a:="0000"comb2b:="0000" comb2c:="0000" comb2d:=comb2d+1; comb2:=comb2+1; elsif(comb2a=9 and comb2b=9)thencomb2a:="0000"comb2b:="0000"comb2:=comb2+1; comb2c:=comb2c+1; elsif(comb2a=9)then comb2a:="0000" comb2b:=c

18、omb2b+1; comb2:=comb2+1; else comb2a:=comb2a+1; comb2:=comb2+1; end if; elsebshi<=comb2b;bge<=comb2a;bbai<=comb2c;bqian<=comb2d;comb2:=0;comb2a:="0000"comb2b:="0000"comb2c:="0000"comb2d:="0000" end if;end if;end process;end rt1;程序分析:首先打开ieee库,用use语

19、句声明使用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模块的时序仿真图时序仿真图的分析转换模块的时序仿真图如下图所示:可见能将路程和车费转换为

20、4位的十进制数,便于8位数码管显示。由图可知:当ascore,bscore为13位二进制数,当ascore为0-9时age从0到9变化,当ascore为10时age等于0,ashi等于1。 当bscore为0-9时bge从0到9变化,当bscore为10时bge等于0,bshi等于1。2.3 sel模块此模块为片选信号产生模块,功能是选择八段数码管按照设计要求进行正确的显示。其具体的对应关系如下表所示:接口序号数码管SEL2SEL1SEL0状态111第1位亮110第2位亮101第3位亮100第4位亮011第5位亮010第6位亮001第7位亮0XX第8位亮在该模块中CLK为时钟信号,A2.0为片

21、选输出,用于选择数码管,连接译码显示模块的片选端C2.0。se模块的源程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sel is port(clk:in std_logic; a:out std_logic_vector(2 downto 0);end sel;architecture rt1 of sel isbegin process(clk) variable b:std_logic_vector(2 downto 0); begin if(clk'even

22、t and clk='1')then if(b="111")then b:="000" else b:=b+1; end if; end if; a<=b; end process;end rt1; sel模块的波形图:由图可以看出,当CLK加入时钟信号时,a从000到111逐个变化,该模块可将模拟信号进行片选并有对应的数码管进行显示。2.4 xxx1模块此模块为显示模块中的动态扫描/译码/数码管显示模块,功能是将已转换好的数字量加载到两个4位七段数码管上并加以显示。C2.0为片选端,用来连接片选模块的片选输出端A2.0,A1、A2

23、、A3、A4、B1、B2、B3、B4分别连接数据转换模块的八个转换输出端,因为设计要求路程和车费都要用2位小数点来表示,所以须设置一个控制小数点的变量,即程序中的DP端,D3.0连接数码管控制模块的输入端。xxx1模块的源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity xxxl isport(c:in std_logic_vector(2 downto 0);dp:out std_logic;a1,a2,a3,a4,b1,b2,b3,b4:in std_logic_vector

24、(3 downto 0);d:out std_logic_vector(3 downto 0);end xxxl;architecture rtl of xxxl isbeginprocess(c,a1,a2,a3,a4,b1,b2,b3,b4)variable comb:std_logic_vector(2 downto 0);begin comb:=c;case comb iswhen"000"=>d<=a1;dp<='0'when"001"=>d<=a2;dp<='0'when&q

25、uot;010"=>d<=a3;dp<='1'when"011"=>d<=a4;dp<='0'when"100"=>d<=b1;dp<='0'when"101"=>d<=b2;dp<='0'when"110"=>d<=b3;dp<='1'when"111"=>d<=b4;dp<='0'

26、when others=>null;end case;end process;end rtl;xxx1模块的时序仿真图:由上图可知,输入信号C为3位片选信号其变化围为0到7,输入信号c从0到7逐个变化时,输出d逐个输a1,a2,a3,a4,b1,b2,b3,b4的输入信号。2.5 di模块此模块为数码管控制模块,功能是控制七段数码管对转换后的数字量进行显示,使其完成路程和车费的显示。其中D3.0连接动态扫描/译码/数码管显示模块的D3.0端,Q6.0连接七段数码管,利用其控制特性在数码管上显示出车费和路程。di模块的源程序:library ieee;use ieee.std_logic_

27、1164.all;entity di isport(d:in std_logic _vector(3 downto 0); q:out std_logic_vector(6 downto 0);end di;architecture rtl of di isbegin process(d) begin case d is when"0000"=>q<="0111111" when"0001"=>q<="0000110" when"0010"=>q<="

28、;1011011" when"0011"=>q<="1001111" when"0100"=>q<="1100110" when"0101"=>q<="1101101" when"0110"=>q<="1111101" when"0111"=>q<="0100111" when"1000"=>q<

29、="1111111" when others=>q<="1101111" end case;end process;end rtl;di模块的时序仿真图:从波形图中可看出,此模块可控制数码管完成对数字量的显示。当输入为0000-1000时数码管分别显示0,1,2,3,4,5,6,7,8。当输入为其他时数码管显示9。2.6 div模块div模块将实验箱上50Mhz脉冲信号分频为500hz。div模块源程序:LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.a

30、ll;ENTITY div IS port(clk:IN std_logic; clkout:OUT std_logic );end div;ARCHITECTURE one OF div IS BEGIN process(clk) variablet:integer range 0 to 100000; variable tmp:std_logic;begin if clk'event and clk='1' then ift>=99999 thencnt:=0;tmp:=not tmp;else t:=cnt+1;end if;end if;clkout<

31、;=tmp;end process;end one;div模块时序仿真波形:div将时钟信号分频,使频率减小。2.7 decode3_8模块 sel通过decode3_8模块选择数码管decode3_8模块源程序:LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY decode3_8 IS PORT(SEL:IN std_logic_vector(2 downto 0); Q:OUT std_logic_vector(7 downto 0);END decode3_8;ARCHITECT

32、URE a OF decode3_8 ISBEGIN Q<="11111110"when sel=0 else "11111101"when sel=1 else "11111011"when sel=2 else "11110111"when sel=3 else "11101111"when sel=4 else "11011111"when sel=5 else "10111111"when sel=6 else "01111111&

33、quot;when sel=7 else "11111111" END a;decode3_8模块时序仿真波形图:decode3_8模块选择数码管,当sel信号从0-7变化时,依次选择1-8八个数码管。第3章 总体电路图整体工作情况:3.1、模块连接:计费模块的clk、start、stop、pause和speed端连接输入,money12.0和run12.0连接转换模块的ascore12.0与bscore12.0;转换模块的daclk端连接输入,age3.0至bqian3.0连接动态扫描/译码/数码管显示模块的a13.0至b43.0;动态扫描/译码/数码管显示模块的C2.0

34、连接片选输出SEL2.0,DP端连接输出DP,D3.0连接数码管控制模块的D3.0;片选信号产生模块的CLK端与输入信号相连,并连接转换模块的DACLK端,A2.0连接片选输出SEL2.0,并与动态扫描/译码/数码管显示模块的C2.0相连;数码管控制模块的D3.0端与动态扫描/译码/数码管显示模块的D3.0端相连,Q6.0端连接八段数码管输出Q6.0。3.2、硬件连接:CLK接pin-28 输入为1hz的脉冲;daclk是实验箱上50Mhz固定晶振START、STOP、PAUSE、SPEED分别连接按键开关,用于控制车的启动、停止、暂停和速度;DP和Q6.0分别连接八段码显示单元的a到dp;W

35、7.0接数据线。3.3、结果分析:该电路的仿真波形图如下:clk为jifei模块时钟信号,daclk为时钟信号,stop为汽车停止输入端;start为汽车启动输入端;pause为汽车暂停输入端;speed为汽车速度输入端。DP表示小数点。该电路的总体管脚分配图:clk:pin-28;daclk:pin-153;start:pin-4;stop:pin-5;pause:pin-6; speed:pin-7;dp:pin-82;q6.0:pin-105;pin-104;pin-101;pin-100; pin-85;pin-84;pin-83;W7.0:pin-86;pin-87;pin-88;pin-93;pin-94;pin-95;pin-98;pin-99;vga3.0:pin-162;pin-161;pin-164;pin-163;第4章 硬件实现通过硬件下载,该电路可以

温馨提示

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

评论

0/150

提交评论