基于CPLD的出租车计费器.docx
《基于CPLD的出租车计费器.docx》由会员分享,可在线阅读,更多相关《基于CPLD的出租车计费器.docx(22页珍藏版)》请在冰点文库上搜索。
基于CPLD的出租车计费器
湖南工程学院
课程设计
课程名称嵌入式系统设计
课题名称基于CPLD的出租车计费器
专业
班级
学号
姓名
指导教师
2011年月日
湖南工程学院
课程设计任务书
课程名称嵌入式系统设计
课题基于CPLD的出租车计费器
专业班级
学生姓名
学号
指导老师
审批
任务书下达日期2011年11月日
任务完成日期2011年12月日
设计内容与设计要求
设计内容:
(1)实现计费功能,计费标准为:
按行驶里程计费,起步价为7.00元,并在车行3Km后按2.20元/Km计费,当计费器达到或超过20元时,每公里加收50%的车费,车停止不计费。
(2)现场模拟功能:
能模拟汽车起动、停止、暂停以及加速等状态。
(3)按计动态扫描电路,将车费和路程显示出来,各有两位小数。
设计要求:
1、设计思路清晰,给出整体设计框图;
2、设计各单元电路,完成其功能仿真和编译并生成低层模块;
3、完成顶层设计并编译通过;
4、完成设计下载并调试电路;
5、写出设计报告;
目录
一.系统总体设计1
1.系统总体功能介绍1
2.系统总体思路及原理1
3.系统总体框图2
二.单元模块设计3
1.计费模块3
2.数据转换模块6
3.片选信号产生模块9
4.八选一模块10
5.位驱动模块12
6.段驱动模块14
三.总体设计电路图16
四.硬件实现17
五.心得体会18
参考文献19
一.系统总体设计
1.系统总体功能介绍
1.实现计费功能,计费标准为:
按行驶里程计费,起步价为7.00元,并在车行3Km后按2.20元/Km计费,当计费器达到或超过20元时,每公里加收50%的车费,车停止不计费。
2.现场模拟功能:
能模拟汽车起动、停止、暂停以及加速等状态。
3.按计动态扫描电路,将车费和路程显示出来,各有两位小数。
2.系统总体思路及原理
该系统的设计从大体上可以分为五大模块:
1:
计费模块
该模块主要实现计费功能和现场模拟功能。
计费标准为:
按行驶里程计费,起步价为7.00元,并在车行3km后按2.20元/km计费,当计费器达到或超过20元时,每公里加收50%的车费,车停止不计费。
并以高低脉冲模拟出租汽车启动、停止、暂停、加速按钮,具有输入信号的作用。
2:
数据转换模块
数据转换模块是一个模为10的加法计数器,可将计费模块输出的车费和路程转换成4位的十进制数。
3:
片选信号产生模块
片选信号产生模块是主要是为八选一选择器提供片选信号完成选择功能,同时是为了数码管的位选提供信号。
4:
八选一选择模块
该模块的功能是把数据转换模块提供的8位十进制数分别选择出来为数码管的段选提供信号
5:
显示模块
显示模块是由七段LED数码管译码和动态扫描显示两部分组成。
所以应包括2个子模块即:
位驱动模块,段驱动模块。
采用的是共阳极七段数码管,段显示模块将十进制的输入信号用七段数码管显示,由七段发光二极管组成数码显示器,利用字段的不同组合。
可分别显示0~9十个数字,其中要求路程和车费都要用2位小数点来表示,所以须设置一个控制小数点的变量,即程序中的dp。
这段程序所示的是在数码管的第二、第六个后面显示小数点,实现了路程和车费都用2位小数点表示的功能。
位驱动模块主要功能是将片选信号转换成8位二进制信号用来驱动8个数码管完成动态扫描过程
3.系统总体框图
二.单元模块设计
1.计费模块
此模块为计费模块,实现计费功能。
计费标准为:
按行驶里程计费,起步价为7.00元,并在车行3公里后按2.20元/km计费,当计数器达到或超过20元时,每公里加收50%的车费,即按3.30元/km计费。
输入端口start、stop、pause、js分别代表汽车的起动、停止、暂停和加速。
clk为扫描时钟,硬件实现时加入时钟信号,另有两个输出,即chefei和luc,分别代表车费和路程,当车处于行驶状态时,此模块会自动记录下路程与车费状况并作为转换模块的输入。
模块源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityjifeiis
port(clk,start,stop,pause,js:
instd_logic;
chefei,luc:
outintegerrange0to8000);
endjifei;
architecturert1ofjifeiis
begin
process(clk,start,stop,pause,js)
variablea,b:
std_logic;
variableaa:
integerrange0to100;
variablechf,lc:
integerrange0to8000;
variablenum:
integerrange0to9;
begin
if(clk'eventandclk='1')then
if(stop='0')then
chf:
=0;
num:
=0;
b:
='1';
aa:
=0;
lc:
=0;
elsif(start='0')then
b:
='0';
chf:
=600;
lc:
=0;
elsif(start='1'andjs='1'andpause='1')then
if(b='0')then
num:
=num+1;
endif;
if(num=9)then
lc:
=lc+5;
num:
=0;
aa:
=aa+5;
endif;
elsif(start='1'andjs='0'andpause='1')then
lc:
=lc+1;
aa:
=aa+5;
endif;
if(aa>=100)then
a:
='1';
aa:
=0;
else
a:
='0';
endif;
if(lc<300)then
null;
elsif(chf<=2000anda='1')then
chf:
=chf+280;
elsif(chf>=2000anda='1')then
chf:
=chf+330;
endif;
endif;
chefei<=chf;
luc<=lc;
endprocess;
endrt1;
模块的时序仿真图如下
图中的stop为汽车停止输入端,上升沿有效;start为汽车启动输入端,上升沿有效;pause为汽车暂停输入端,上升沿有效;js为汽车加速输入端,上升沿有效。
CLK为时钟源信号;chefei为汽车车费输出端,luc为汽车路程输出端。
由图可知:
当stop,Start,pause,js全为高电平时路程按5的速度增加,车费为600.当路程增加到300时,车费变为880,以后路程每增加100,车费增加280。
模块生成图:
2.数据转换模块
此模块为数据转换模块,功能是将计费模块产生的车费与路程的模拟量转换成数字量并输出,它是一个模为10的加法计数器,可将计费模块输出的车费和路程转换成4位的十进制数。
其中daclk为时钟信号,ascore、bscore连接计费模块的chefei和luc,输出为2个4位的十进制数,可以分别表示路程和车费情况。
当车运行于不同状况时,此模块会将不同的车费与路程状况转换为数字量并输出。
模块源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityxis
port(daclk:
instd_logic;
ascore,bscore:
inintegerrange0to8000;
age,ashi,abai,aqian,bge,bshi,bbai,bqian:
outstd_logic_vector(3downto0));
endx;
architecturert1ofxis
begin
process(daclk,ascore)
variablecomb1:
integerrange0to8000;
variablecomb1a,comb1b,comb1c,comb1d:
std_logic_vector(3downto0);
begin
if(daclk'eventanddaclk='1')then
if(comb1if(comb1a=9andcomb1b=9andcomb1c=9)then
comb1a:
="0000";
comb1b:
="0000";
comb1c:
="0000";
comb1d:
=comb1d+1;
comb1:
=comb1+1;
elsif(comb1a=9andcomb1b=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;
endif;
else
ashi<=comb1b;
age<=comb1a;
abai<=comb1c;
aqian<=comb1d;
comb1:
=0;
comb1a:
="0000";
comb1b:
="0000";
comb1c:
="0000";
comb1d:
="0000";
endif;
endif;
endprocess;
process(daclk,bscore)
variablecomb2:
integerrange0to8000;
variablecomb2a,comb2b,comb2c,comb2d:
std_logic_vector(3downto0);
begin
if(daclk'eventanddaclk='1')then
if(comb2if(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;
模块仿真图:
分析转换模块的时序仿真图可见当ascore,bscore为13位二进制数,当ascore为0-9时age从0到9变化,当ascore为10时age等于0,ashi等于1以此来完成13位2进制转换为4位十进制的功能。
bscore同理完成转换。
模块生成图:
3.片选信号产生模块
该模块是为八选一选择模块提供片选择信号以及为数码管位选模块提供输入信号。
模块源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityseis
port(clk:
instd_logic;
a:
outstd_logic_vector(2downto0));
endse;
architecturert1ofseis
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;
模块仿真图:
由以上仿真可以看出该输出信号从000到111逐个变化,可以为八选一选择模块提供片选完成对8位十进制数的选择为段选模块提供输入信号。
模块生成图
4.八选一模块
此模块为显示模块提供段选信号,功能是将已转换好的数字量进行选择性的输出给段驱动模块提供输入信号。
C[2..0]为片选端,用来连接片选模块的片选输出端A[2..0],A1、A2、A3、A4、B1、B2、B3、B4分别连接数据转换模块的八个转换输出端,因为设计要求路程和车费都要用2位小数点来表示,所以须设置一个控制小数点的变量,即程序中的dp端,D[3..0]连接段驱动模块的输入端。
模块源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityxxx1is
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));
endxxx1;
architecturert1ofxxx1is
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;
endrt1;
模块仿真图:
由仿真图可知,输入信号c为3位片选信号其变化范围为0到7,输入信号c从0到7逐个变化时,输出d逐个输出a1,a2,a3,a4,b1,b2,b3,b4。
模块生成图
5.位驱动模块
Se模块输出信号经过该模块完成对数码管的位选择。
模块源程序:
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYdecode3_8IS
PORT(SEL:
INstd_logic_vector(2downto0);
s:
OUTstd_logic_vector(7downto0));
ENDdecode3_8;
ARCHITECTUREaOFdecode3_8IS
BEGIN
s<="00000001"whensel=0else
"00000010"whensel=1else
"00000100"whensel=2else
"00001000"whensel=3else
"00010000"whensel=4else
"00100000"whensel=5else
"01000000"whensel=6else
"10000000"whensel=7else
"00000000";
ENDa;
模块仿真图:
由仿真图可以看出当SEL信号从000—111变化时依次驱动1—8八个数码管。
模块生成图:
6.段驱动模块
此模块为数码管段控制模块,功能是控制七段数码管对转换后的数字量进行显示,使其完成路程和车费的显示。
其中D[3..0]连接八选一模块的D[3..0]端,q[6..0]连接数码管七段。
模块源程序:
libraryieee;
useieee.std_logic_1164.all;
entitydiis
port(d:
instd_logic_vector(3downto0);
q:
outstd_logic_vector(6downto0));
enddi;
architecturert1ofdiis
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;
endrt1;
模块时序仿真图:
从波形图中可看出,此模块可控制数码管完成对数字量的显示。
当输入为0000-1000时数码管分别显示0,1,2,3,4,5,6,7,8。
当输入为其他时数码管显示9。
模块生成图:
三.总体设计电路图
总体设计电路图如下:
模块连接:
计费模块的clk、start、stop、pause和js端连接输入,chefei[12..0]和luc[12..0]连接转换模块的ascore[12..0]与bscore[12..0];
转换模块的daclk端连接输入,age[3..0]至bqian[3..0]连接八选择一模块的a1[3..0]至b4[3..0];
八选择一模块的C[2..0]连接片选输出a[2..0],DP端连接输出DP,D[3..0]连接段模块的D[3..0];
片选信号产生模块的CLK端与输入信号相连,并连接转换模块的daclk端,A[2..0]连接片位驱动模块SEL[2..0],并与八选一模块的C[2..0]相连;
段驱动模块的D[3..0]端与八选一模块的D[3..0]端相连,Q[6..0]端连接八段数码管输出Q[6..0]。
四.硬件实现
1.管脚绑定
利用QuartusII软件完成对管脚的绑定,绑定管脚图如下图所示:
2.硬件实际电路连接
按照给出的管脚绑定在EDA实验箱上进行线路连接。
3.编译下载实现功能
完成管脚定义后选择器件,编译后生成.sof、.pof文件。
选择sof文件直接进行下载。
根据给定的输入信号情况观察实际功能的实现。
五.心得体会
为期2周的课程设计即将结束了,在这2周里我完成了一个出租车计费器的VHDL语言的实现。
在深入了解了VHDL语言的编程后我觉得这门语言真的是博大精深极大的加大了我对该课程的学习兴趣。
在这次课程设计中我学到了很多知识。
一.QuartusII这个软件在以前的实验中稍微接触过,但非常不熟悉。
经过这次的课程设计我很好的了解了该软件的使用。
刚开始完全不会动手,经过查书籍到网上查资料慢慢熟悉了软件的基本用法,这次设计可以说软件的使用是占了大部分的,经过多次的反复使用我掌握了该软件的简单用法。
二.经过实践,充分了解到了说与做是2码事。
在编写程序的过程中遇到了许多的困难,连简单的程序都要找好多资料才能勉强看懂其中的意思。
在老师及同学的讨论下,终于艰难的把程序给编写完成了。
这个还是给人相当大的鼓励的。
三.硬件调试过程中,也使我受益良多。
看起来就是接几根线的事,但做起来相当的烦躁。
必须细心,淡定慢慢的来才有成功的机会。
在调试过程中还好没经过多少波折一次性就搞定了,这使我更加的高兴了,想着自己亲手做出来了真的感到高兴。
在调试过程中培养了我的动手能力增强了我对硬件知识的了解。
课程设计即将结束了,在这由衷的感谢老师的指导感谢同学们的提醒,经过这次设计我学到了许多也巩固了以前学的知识。
参考文献
1.EDA技术实用教程—VHDL版潘松,黄继业编著
2.数字电子技术基础阎石主编
电气与信息工程系课程设计评分表
项目
评价
设计方案的合理性与创造性
开发板焊接及其调试完成情况
硬件设计或软件编程完成情况*
硬件测试及软件调试结果*
设计说明书质量
设计图纸质量
答辩汇报的条理性和独特见解
答辩中对所提问题的回答情况
完成任务情况
独立工作能力
组织纪律性(出勤率)
综合评分
指导教师签名:
________________
日期:
________________
注:
表中标*号项目是硬件制作或软件编程类课题必填内容;
此表装订在课程设计说明书的最后一页。
课程设计说明书装订顺序:
封面、任务书、目录、正文、评分表、附件(非16K大小的图纸及程序清单)。