基于CPLD的出租车计费器-嵌入式课程设计-精品版(共27页).doc
精选优质文档-倾情为你奉上 设计内容与设计要求CPLD为复杂可编程逻辑器件,通过EDA技术对其进行编程,可将一个较复杂的数字系统集成于一个芯片中,制成专用集成电路芯片,并可随时在系统修改其逻辑功能。有关知识可参见相关教材或参考书。一设计内容(1) 实现计费功能,计费标准为:按行驶里程计费,起步价为6.00元,并在车行3Km后按2.00元/Km计费,当计费器达到或超过20元时,每公里加收50的车费,车停止不计费。(2) 现场模拟功能:能模拟汽车起动、停止、暂停以及加速等状态。(3) 按计动态扫描电路,将车费和路程显示出来,各有两位小数。二、设计要求:1、 设计思路清晰,给出整体设计框图;2、 设计各单元电路,完成其功能仿真和编译并生成低层模块;3、 完成顶层设计并编译通过;4、 完成设计下载并调试电路;5、 写出设计报告;专心-专注-专业主要设计条件1. 提供EDA实验室;2. 提供EL实验箱和CPLD芯片;3. 提供设计软件说明书格式1. 课程设计封面;2. 任务书;3. 说明书目录;4. 设计总体思路,基本原理和框图(顶层电路图);5. 单元电路设计(各次级模块电路图);6. 设计仿真;7. 编程下载;8. 总结与体会;9. 附录;10. 参考文献。进度安排星期一、二:下达设计任务书,介绍课题内容与要求;查找资料,确定总体设计方案和单元电路设计;星期三第二周星期一:单元电路设计与仿真,硬件下载;第二周星期二、三:硬件下载;第二星期四、五:书写设计报告,打印相关图纸;答辩参考文献1. 康华光主编.电子技术基础(数字部分),高等教育出版社。2. 阎石主编. 电子技术基础(数字部分),清华大学出版社。3. 陈大钦主编,电子技术基础实验,高等教育出版社。4. 彭介华主编,电子技术课程设计指导,高等教育出版社。5. 张 原编著,可编程逻辑器件设计及应用,机械工业出版社。6.荀殿栋,徐志军编著,数字电路设计实用手册,电子工业出版社。7. 刘洪喜,陆颖编著. VHDL电路设计实用教程 清华大学出版社 目录第一章 引言1.1 课题背景几年来,出租车行业发展迅速,全国大大小小的出租车公司已有数千家,基于出租车的附属品市场前景也是十分广阔。传统的出租车计费器大多是由单片机实现的,发展使用也是十几年了,在稳定性、成本、制造工艺、使用习惯等方面都具有一些优势,但在运营过程中系统不是很稳定,容易造成死机的现象。传统计费器的不足点:1. 产品更新周期长:传统的计费器利用微控器,大部分功能依靠单片机实现。但单片机的程序不通用,不同芯片指令集不相同,因此设计研发比较困难,周期很长。2. 计价方式不灵活:每次计价标准修改都需要重新烧录芯片,使得每次价格调整都成为很费力的事情,很难适应社会发展的需要。传统出租车计费器多数由单片机实现,升级繁琐,成本高。随着EDA技术的高速发展,电子系统的设计技术和工具发生了深刻的变化,大规模可编程逻辑器件CPLDFPGA的出现,给设计人员带来了诸多方便。利用它进行产品开发,不仅可以解决电子系统小型化、低功耗、高可靠性等问题,还具有成本低、开发周期短、开发软件投入少的优点,也能满足对小批量、多品种的产品需求。使用EDA设计出租车计费器,其部分功能还能由软件实现,减少了硬件的压力,使得系统结构简单、调试方便且成本低廉。所以基于CPLD的出租车计费器已成首选。1.2 本文的主要工作面对出租车行业日益迅猛的发展趋势及对计费器更高的灵活性的要求,本设计希望尝试一些新的方法来予以解决。(1).利用CPLD取代传统微控器 随着CPLD等数字可编程器件的出现解决了传统电子设计不能完成的任务,利用FPGA来实现出租车计费器,可行性很高,而且电路简单,大大减少外围器件,可以用软件完全仿真,灵活度高,可以设计一些复杂的系统,而且编好的系统可以在不同的FPGA或CPLD芯片上通用。CPLD能完成任何数字器件的功能,使用CPLD来开发数字电路,可以大大缩短设计时间,减少PCB面积,提高系统的可靠性。同时由于CPLD的功能完全取决于VHDL语言编写的程序,不拘泥于某种芯片的特殊指令,更加提高了产品的更新换代能力。 (2).完成基于CPLD的出租车计费器的设计 出租车计费器系统是VHDL语言的实际应用,利用VHDL语言设计出来的出租车计费器系统将实现计程模块、计时模块以及动态扫描模块等设计方法与技巧。计程模块将用计数器来完成,计数器对脉冲数计数,然后提供给程序数据。通过不同的信号,然后用比较器可以让我们确定出租车是在车行计程还是车停计时。再将数据传输到计费模块,通过多种条件判定,最后确定输出值,然后相加确定最后的费用,并显示出来。第二章 出租车计费器的设计2.1 技术要求(1)掌握较复杂逻辑的设计、调试。(2)进一步掌握用Quartus II7.0。(3)掌握用Max+pulsII软件的原理图输入的设计方法。2.2 功能要求 基本功能:(1)按行驶里程计费,起步价为6.00元,并在车行3公里后按2.00元/km计费,当计数器达到或超过20元时,每公里加收50%的车费,即按3.00元/km计费。(2)实现模拟功能:能模拟汽车启动、停止。(3)设计动态扫描电路:将车费、里程、等待时间动态的显示出来。(4)用VHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。(5)各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正确。第三章 方案设计及原理框图3.1 总体框架设计系统流程介绍:分析系统设计要求不难得知,整个出租车计费系统按功能主要分为速度模块、计程模块、计时模块和计费模块,其系统结构图如图3-1所示。图3-1出租车计费器系统结构图各模块的功能:(1)速度模块:通过对速度信号sp的判断,决定变量kinside的值。Kinside即是行进100m所需要的时钟周期数,然后每行进100m,则产生一个脉冲clkout。(2)计程模块:由于一个clkout信号代表行进100m,故通过对clkout计数,可以获得共行进的距离kmcount。(3)计费模块:由两个进程组成,其中一个进程根据条件对enable和price赋值:当记录的距离达到3公里后enable变为1,开始进行每公里收费,当总费用大于20元后,则单价price由原来的2元每公里变成3元每公里;第二个进程在每个时钟周期判断timeout和clkout的值。当其为1时,则在总费用上加上相应的费用费。 (4)译码模块:实现将车费计数模块、等待状态模块和里程计数模块输出的BCD码转换成七段码输出。3.2出租车计费器主要模块设计从上述设计方案中我们可以大致得到出租车计费器的系统框图,如图3-2所示。其中clk为输入时钟脉冲,时钟上升沿有效;reset为复位信号,start为开始计费信号,stop为停止计费信号,均高电平有效;SP2.0表示出租车状态(停止或不同形式速度);kmcnt和count信号则分别输出出租车行驶的里程和花费。 图3-2 出租车计费器系统框图第四章 各单元模块设计与仿真本系统采用层次化、模块化的设计方法,设计顺序为自下向上。首先实现系统框图中的各子模块,然后由顶层模块调用各子模块来完成整个系统。4.1 速度模块速度模块首先根据start信号判断是否开始计费,然后根据输入的速度档位sp2.0的判断,确定行驶100m所需要的时钟数,每前进100m,输出一个clkout信号。同时由cnt对clk进行计数,当cnt等于kinside时,把clkout信号置1,cnt清0。其模块框图如图3-3。图4-1 速度模块框图4.1.1 速度模块VHDL程序library ieee; use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity speed isport( clk :in std_logic;reset:in std_logic;start:in std_logic;stop :in std_logic;sp :in std_logic_vector(2 downto 0);clkout:out std_logic);end speed;architecture rtl of speed isbeginprocess(clk,reset,start,stop,sp) type state_type is(s0,s1); variable s_state:state_type; variable cnt:integer range 0 to 28;variable kinside:integer range 0 to 30;begincase sp is when"000"=>kinside:=0; when"001"=>kinside:=28; when"010"=>kinside:=24; when"011"=>kinside:=20;when"100"=>kinside:=16;when"101"=>kinside:=12;when"110"=>kinside:=8;when"111"=>kinside:=4;end case;if reset='1'thens_state:=s0;elsif clk'event and clk='1'thencase s_state iswhen s0=>cnt:=0;clkout<='0'if start='1'thens_state:=s1;elses_state:=s0;end if;when s1=>clkout<='0'if stop='1'thens_state:=s0;elsif sp="000"thens_state:=s1;elsif cnt=kinside thencnt:=0;clkout<='1's_state:=s1;elsecnt:=cnt+1;s_state:=s1;end if;end case;end if;end process;end rtl;4.1.2 速度模块仿真结果速度模块的仿真波形图如图4-2所示。该模块根据出租车所处的运行状态和不同的形式速度,对相应数目的时钟周期进行计数,车每行驶100m时输出信号clkout输出高电平。图4-2 速度模块仿真图4.2 计程模块此模块主要用于记录行进的距离,其模块框图如图3-4所示。通过对clkout信号的计数,可以计算行驶的距离kmcount。一个clkout脉冲相当于行进100m所以只要记录clkout的脉冲数目即可确定共行进的距离。Kmcount1为十分位,kmcount2为个位,kmcount3为十位,分别为十进制数。图4-3计程模块框图4.2.1 计程模块VHDL程序library ieee; use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity kilometers isport(clkout,reset:in std_logic;kmcnt1:out std_logic_vector(3 downto 0);kmcnt2:out std_logic_vector(3 downto 0);kmcnt3:out std_logic_vector(3 downto 0);end kilometers;architecture rtl of kilometers isbeginprocess(clkout,reset)variablekm_reg:std_logic_vector(11 downto 0);beginif reset='1'thenkm_reg:="0"elsif clkout'event and clkout='1'then if km_reg(11 downto 8)="1001"then km_reg(11 downto 8):="0000" elsif km_reg(7 downto 4)="1001" then km_reg(11 downto 8):=km_reg(11 downto 8)+"0001"km_reg(7 downto 4):="0000" elsif km_reg(3 downto 0)="1001" then km_reg(3 downto 0):="0000" km_reg(7 downto 4):=km_reg(7 downto 4)+"0001" else km_reg(3 downto 0):=km_reg(3 downto 0)+"0001" end if;end if;kmcnt1<=km_reg(3 downto 0);kmcnt2<=km_reg(7 downto 4);kmcnt3<=km_reg(11 downto 8);end process;end rtl;4.2.2 计程模块仿真结果计程模块的仿真波形如图5-3所示。图中,当reset信号有效时,系统复位清零;否则,对输入信号clkout进行十进制计数。图4-4计程模块仿真波形图4.3 计费模块计费模块如图4-5所示,可分为kmmoney1和kmmoney2两个进程。Kmmoney1用于产生enable和price信号。当记录距离达到3km后,enable信号为1,开始进行每公里收费。当总费用大于20元后,单价price由原来的2元变成3元,用作计时收费。通过对sp信号的判断,当sp=0,开始记录时间。当时间达到足够长时,产生timecount脉冲,并重新计时。Kmmoney2用于判断timecount和clkout的值,当其为1时,总费用加1。最终输出为总费用。图4-5 计费模块框图4.3.1 计费模块VHDL的程序library ieee; use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity kmmoney isport( clk :in std_logic;reset :in std_logic;timecount:in std_logic;clkout :in std_logic;kmcnt2 :in std_logic_vector(3 downto 0);kmcnt3 :in std_logic_vector(3 downto 0);count1 :out std_logic_vector(3 downto 0);count2 :out std_logic_vector(3 downto 0);count3 :out std_logic_vector(3 downto 0);end kmmoney;architecture rtl of kmmoney issignal cash:std_logic_vector(11 downto 0);signal price:std_logic_vector(3 downto 0);signal enable:std_logic;beginkmmoney1:PROCESS(cash,kmcnt2,kmcnt3)beginif cash>="0"thenprice<="0011"elseprice<="0010"end if;if kmcnt2>="0001" and kmcnt3>="0010" thenenable<='1'elseenable<='0'end if;end process;kmmoney2:process(reset,clkout,clk,enable,price,kmcnt2)variable reg2:std_logic_vector(11 downto 0);variable clkout_cnt:integer range 0 to 10;beginifreset='1'thencash<="0"elsif clk'event and clk='1'thenif timecount='1' thenreg2:=cash;if reg2(3 downto 0)+"0001">"1001"thenreg2(7 downto 0):=reg2(7 downto 0)+""if reg2(7 downto 4)>"1001"thencash<=reg2+"0"elsecash<=reg2;end if;elsecash<=reg2+"0001"end if; elsif clkout='1' and enable='1'thenif clkout_cnt=9 thenclkout_cnt:=0;reg2:=cash;if "0000"®2(3 downto 0)+price>""thenreg2(7 downto 0):=reg2(7 downto 0)+""+price;if reg2(7 downto 4)>"1001"thencash<=reg2+"0"elsecash<=reg2;end if;elsecash<=reg2+price;end if;elseclkout_cnt:=clkout_cnt+1;end if;end if; end if;end process;count1<=cash(3 downto 0);count2<=cash(7 downto 4);count3<=cash(11 downto 8);end rtl;4.3.2 计费模块仿真结果计费模块的仿真波形图如图4-6所示。当reset信号有效时,系统复位清零;否则,当计时计费信号timecount和计程计费信号clkout为高电平时,按照一定计费规则进行计费。图4-6 计费模块仿真功能图4.4 数码管显示模块图4-7 数码管显示模块图4.4.1 显示模块VHDL程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DISPLAY IS PORT( DOUT1:IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT3:IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT11:IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT22:IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT33:IN STD_LOGIC_VECTOR(3 DOWNTO 0); CLKMS:IN STD_LOGIC; DUANMA:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); WEIMA:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); END DISPLAY;ARCHITECTURE RT1 OF DISPLAY ISSIGNAL count:INTEGER:=0; BEGIN COM1:PROCESS(CLKMS) BEGIN IF CLKMS'EVENT AND CLKMS='1' THEN IF count=5 then count<=0; ELSE count<=count+1; END IF; END IF; END PROCESS;COM2:PROCESS(count,DOUT1,DOUT2,DOUT3,DOUT11,DOUT22,DOUT33) BEGIN IF count=0 then WEIMA<="" CASE DOUT1 IS WHEN "0000"=>DUANMA<="" WHEN "0001"=>DUANMA<="" WHEN "0010"=>DUANMA<="" WHEN "0011"=>DUANMA<="" WHEN "0100"=>DUANMA<="" WHEN "0101"=>DUANMA<="" WHEN "0110"=>DUANMA<="" WHEN "0111"=>DUANMA<="" WHEN "1000"=>DUANMA<="" WHEN "1001"=>DUANMA<="" WHEN OTHERS=>NULL; END CASE; ELSIF count=1 then WEIMA<="" CASE DOUT2 IS WHEN "0000"=>DUANMA<="" WHEN "0001"=>DUANMA<="" WHEN "0010"=>DUANMA<="" WHEN "0011"=>DUANMA<="" WHEN "0100"=>DUANMA<="" WHEN "0101"=>DUANMA<="" WHEN "0110"=>DUANMA<="" WHEN "0111"=>DUANMA<="" WHEN "1000"=>DUANMA<="" WHEN "1001"=>DUANMA<="" WHEN OTHERS=>NULL; END CASE; ELSIF count=2 then WEIMA<="" CASE DOUT3 IS WHEN "0000"=>DUANMA<="" WHEN "0001"=>DUANMA<="" WHEN "0010"=>DUANMA<="" WHEN "0011"=>DUANMA<="" WHEN "0100"=>DUANMA<="" WHEN "0101"=>DUANMA<="" WHEN "0110"=>DUANMA<="" WHEN "0111"=>DUANMA<="" WHEN "1000"=>DUANMA<="" WHEN "1001"=>DUANMA<="" WHEN OTHERS=>NULL; END CASE; ELSIF count=3 then WEIMA<="" CASE DOUT11 IS WHEN "0000"=>DUANMA<="" WHEN "0001"=>DUANMA<="" WHEN "0010"=>DUANMA<="" WHEN "0011"=>DUANMA<="" WHEN "0100"=>DUANMA<="" WHEN "0101"=>DUANMA<="" WHEN "0110"=>DUANMA<="" WHEN "0111"=>DUANMA<="" WHEN "1000"=>DUANMA<="" WHEN "1001"=>DUANMA<="" WHEN OTHERS=>NULL; END CASE; ELSIF count=4 then WEIMA<="" CASE DOUT22 IS WHEN "0000"=>DUANMA<="" WHEN "0001"=>DUANMA<="" WHEN "0010"=>DUANMA<="" WHEN "0011"=>DUANMA<="" WHEN "0100"=>DUANMA<="" WHEN "0101"=>DUANMA<="" WHEN "0110"=>DUANMA<="" WHEN "0111"=>DUANMA<="" WHEN "1000"=>DUANMA<="" WHEN "1001"=>DUANMA<="" WHEN OTHERS=>NULL; END CASE; ELSE WEIMA<="" CASE DOUT33 IS WHEN "0000"=>DUANMA<="" WHEN "0001"=>DUANMA<="" WHEN "0010"=>DUANMA<="" WHEN "0011"=>DUANMA<="" WHEN "0100"=>DUANMA<="" WHEN "0101"=>DUANMA<="" WHEN "0110"=>DUANMA<="" WHEN "0111"=>DUANMA<="" WHEN "1000"=>DUANMA<="" WHEN "1001"=>DUANMA<="" WHEN OTHERS=>NULL; END CASE; END IF; END PROCESS; END RT1; 4.4.2 显示模块仿真结果图4-8 数码管显示模块仿真图综上所述,本设计的出租车计费器完全符合系统设计的要求,实现了出租车计费器所需的各项基本功能。第五章 硬件调试5.1 设计测试利用Quartus9.0对所设计出租车计费器的VHDL代码进行了仿真,并在Cyclone型可编程数字实现系统上实现了该控制。该数字实现系统分成两部分,一是FPGA的下载板,它主要包括所使用的芯片、RS-232接头、接脚转换插槽等;另一部分是I/O实验板,它主要包括显示、脉冲输出等。出租车计费器的各部分利用数字实验系统所附的RS-232连接线将计算机中的VHDL代码设计的内容烧录到该实验系统的EPC2C35F672C8芯片中进行测试,测试结果基本实现了总费用=起费用+(里程-3km)×里程单价的出租车计费模式。5.2 硬件调试图接通电源,启动硬件,其起步价为6元。图5-1 开始计费路程超过3公里时,每公里计费2元。图5-2 路程超过3公里当计费器达到或超过20元时,每公里加收50的车费,即每公里3元。图5-3 费用超过20元心得体会经过将近三周的课程设计在今天终于落下了一个句号。在这三周中,我们小组遇到过许许多多的问题和困难,但是在大家的努力下把这些困难都一一克服了,在历经重重困难后终于做好了本次课程设计,这对我们来说就是一种进步,一种成长。在开始做课题的时候,我们几个什么都不会,不会仿真,不会接线,甚至软件都不会,但是我们没有放弃,不会就先看书,我们从图书馆借了3本相关的书,从最简单的看起,慢慢学,一点点积累,慢慢的我们学会了做仿真图,学会了用软件,学会了接下,从这件事悟出了道理,就是你只要去学,就一定可以成功。 从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,因为在以后工作中也是,只有把理论和实际相结合,才能的实现自我价值。做了这个课程设计,觉得自己多少懂了些,明白了些,对自己自信了些,这对以后工作是很有用的。所以只要你认真的去学习和思考,即使起点低了一点也没什么关系,做完总是有收获的,相信自己。 参考文献1. 康华光主编.电子技术基础(数字部分),高等教育出版社。2. 阎石主编. 电子技术基础(数字部分),清华大学出版社。3. 陈大钦主编,电子技术基础实验,高等教育出版社。4. 彭介华主编,电子技术课程设计指导,高等教育出版社。5. 张 原编著,可编程逻辑器件设计及应用,机械工业出版社。6.荀殿栋,徐志军编著,数字电路设计实用手册,电子工业出版社。7. 刘洪喜,陆颖编著. VHDL电路设计实用教程 清华大学出版社 附录 整体电路图