出租车计费器EDA
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南京理工大学
EDA 设计(II)
实验报告
作者:____________________ 学号:_________________ 学院(系): ___________ 自动化学院_______________ 专业:____________________ 自动化_________________ 标题___________________ 出租车计费器______________
指导老师:
实验日期:2015 年9月
目录
1 绪论1
2 系统总体设计1
2.1 系统设计思想1
2.2 系统功能概述1
2.3 系统总体组成结构1
3 系统各模块详细设计2
3.1 计时模块2
3.2 按键控制模块2
3.3 动态显示模块3
3.4 里程和车费计算模块4
3.5 我的部分4
4 系统调试5
4.1 系统仿真5
4.2 系统实际验证5
4.3 调试过程中遇到的问题与解决方法5
5 总结与心得体会
6 致谢6 参考文献7
出租车计费器
1 绪论
EDA是电子设计自动化(Electronic Design Automation )的缩写,发展于20世纪90年代。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
本次EDAS计使用MAX+plus II实验开发系统,学习并掌握VHD硬件描述语言
的基本语法以及设计方法和思想,将已学过的数字电子设计知识综合运用于电子系统的设计中,掌握运用VHDL设计电子系统的流程和方法,加强和培养自己对电子系统的设计能力。
综合设计的任务是用一周的时间,在EDA软件MAX+plus II上用VHD语言设计完成一个电子技术综合问题,小组成员分工,负责各个子模块的设计,最后将各个模块整合起来,连接整体电路,分配引脚,下载到实验班上进行测试。
2系统总体设计
2.1 系统设计思想
用VHDL语言设计出符合功能要求的的出租车计费器系统,完成设计后使用系统实验箱下载验证。
2.2 系统功能概述
1、计费功能:计费标准为按行驶里程收费,起步价为11元,车行3公里后每公里1.4元,车停止时不计费;
2、实现模拟功能:能模拟汽车启动、暂停及停止状态;
3、实现显示功能:能在数码管上显示出公里数及总费用。
2.3 系统总体结构
整个计费系统的结构如下图所示,其计时模块负责对实验板上的时钟信号进行分配,产生合适的计数脉冲,供里程计算模块和车费计算模块的技术。而显示模块则将前两者计算得到的结果显示在数码管上。开关控制模块则接受实验板上的开关信号,模拟出租车的起停。
3系统各模块详细设计
3.1 计时模块
计时模块的时钟源为试验箱的CP2时钟,频率为1024 Hz,在VHDL中经过计数十分频得到模拟的出租车百米行驶计数时钟。其计数的逻辑比较简单,不再详细列出。
3.2 按键控制模块
在按键控制模块中我们引入了两个拨码开关K1和K2,其中K1是启动和停
止开关,K2是暂停开关,两个按键向上拨逻辑值均为1,向下拨逻辑值均为0。
为了方便控制,我们引入了state这个两位的二进制变量,用它的值来标记出租车的不同状态,其控制逻辑如下:
按键控制模块程序如下:
con trol:
PROCESS(start,pause)
beg in
if(start='O')the n
state<="01";
elsif(pause='1')the n
state<="00";
elsif(pause='0')the n
state<="11";
end if;
end PROCESS;
3.3动态显示模块
由于此系统要用到实验板上的8个数码管,且每个数码管显示的数字都不相同,所以不能采用静态显示而必须使用动态显示,动态显示即依次向每位数码管同时送出字形码和相应的位选,位与位之间利用延时程序进行延时,当延时程序
非常短时,由于发光管的余辉和人眼视觉暂留作用,此时我们的人眼就分辨不出位与位之间有延时存在(人眼视觉暂留时间为0.05-0.2秒,延时程序应当根据这个范围来调整),感觉各位数码管同时都在显示。
此处用系统时钟1024Hz来扫描数码管,取得了不错的效果。
该模块程序如下,后面tmp1为其它值时,各种情况与其值为0时相似,未有----- 列出:
PROCESS(clk)
variable tmp1,tmp2:integer range 0 to 10;
BEGIN
if(clk'event and clk='1')then
tmp1:=tmp1+1;
if(tmp1>=8)the n
tmp1:=0;
end if;
case tmp1 is
whe n 0 =>
sel<="00000001";
tmp2:=CONV_INTEGER(fee_tenth); case tmp2 is
when 0 => data<="11111100"; when 1 =>