if(comb2a=9andcomb2b=9andcomb2c=9)then
comb2a:
="0000";
comb2b:
="0000";
comb2c:
="0000";
comb2d:
=comb2d+1;
comb2:
=comb2+1;
elsif(comb2a=9andcomb2b=9)then
comb2a:
="0000";
comb2b:
="0000";
comb2:
=comb2+1;
comb2c:
=comb2c+1;
elsif(comb2a=9)then
comb2a:
="0000";
comb2b:
=comb2b+1;
comb2:
=comb2+1;
else
comb2a:
=comb2a+1;
comb2:
=comb2+1;
endif;
else
bshi<=comb2b;
bge<=comb2a;
bbai<=comb2c;
bqian<=comb2d;
comb2:
=0;
comb2a:
="0000";
comb2b:
="0000";
comb2c:
="0000";
comb2d:
="0000";
endif;
endif;
endprocess;
endrt1;
图3.3数据转换模块时序仿真图
图3.4数据转换模块时序仿真图
图3.5数据转换模块时序仿真图
3.片选信号产生模块
se模块的源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityselis
port(clk:
instd_logic;
a:
outstd_logic_vector(2downto0));
endsel;
architecturert1ofselis
begin
process(clk)
variableb:
std_logic_vector(2downto0);
begin
if(clk'eventandclk='1')then
if(b="111")then
b:
="000";
else
b:
=b+1;
endif;
endif;
a<=b;
endprocess;
endrt1;
图3.6片选信号产生模块时序仿真图
由图可以看出,当CLK加入时钟信号时,a从000到111逐个变化,该模块可将模拟信号进行片选并有对应的数码管进行显示。
4.显示模块
xxx1模块的源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityxxxlis
port(c:
instd_logic_vector(2downto0);
dp:
outstd_logic;
a1,a2,a3,a4,b1,b2,b3,b4:
instd_logic_vector(3downto0);
d:
outstd_logic_vector(3downto0));
endxxxl;
architecturertlofxxxlis
begin
process(c,a1,a2,a3,a4,b1,b2,b3,b4)
variablecomb:
std_logic_vector(2downto0);
begin
comb:
=c;
casecombis
when"000"=>d<=a1;
dp<='0';
when"001"=>d<=a2;
dp<='0';
when"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';
whenothers=>null;
endcase;
endprocess;
endrtl;
图3.7显示模块时序仿真图
由上图可知,输入信号C为3位片选信号其变化范围为0到7,输入信号c从0到7逐个变化时,输出d逐个输a1,a2,a3,a4,b1,b2,b3,b4的输入信号。
5.数码管控制模块
di模块的源程序:
libraryieee;
useieee.std_logic_1164.all;
entitydiis
port(d:
instd_logic_vector(3downto0);
q:
outstd_logic_vector(6downto0));
enddi;
architecturertlofdiis
begin
process(d)
begin
casedis
when"0000"=>q<="0111111";
when"0001"=>q<="0000110";
when"0010"=>q<="1011011";
when"0011"=>q<="1001111";
when"0100"=>q<="1100110";
when"0101"=>q<="1101101";
when"0110"=>q<="1111101";
when"0111"=>q<="0100111";
when"1000"=>q<="1111111";
whenothers=>q<="1101111";
endcase;
endprocess;
endrtl;
图3.8数码管控制模块时序仿真图
图3.9数码管控制模块时序仿真图
从波形图中可看出,此模块可控制数码管完成对数字量的显示。
当输入为0000-1000时数码管分别显示0,1,2,3,4,5,6,7,8。
当输入为其他时数码管显示9。
6.分频模块
div模块源程序:
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYdivIS
port(clk:
INstd_logic;
clkout:
OUTstd_logic
);
enddiv;
ARCHITECTUREoneOFdivIS
BEGIN
process(clk)
variablecnt:
integerrange0to100000;
variabletmp:
std_logic;
begin
ifclk'eventandclk='1'then
ifcnt>=99999then
cnt:
=0;
tmp:
=nottmp;
else
cnt:
=cnt+1;
endif;
endif;
clkout<=tmp;
endprocess;
endone;
图3.10分频模块时序仿真图
7.数码管选择模块
其源程序:
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYdecode3_8IS
PORT(SEL:
INstd_logic_vector(2downto0);
Q:
OUTstd_logic_vector(7downto0));
ENDdecode3_8;
ARCHITECTUREaOFdecode3_8IS
BEGIN
Q<="11111110"whensel=0else
"11111101"whensel=1else
"11111011"whensel=2else
"11110111"whensel=3else
"11101111"whensel=4else
"11011111"whensel=5else
"10111111"whensel=6else
"01111111"whensel=7else
"11111111";
ENDa;
图3.11数码管选择模块时序仿真图
四.总体设计电路图
图4.1总原理图
五.硬件实现
通过硬件下载,该电路可以完成硬件实现,芯片管脚定义可以直接用编辑.pin文件。
完成管脚定义后选择器件,编译后生成.sof、.pof文件。
选择sof文件进行下载。
通过对每一模块的仿真和下载,可以实现各个模块的逻辑功能,验证了各个模块的正确性。
在出租车计费系统的5个模块中,重点在于jifei模块,x(转化)模块,显示模块。
jifei模块主要有汽车的启动、停止、暂停、加速按键;转化模块主要是把车费和路程转化为4位十进制;显示模块是将车费和路程显示出来。
各模块完成后,在将它们组合成完整的出租车系统,在设计过程中还需要改进的是控制系统的纠错功能。
出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。
车暂时停止不计费,车费保持不变。
若停止则车费清零,等待下一次计费的开始。
出租车计费系统的设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及PLD器件速度快,使用方便,便于修改等特点,本设计在实用方面具有一定的价值。
实验表明:
该计费器实现了按预置参数自动计费(最大计费金额为99.99元)、自动计程(最大计程公里数为99.99km)等功能;能够实现起步价、每公里收费、车型及加费里程的参数预置(如:
起步价7.00元;3km后,2.20元/km;计费超过20.00元,每公里加收50%的车费等),且预置参数可调范围广。
由于采用CPLD大规模可编程逻辑器件,整机功耗小、抗干扰能力强、系统稳定、工作可靠、升级方便。
其调试结果如下图所示:
图5.1调试结果
由图5.1可知,起步价为7元。
图5.2调试结果
由图5.2可知,当每增加半公里时,价格增加1.2元
六.心得体会
短短两周的EDA课程设计已经接近尾声了,我们从挑选课设题目,查阅资料,到研究出总体设计,详细设计,然后分工合作,再到最后的编程上机调试,修改程序,完善程序,收获颇多。
出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动,停止、暂停等功能,并设计动态扫描电路显示车费数目。
车暂停时停止计费。
若停止清零,等待下一次计费的开始。
出租车计费系统设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及PLD器件速度快,使用方便,便于修改等特点。
本设计在使用方面居庸一点的价值。
由于时间有限和经验是平的欠缺,不足之处还望老师予以指正。
在这辆周里我们再次熟悉和增强了对VHDL语言的基本知识,熟悉利用VHDL语言对常用的的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来。
VHDL硬件描述语言打破了硬件和软件设计人员之间互不干涉的界限,可以使用语言的形式来进行数字系统的硬件结构、行为的描述,直接设计数字电路硬件系统。
通过编程、下载后,该芯片已经具备了原来需要使用复杂的数字电路实现的功能;更加了解和加深了对编制和调试程序的技巧,进一步提高了上机动手能力,培养了使用设计综合电路的能力,养成了提供文档资料的习惯和规范编程的思想。
本次的课程设计将各个单一的模块实现其功能后,学会通过原理图或顶层文件把各模块连接,从而实现对出租车自动计费。
课设注重的不仅是把理论知识巩固,而且应把理论和实际相结合,把知识应用到生活中。
在课设过程中,遇到了不少问题,数码管无法正常显示,计费不按要求等。
通过的对源代码的修改,发现了一些易忽略的细节。
课设考验的是思维逻辑能力,对知识的灵活应用,当然,合作精神是不可或缺的。
课设时间不长,要在短时间内完成绝不是个人力量能达到的,要学会集众人之精华,还要善于利用已有的工具为自己服务,开拓思维。
课设让我们认识到所学本科知识的真正实用性,只是这门课开始研究的第一步。
在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。
课程设计结束了,但是从中学到的知识会让我受益终身。
发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
最后,我们衷心的感谢课设期间一直指导和陪伴着我们的老师。
七.程序清单
计费模块源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityjfmkis
port(clk,start,stop,pause,js:
instd_logic;
chefei,luc:
outin