《基于CPLD出租车计费器的课程设计..doc》由会员分享,可在线阅读,更多相关《基于CPLD出租车计费器的课程设计..doc(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目录一总体设计思路11. 设计目的12系统原理框图1二功能模块设计21. 计费模块22. 数据转换模块23. 片选信号产生模块34. 显示模块35. 数码管控制模块46. 分频模块47. 数码管选择模块4三各个模块设计及仿真51计费模块52数据转换模块83片选信号产生模块114显示模块125数码管控制模块146分频模块157 数码管选择模块17四总体设计电路图18五 硬件实现19六心得体会21七程序清单22八参考文献32一总体设计思路1. 设计目的随着EDA技术的高速发展,电子系统的设计技术发生了深刻的变化,大规模可编程逻辑器件COLD/FPGA的出现,给设计人员带来了诸多方便,利用它进行产品
2、开发,不仅成本低,周期、可靠性高,而且具有完全的知识产权。随着社会的不断进步,人们生活水平的不断提高,出租车逐渐成为人们日常生活不可缺少的交通工具。而计价器作为出租车的一个重要组成部分,关系着出租车司机和乘客双方利益,起着重要的作用,因而出租车司机和乘客双方利益,起着重要的作用,因而出租车计价器的发展非常迅猛。2系统原理框图基于CPLD的出租车计费器的组成如图1所示。各部分主要功能包括:信号输入模块对车轮传感器的脉冲信号进行计数,并以高低电平模拟出租车启动、停止、暂停、加速按钮,具有输入信号作用;数据转换模块将计费模块输出的车费和路程换成4位的十进制数据;译码/动态扫描模块将路程与费用的数值译
3、码后用动态扫描的方式驱动数码管;数码管显示模块将公里和计费金额用4位LED数码管显示。图1.1 系统总体框图二功能模块设计1. 计费模块 此模块为计费模块(即总体结构中的信号输入模块),实现计费功能,计费标准为:按行驶里程计费,起步价为7.00元,并在车行3公里后按2.20元/km计费,当计数器达到或超过20元时,每公里加收50%的车费,即按3.30元/km计费。CLK、START、STOP、PAUSE、JS为输入信号,分别代表汽车的起动、停止、暂停和加速,CLK为扫描时钟,硬件实现时加入时钟信号,另有两个输出,即CHEFEI和LUC,分别代表车费和路程,当车处于行驶状态时,此模块会自动记录下
4、路程与车费状况并作为转换模块的输入。其模块生成图如下:图2.1 计费模块2. 数据转换模块此模块功能是将计费模块产生的车费与路程的模拟量转换成数字量并输出,它是一个模为10的加法计数器,可将计费模块输出的车费和路程转换成4位的十进制数。其中DACLK为时钟信号,ASCORE、BSCORE连接计费模块的CHEFEI和LUC,输出为2个4位的十进制数,可以分别表示路程和车费情况。当车运行于不同状况时,此模块会将不同的车费与路程状况转换为数字量并输出。其模块生成图如下:图2.2 数据转换模块3. 片选信号产生模块此模块功能是选择八段数码管按照设计要求进行正确的显示。其模块生成图如下:图2.3 片选信
5、号产生模块4. 显示模块此模块为显示模块中的动态扫描/译码/数码管显示模块,功能是将已转换好的数字量加载到两个4位七段数码管上并加以显示。C2.0为片选端,用来连接片选模块的片选输出端A2.0,A1、A2、A3、A4、B1、B2、B3、B4分别连接数据转换模块的八个转换输出端,因为设计要求路程和车费都要用2位小数点来表示,所以须设置一个控制小数点的变量,即程序中的DP端,D3.0连接数码管控制模块的输入端。其模块生成图如下:图2.4 显示模块5. 数码管控制模块 此模块功能是控制七段数码管对转换后的数字量进行显示,使其完成路程和车费的显示。其中D3.0连接动态扫描/译码/数码管显示模块的D3.
6、0端,Q6.0连接七段数码管,利用其控制特性在数码管上显示出车费和路程。其模块生成图如下:数码管控制模块6. 分频模块 div模块将实验箱上50Mhz脉冲信号分频为500hz。div生成模块图:图2.6 分频模块7. 数码管选择模块 sel通过decode3_8模块选择数码管decode3_8生成模块图: 数码管选择模块三各个模块设计及仿真1计费模块计费模块源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jfmk is port(clk,start,stop,pause,js
7、:in std_logic; chefei,luc:out integer range 0 to 8000);end jfmk;architecture one of jfmk isbegin process(clk,start,stop,pause,js) variable a,b:std_logic; variable aa:integer range 0 to 100; variable chf,lc:integer range 0 to 8000; variable num:integer range 0 to 9; begin if(clkevent and clk=1)then i
8、f(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 js=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 js=0 and pause=1)then lc:=lc+1; aa:=aa+1; end if; if(aa=100)then
9、a:=1; aa:=0; else a:=0; end if; if(lc300)then null; elsif(chf=2000 and a=1)then chf:=chf+330; end if; end if; chefei=chf; luc=lc; end process; end one;jifei模块的时序仿真图:图3.1 计费模块时序仿真图图3.2 计费模块时序仿真图时序仿真图分析: 图中的stop为汽车停止输入端,上升沿有效;start为汽车启动输入端,上升沿有效;pause为汽车暂停输入端,上升沿有效;js为汽车加速输入端,上升沿有效。CLK为时钟源信号;chefei为汽车
10、车费输出端,luc为汽车路程输出端。由图3.1可知:当stop,Start,pause,js全为高电平时路程按5的速度增加,起车车价为700.由图3.2可知,当路程增加到300时,车费变为920,以后路程每增加100,车费增加2202数据转换模块 x模块的源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity x is port(daclk:in std_logic; ascore,bscore:in integer range 0 to 8000; age,ashi,abai,aq
11、ian,bge,bshi,bbai,bqian:out std_logic_vector(3 downto 0);end x;architecture rt1 of x isbegin process(daclk,ascore) variable comb1:integer range 0 to 8000; variable comb1a,comb1b,comb1c,comb1d:std_logic_vector(3 downto 0); begin if (daclkevent and daclk=1)then if(comb1ascore)then if(comb1a=9 and comb
12、1b=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:=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;
13、 end if; else ashi=comb1b; age=comb1a; abai=comb1c; aqian=comb1d; comb1:=0; comb1a:=0000; comb1b:=0000; comb1c:=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(d
14、aclkevent and daclk=1)then if(comb2bscore)then if(comb2a=9 and comb2b=9 and comb2c=9)then comb2a:=0000; comb2b:=0000; comb2c:=0000; comb2d:=comb2d+1; comb2:=comb2+1; elsif(comb2a=9 and comb2b=9)then comb2a:=0000; comb2b:=0000; comb2:=comb2+1; comb2c:=comb2c+1; elsif(comb2a=9)then comb2a:=0000; comb2
15、b:=comb2b+1; comb2:=comb2+1; else comb2a:=comb2a+1; comb2:=comb2+1; end if; else bshi=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;图3.3 数据转换模块时序仿真图图3.4 数据转换模块时序仿真图图3.5 数据转换模块时序仿真图3片选信号产生模块se模块的源程序
16、如下: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(clkevent and clk=1)then if(b=111)then b:=000; els
17、e b:=b+1; end if; end if; ad=a1;dpd=a2;dpd=a3;dpd=a4;dpd=b1;dpd=b2;dpd=b3;dpd=b4;dpnull;end case;end process;end rtl;图3.7 显示模块时序仿真图由上图可知,输入信号C为3位片选信号其变化范围为0到7,输入信号c从0到7逐个变化时,输出d逐个输a1,a2,a3,a4,b1,b2,b3,b4的输入信号。5数码管控制模块di模块的源程序: library ieee;use ieee.std_logic_1164.all;entity di isport(d:in std_logic
18、_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 when0000=qqqqqqqqqq=99999 thencnt:=0;tmp:=not tmp;else cnt:=cnt+1;end if;end if;clkout=tmp;end process;end one;图3.10 分频模块时序仿真图7 数码管选择模块其源程序: LIBRARY ieee;use ieee.std_logic_1164.a
19、ll;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;ARCHITECTURE a OF decode3_8 ISBEGIN Q=100)then a:=1; aa:=0; else a:=0; end if; if(lc300)then null; elsif(chf=2000 and a=1)then chf:=chf+330; end if; end i
20、f; chefei=chf; luc=lc; end process; end one;数据转换模块的源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity x is 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 r
21、t1 of x isbegin process(daclk,ascore) variable comb1:integer range 0 to 8000; variable comb1a,comb1b,comb1c,comb1d:std_logic_vector(3 downto 0); begin if (daclkevent and daclk=1)then if(comb1ascore)then if(comb1a=9 and comb1b=9 and comb1c=9)then comb1a:=0000; comb1b:=0000; comb1c:=0000; comb1d:=comb
22、1d+1; comb1:=comb1+1; elsif(comb1a=9 and comb1b=9)then comb1a:=0000; comb1b:=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; else ashi=comb1b; age=comb1a; abai=comb1c; aqian=comb1d; comb1:=0; c
23、omb1a:=0000; comb1b:=0000; comb1c:=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(daclkevent and daclk=1)then if(comb2bscore)then if(comb2a=9 and comb2b=9 and comb2c=9)then comb2a:=0000; comb2b:=0000; comb2c:=0000; comb2d:=comb2d+1; comb2:=comb2+1; elsif(comb2a=9 and comb2b=9)then comb2a:=0000; comb2b:=0000; comb2:=comb2+1; comb2c:=comb2c+1; elsif(comb2a=9)then
限制150内