EDA课程设计报告出租车计费器.docx
《EDA课程设计报告出租车计费器.docx》由会员分享,可在线阅读,更多相关《EDA课程设计报告出租车计费器.docx(17页珍藏版)》请在冰豆网上搜索。
![EDA课程设计报告出租车计费器.docx](https://file1.bdocx.com/fileroot1/2023-2/4/40529ece-4442-4f40-97e7-c0d55c29ba40/40529ece-4442-4f40-97e7-c0d55c29ba401.gif)
EDA课程设计报告出租车计费器
课程设计报告
课程名称数字系统与逻辑设计
课题名称出租车计费器的设计
专业通信工程
班级通信0902
学号200903020228
姓名肖俊
指导教师乔汇东胡倩
2011年7月9日
湖南工程学院
课程设计任务书
课程名称数字系统与逻辑设计
课题出租车计费器的设计
专业班级通信0902
学生姓名肖俊
学号200903020228
指导老师乔汇东胡倩
审批乔汇东
任务书下达日期2011年7月2日
任务完成日期2011年7月9日
《数字系统与逻辑设计》课程设计任务书
一、设计目的
全面熟悉、掌握VHDL语言基本知识,掌握利用VHDL语言对常用的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用设计综合电路的能力,养成提供文档资料的习惯和规范编程的思想。
二、设计要求
1、设计正确,方案合理。
2、程序精炼,结构清晰。
3、设计报告5000字以上,含程序设计说明,用户使用说明,源程序清单及程序框图。
4、上机演示。
5、有详细的文档。
文档中包括设计思路、设计仿真程序、仿真结果及相应的分析与结论。
三、进度安排
第二十周星期一:
课题讲解,查阅资料
星期二:
总体设计,详细设计
星期三:
编程,上机调试、修改程序
星期四:
上机调试、完善程序
星期五:
答辩
星期六-星期天:
撰写课程设计报告
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:
一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现;四、系统调试与仿真;五、总结与体会;六、附件(所有程序的原代码,要求对程序写出必要的注释);七、评分表。
目录
一.出租车计费系统的总体设计1
1.1出租车计费设计1
1.2基本设计思想1
二.出租车计费系统的功能实现1
2.1系统的总体框图1
2.2程序流程图2
2.3系统各功能模块的实现3
三.系统调试与仿真10
四.总结与体会12
五.评分表14
一.出租车计费系统的总体设计
1.1出租车计费设计
该出租车计费器按下开关S1后开始计费和计里程数,起步价是3元,准行1公里,以后1元/公里。
1.2基本设计思想
时钟输入为一个1KHz的系统时钟,直流电机模块每转一圈输出一个脉冲信号给CPU,另外用按键模块的S1来作为整个系统的复位按钮,每复位一次,计费器从头开始计费。
直流电机模块用来模拟出租车的车轮子,每转动一圈认为是行走1米,所以每旋转1000圈,认为车子前进1公里。
系统设计是需要检测电机的转动情况,每转1000圈,分频模块输出一个上升沿信号。
车费和里程数在一个8位7段数码管上显示,前4位显示里程,后4位显示费用。
二.出租车计费系统的功能实现
2.1系统的总体框图
该出租车计费系统由四个模块组成,分别是:
分频模块:
将每1000个电机脉冲转化成1个输出脉冲
计费模块:
计算应付车费
计程模块:
计录已行里程
显示模块:
将应付车费和已行里程显示在数码管上
各模块之间的关系为:
2.2程序流程图
1.分频模块glclk.vhd:
2.计费模块cnt_fy.vhd:
3.计程模块cnt_gl:
2.3系统各功能模块的实现
1.分频模块:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityglclkis
port(pulse:
instd_logic;
reset:
instd_logic;
glclk:
outstd_logic);
end;
architecturebehavofglclkis
signaltemp:
std_logic;
signalcount:
integerrange0to500;
begin
process(pulse,reset)
begin
ifreset='1'then
count<=0;
temp<='0';
elsifpulse'eventandpulse='1'then
ifcount>499then
count<=0;
temp<=nottemp;
else
count<=count+1;
endif;
endif;
endprocess;
glclk<=temp;
end;
2.计费模块:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt_fyis
port(glclk:
instd_logic;
reset:
instd_logic;
pul:
instd_logic;
money0:
outstd_logic_vector(3downto0);
money1:
outstd_logic_vector(3downto0);
money2:
outstd_logic_vector(3downto0);
money3:
outstd_logic_vector(3downto0));
end;
architecturebehavofcnt_fyis
signalmoney_cnt0:
std_logic_vector(3downto0);
signalmoney_cnt1:
std_logic_vector(3downto0);
signalmoney_cnt2:
std_logic_vector(3downto0);
signalmoney_cnt3:
std_logic_vector(3downto0);
--signalflag:
integerrange0to4;
begin
process(glclk)
--variableflag:
integerrange0to4;
begin
ifreset='1'then
money_cnt0<="0011";
money_cnt1<="0000";
money_cnt2<="0000";
money_cnt3<="0000";
elsifglclk'eventandglclk='0'then
ifmoney_cnt3=9andmoney_cnt2=9andmoney_cnt1=9andmoney_cnt0=9then
money_cnt0<="0000";
money_cnt1<="0000";
money_cnt2<="0000";
money_cnt3<="0000";
elsifmoney_cnt3/=9andmoney_cnt2=9andmoney_cnt1=9andmoney_cnt0=9then
money_cnt0<="0000";
money_cnt1<="0000";
money_cnt2<="0000";
money_cnt3<=money_cnt3+"0001";
elsifmoney_cnt2/=9andmoney_cnt1=9andmoney_cnt0=9then
money_cnt0<="0000";
money_cnt1<="0000";
money_cnt2<=money_cnt2+"0001";
money_cnt3<=money_cnt3;
elsifmoney_cnt1/=9andmoney_cnt0=9then
money_cnt0<="0000";
money_cnt1<=money_cnt1+"0001";
money_cnt2<=money_cnt2;
money_cnt3<=money_cnt3;
elsifmoney_cnt0/=9then
money_cnt0<=money_cnt0+"0001";
money_cnt1<=money_cnt1;
money_cnt2<=money_cnt2;
money_cnt3<=money_cnt3;
endif;
endif;
endprocess;
money0<=money_cnt0;--+"0011";
money2<=money_cnt2;
money1<=money_cnt1;
money3<=money_cnt3;
end;
3.计程模块:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt_glis
port(glclk:
instd_logic;
reset:
instd_logic;
km_cnt0:
outstd_logic_vector(3downto0);
km_cnt1:
outstd_logic_vector(3downto0);
km_cnt2:
outstd_logic_vector(3downto0);
km_cnt3:
outstd_logic_vector(3downto0));
end;
architecturebehavofcnt_glis
signalcnt0:
std_logic_vector(3downto0);
signalcnt1:
std_logic_vector(3downto0);
signalcnt2:
std_logic_vector(3downto0);
signalcnt3:
std_logic_vector(3downto0);
begin
process(reset,glclk)
begin
ifreset='1'then
cnt0<="0000";
cnt1<="0000";
cnt2<="0000";
cnt3<="0000";
elsifglclk'eventandglclk='0'then
ifcnt3=9andcnt2=9andcnt1=9andcnt0=9then
cnt0<="0000";
cnt1<="0000";
cnt2<="0000";
cnt3<="0000";
elsifcnt3/=9andcnt2=9andcnt1=9andcnt0=9then
cnt0<="0000";
cnt1<="0000";
cnt2<="0000";
cnt3<=cnt3+"0001";
elsifcnt2/=9andcnt1=9andcnt0=9then
cnt0<="0000";
cnt1<="0000";
cnt2<=cnt2+"0001";
cnt3<=cnt3;
elsifcnt1/=9andcnt0=9then
cnt0<="0000";
cnt1<=cnt1+"0001";
cnt2<=cnt2;
cnt3<=cnt3;
elsifcnt0/=9then
cnt0<=cnt0+"0001";
cnt1<=cnt1;
cnt2<=cnt2;
cnt3<=cnt3;
endif;
endif;
endprocess;
km_cnt0<=cnt0;
km_cnt1<=cnt1;
km_cnt2<=cnt2;
km_cnt3<=cnt3;
end;
4.显示模块:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydisplayis
port(CLK:
INSTD_LOGIC;
b0,b1,b2,b3,a0,a1,a2,a3:
INSTD_LOGIC_VECTOR(3DOWNTO0);
dx:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
wx:
outstd_logic_vector(7downto0));
end;
architecturebehavofdisplayis
SIGNALCNT8:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALA:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
P1:
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
CNT8<=CNT8+1;
ENDIF;
ENDPROCESS;
P2:
PROCESS(CNT8)
BEGIN
CASECNT8IS
WHEN"000"=>wx<="10000000";A<=b3;
WHEN"001"=>wx<="01000000";A<=b2;
WHEN"010"=>wx<="00100000";A<=b1;
WHEN"011"=>wx<="00010000";A<=b0;
WHEN"100"=>wx<="00001000";A<=a3;
WHEN"101"=>wx<="00000100";A<=a2;
WHEN"110"=>wx<="00000010";A<=a1;
WHEN"111"=>wx<="00000001";A<=a0;
ENDCASE;
ENDPROCESS;
P3:
PROCESS(A)
BEGIN
CASEAIS
WHEN"0000"=>dx<="0111111";
WHEN"0001"=>dx<="0000110";
WHEN"0010"=>dx<="1011011";
WHEN"0011"=>dx<="1001111";
WHEN"0100"=>dx<="1100110";
WHEN"0101"=>dx<="1101101";
WHEN"0110"=>dx<="1111101";
WHEN"0111"=>dx<="0000111";
WHEN"1000"=>dx<="1111111";
WHEN"1001"=>dx<="1101111";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
end;
三.系统调试与仿真
1.顶层元件仿真图:
从图中可看出,给一个复位信号后,费用的最低位为“0011”,即3,里程数的最低位为“0000”,即0,每当temp信号出现一个下降沿,费用和里程数的最低位各加1,符合课题要求。
图5
2.分频模块仿真图:
从仿真图可以看出,电机信号pulse每产生1000个周期,输出信号发生一个周期的变化
图6
3.计程模块仿真图:
从仿真图可看出,glclk每出现一个上升沿,里程数加1
图7
4.计费模块仿真图:
从仿真图可看出,费用初始值为3,glclk每出现一个上升沿,费用数加1
图8
5.显示模块仿真图:
从仿真图可以看出,每当系统时钟信号CLK出现一个上升沿,位选数据wx右移一次,段选信号dx在wx为“00000001”时输出8的数码管显示编码
图9
四.总结与体会
通过这次紧张而又充实的EDA课程设计,我感受到了VHDL语言和普通软件语言之间的区别,也能够更加熟练地运用VHDL语言进行逻辑电路的设计了,受益匪浅。
在刚拿到课题的时候,我对课题的第一个想法就是“容易”,因为出租车计费器从逻辑结构的角度来看十分简单,于是我信心满满地动手写起了程序。
可当我在写第一个分频模块的过程中就发现自己完全错了,程序写完后进行仿真,就是达不到预期的结果,要么输出信号有毛刺,要么就是有延迟,回过头来检查程序,却看不出有什么错误。
经过反复的修改和思考,才终于逐渐了解到,在VHDL语言中,数据的行为方式分为SIGNAL和VARIABLE两种,他们的行为方式和软件语言有很大不同,由于对这些区别理解不深,所以在编程的过程中,很容易陷入编软件语言的思维定势,从而产生这些错误。
在没有进行课程设计之前,我们的上机实践从来没有编写过规模如此的数字电路系统,最多就写写什么半加器,全加器,移位寄存器之类的小型实体。
而这次课程设计要想实现课题要求的功能,必须将若干小型实体组合成一个相对大型的实体。
不仅如此,在写完程序后,还要把程序下载到芯片内,连接相应的电子器件,观察真正的效果。
所以,通过这次紧张的课程设计,我体会了从开始利用VHDL语言编程到把设想放到真正在电子器件上实现的全部过程,提高了自己从事工程项目设计的能力。
另外,在课程设计的过程,我碰到了很多棘手的难题,虽然也进行了苦思冥想,却还是得不到解决方法,有时也有想放弃的念头,不过终于还是坚持了下来,完成了任务,我意识到今后不管是在工作还是学习中,做工程项目都需要有忍耐力和坚持。
五.评分表
计算机与通信学院课程设计评分表
课题名称:
出租车计费器的设计
项目
评价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日期: