资源描述
设计内容与设计要求CPLD为复杂可编程逻辑器件,通过EDA技术对其进行编程,可将一个较复杂的数字系统集成于一个芯片中,制成专用集成电路芯片,并可随时在系统修改其逻辑功能。有关知识可参见相关教材或参考书。一设计内容(1) 实现计费功能,计费标准为:按行驶里程计费,起步价为9.00元,并在车行2Km后按2.50元/Km计费,当计费器达到或超过30元时,每公里加收60的车费,车停止不计费。(2) 现场模拟功能:能模拟汽车起动、停止、暂停以及加速等状态。(3) 按计动态扫描电路,将车费和路程显示出来,各有两位小数。二、设计要求:1、 设计思路清晰,给出整体设计框图;2、 在QUARTUSII设计各单元电路,完成其功能仿真和编译并生成低层模块;3、 在QUARTUSII中完成顶层设计并编译通过;4、 在QUARTUSII中完成设计下载并调试电路;5、写出设计报告;主要设计条件1. 提供EDA实验室;2. 提供EL实验箱和CPLD芯片;3. 提供ALTERA公司的QUARTUSII7.2设计软件。说明书格式1. 课程设计封面;2. 任务书;3. 说明书目录;4. 设计总体思路,基本原理和框图(顶层电路图);5. 单元电路设计(各次级模块电路图);6. 设计仿真;7. 编程下载;8. 总结与体会;9. 附录;10. 参考文献。进度安排星期一、二:下达设计任务书,介绍课题内容与要求;介绍QUARTUSII软件的使用;查找资料,确定总体设计方案和单元电路设计;星期三第二周星期三:上机设计电路,电路仿真,硬件下载;第二星期四、五:书写设计报告,打印相关图纸;答辩参考文献1. 康华光主编.电子技术基础(数字部分),高等教育出版社。2. 阎石主编. 电子技术基础(数字部分),清华大学出版社。3. 陈大钦主编,电子技术基础实验,高等教育出版社。4. 彭介华主编,电子技术课程设计指导,高等教育出版社。5. 张 原编著,可编程逻辑器件设计及应用,机械工业出版社。6.荀殿栋,徐志军编著,数字电路设计实用手册,电子工业出版社。7. QUARTUSII入门8.刘洪喜,陆颖编著. VHDL电路设计实用教程 清华大学出版社 目录1、课题名称.P6 1.1、课题名称.P6 1.2、问题描述.P62、出租车计费计费器系统设计.P6 2.1、系统总体结构.P6 2.2、顶层电路图.P7 2.3、单元模块设计.P8 2.4、主程序时序图.P113、系统仿真、综合、下载.P134、总结P145、附加P156、参考文献P221、课题名称1.1、课题名称 出租车计费器课程设计1.2、问题描述(1)实现计费功能,计费标准为:按行驶里程计费,起步价为9.00元,并在车行2Km后按2.50元/Km计费,当计费器达到或超过30元时,每公里加收60的车费,车停止不计费。(2)现场模拟功能:能模拟汽车起动、停止、暂停以及加速等状态。(3)按计动态扫描电路,将车费和路程显示出来,各有两位小数。2、出租车计费器系统设计2.1、系统总体结构基于CPLD的出租车计费器的组成如图1所示。各部分主要功能包括:信号输入模块对车轮传感器的脉冲信号进行计数,并以高低电平模拟出租车启动、停止、暂停、加速按钮,具有输入信号作用;数据转换模块将计费模块输出的车费和路程换成4位的十进制数据;译码/动态扫描模块将路程与费用的数值译码后用动态扫描的方式驱动数码管;数码管显示模块将公里和计费金额用4位LED数码管显示。动态扫描/译码/数码管显示模块片选信号产生模块数据转换模块数码管控制模块信号输入模块图1 系统总体框图2.2、顶层电路图图2 顶层电路图2.3、单元模块设计1.信号输入模块该模块主要实现计费功能和现场模拟功能。计费标准为:对车轮传感器传送的脉冲信号进行计数,按行驶里程计费,起步价为9.00元,并在车行驶2km后按2.50元/km计费,当计费器达到或超过30元时,每公里加收60%的车费,车停止不计费。并以高低电平模拟出租车启动、停止、暂停、加速按钮,具有输入信号的作用。该模块的时序仿真图如图3、图4、图5所示。图中的stop下降沿到来时系统不计费,车费为“0”,路程为“0”;start下降沿到来时系统开始计费,起步价为9.00元,在车行驶2km后按2.50元/km计费,当计费器达到或超过30元时,每公里加收60% ,即按4.00元/km的车费计费。图3 输入信号模块图4 输入信号模块(起始段)图5 输入信号模块(收费段)2、数据转换模块数据转换模块可将计费模块输出的车费和路程转换成4位的十进制数。当累加大于9时,对其进行累加和调整。转换模块的时序仿真图如图6、图7所示。图中分别用age,ashi,abai,aqian,bge,bshi,bbai,bqian表示车费和路程的个十百千为。其中ascore和bscore分别表示信号输入模块的输出车费和路程。图6 转换模块(1)图7 转换模块(2)3、显示模块显示模块是由七段LED数码管译码和动态扫描显示两部分组成。须设置一个控制小数点的变量,即程序中的dp。这段程序所示的是在数码管的第二、第六个后面显示小数点,实现了路程和车费都用了两位小数点表示功能。数码管控制及译码显示模块将十进制的输入信号用七段数码管显示。由七段发光二极管组成数码显示器,利用字段的不同组合,可分别显示09十个数字。本设计中,要求输出的段信号为低电平有效。七段数码管显示模块的时序如图8、图9所示。图8 显示模块(1)图9 显示模块(2)2.4、主程序时序图描述子程序之间的联系,包含元件调用声明语句和元件例化语句。出租车计费器顶层设计描述,分别调用了各子程序,并定义了10各信号(x1x2,v1v8)作为内部的连接线。主程序时序图如图10、图11所示。图10 主程序时序图(1)图11 主程序时序图(2)3、系统仿真、综合、下载仿真是EDA技术的重要组成部分,也是对设计的电路进行功能和性能测试的有效手段。EDA工具提供了强大且与电路实时行为相吻合的精确硬件系统测试工具。在建立了波形文件、输入信号节点、波形参数、加输入信号激励电平并存盘后,选择菜单“start simulation”,进行仿真运算,完成之后就可以看到时序波形图。最终的电路设计完成后,若总体电路编译无错,且时序仿真成功,可以进行硬件测试。为了能进行硬件测试,应将其输入输出信号锁定在芯片确定的引脚上,编译后下载。之前应该将试验箱上的线接好。打开电源,数码管有正确的数字显示,操作运行试验结果完全符合要求。查看报告文件可得到器件引脚的利用情况和器件内部使用情况,通过更换适当的器件使其资源配置达到最优。4、总结出租车计费器计数脉冲来自车轮转速传感器,脉冲经器件内部整形后送至计数器;动态扫描脉冲由外围电路给出,将单位脉冲看做行驶的单位公里数,并在此基础上进行计费与显示。在这两周的PLD课程设计里,对EDA常用软件Quartus II有了更好的了解:使用Quartus II,编程、绘图、仿真。大致掌握了出租车计费器的设计步骤。整个设计过程,主要难点在于主程序的编写和下载调试电路。其中主程序中连线的编写比较复杂,需要条理清晰,最好统一编号(程序中以x1x2,v1v8)。在运行中多次出现错误,主要是由于不够仔细,细心检查可以避免。调试过程开始不顺利,检查后发现引脚和信号不对应,更改过后调试成功。还需要注意的是显示模块部分。用d,q分别表示片选信号和数码管显示信号。结果重要,过程更是我们学习的宝贵经验。课程设计不仅是学习一门课,更可以锻炼我们的实践能力,动手操作能力,和解决问题的能力。能够将课堂上所学的知识灵活、巧妙的运用到实践操作上是一次很好的体验,和机会。不仅锻炼路我们的动手能力,而且加深了对课本的理解和弥补了课本上所不能涉及到的东西。所以在对待每一次的课程设计时我都很认真,也终于通过自己的努力终于完成了此次的课程设计。非常感谢在此次PLD课程设计中帮助过我的老师和同学,我将继续努力下去。5、附件library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity czc is port(clk0,start0,stop0,pause0,js0,daclk0:in std_logic; dp0:out std_logic; q0:out std_logic_vector(6 downto 0); d0:out std_logic_vector(7 downto 0);end entity czc;architecture z1 of czc is component mk1 port(clk,start,stop,pause,js:in std_logic; chefei,luc:out integer range 0 to 8000); end component mk1; component mk2 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 component mk2; component mk3 port(clk:in std_logic; a1,a2,a3,a4,b1,b2,b3,b4:in std_logic_vector(3 downto 0); dp:out std_logic; d:out std_logic_vector(7 downto 0); q:out std_logic_vector(6 downto 0); end component mk3;signal x1,x2:integer range 0 to 8000;signal v1,v2,v3,v4,v5,v6,v7,v8:std_logic_vector(3 downto 0);begin u1:mk1 port map(clk=clk0,start=start0,stop=stop0,pause=pause0,js=js0,chefei=x1,luc=x2); u2:mk2 port map(daclk=daclk0,ascore=x1,bscore=x2,age=v1,ashi=v2,abai=v3,aqian=v4,bge=v5,bshi=v6,bbai=v7,bqian=v8); u3:mk3 port map(clk=daclk0,a1=v1,a2=v2,a3=v3,a4=v4,b1=v5,b2=v6,b3=v7,b4=v8,dp=dp0,d=d0,q=q0);end architecture z1;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity mk1 isport(clk,start,stop,pause,js:in std_logic; chefei,luc:out integer range 0 to 8000);end mk1;architecture rt1 of mk1 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 10; begin if(clkevent 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:=900; lc:=0; elsif(start=1and js=1and pause=1)then if(b=0)then num:=num+1; end if; if(num=10)then lc:=lc+5; num:=0; aa:=aa+5; end if; elsif(start=1and js=0and pause=1)then lc:=lc+1; aa:=aa+1; end if; if(aa=100)then a:=1; aa:=0; else a:=0; end if; if(lc200)then null; elsif(chf=3000 and a=1)then chf:=chf+400; end if; end if; chefei=chf; luc=lc; end process;end rt1;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity mk2 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 mk2;architecture rt1 of mk2 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:=comb1d+1; comb1:=comb1+1; elsif(comb1a=9 and comb1b=9)then comb1a:=0000; comb1b:=0000; comb1c:=comb1c+1; comb1:=comb1+1; elsif(comb1a=9)then comb1a:=0000; comb1b:=comb1b+1; comb1:=comb1+1; else comb1a:=comb1a+1; comb1:=comb1+1; end if; else age=comb1a; ashi=comb1b; abai=comb1c; aqian=comb1d; comb1a:=0000; comb1b:=0000; comb1c:=0000; comb1d:=0000; comb1:=0; 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; comb2c:=comb2c+1; comb2:=comb2+1; elsif(comb2a=9)then comb2a:=0000; comb2b:=comb2b+1; comb2:=comb2+1; else comb2a:=comb2a+1; comb2:=comb2+1; end if; else bge=comb2a; bshi=comb2b; bbai=comb2c; bqian=comb2d; comb2a:=0000; comb2b:=0000; comb2c:=0000; comb2d:=0000; comb2:=0; end if; end if; end process;end rt1;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity mk3 is port(clk:in std_logic; a1,a2,a3,a4,b1,b2,b3,b4:in std_logic_vector(3 downto 0); dp:out std_logic; d:out std_logic_vector(7 downto 0); q:out std_logic_vector(6 downto 0);end entity;architecture one of mk3 issignal cnt8:std_logic_vector(2 downto 0); signal a:std_logic_vector(3 downto 0);begin p1:process(clk) begin if clkevent and clk=1 then cnt8d=10000000;a=b4;dpd=01000000;a=b3;dpd=00100000;a=b2;dpd=00010000;a=b1;dpd=00001000;a=a4;dpd=00000100;a=a3;dpd=00000010;a=a2;dpd=00000001;a=a1;dpqqqqqqqqqqnull; end case;end process;end architecture;6、参考文献1. 康华光主编.电子技术基础(数字部分),高等教育出版社。2. 阎石主编. 电子技术基础(数字部分),清华大学出版社。3. 陈大钦主编,电子技术基础实验,高等教育出版社。4. 彭介华主编,电子技术课程设计指导,高等教育出版社。5. 张 原编著,可编程逻辑器件设计及应用,机械工业出版社。6.荀殿栋,徐志军编著,数字电路设计实用手册,电子工业出版社。7. QUARTUSII入门8.刘洪喜,陆颖编著. VHDL电路设计实用教程 清华大学出版社
展开阅读全文