论文题目:基于FPGA出租车计价器设计
专 业:微电子科学和工程
摘要
出 | 租 | 车 | 计 | 价 | 器 | 是 | 乘 | 客 | 和 | 司 | 机 | 双 | 方 | 交 | 易 | 准 | 则 | 。 |
含有良好性能计价器不管是对广大出租车司机好友还是乘客来说全部是很必需。现在各大中城市出租车行业全部已普及自动计价器,而部分小城市还未普及,但伴随城市建设日益加紧,象征着城市面貌出租车行业也将加速发展,所以计价器普及也是毫无疑问。
本 | 论 | 文 | 叙 | 述 | 了 | EDA发 | 展 | 及 | 其 | 优 | 势 | 、 |
FPGA发展趋势及结构特点和VHDL语言优点及语法结构,并分析了出租车计价器各模块功效要求、基础原理和实现方法。
本论文设计采取VHDL硬件描述语言进行编程,基于Quartus
同时给出了具体仿真波形,实现了出租车基础计费功效,还能模拟汽车开启, 停止,暂停等状态, 同时提升了计费系统可靠性、通用性。 本设计在FPGA试验箱上运行良好,实现了计费器各项功效。
关键字FPGA,VHDL, Quartus II, 出租车计价器
Subject:Thedesign of the taxi meter based on FPGA
Specialty:Microeletronics Science and Engineering
Name:DanShen (Signature) ___________
Instructor:Gaili Yue (Signature) ___________
ABSTRACT
Taximeter is the rule of passenger and driver. Have a good performance ofthe meter for
and some small city has not been popular, but with the quickening ofcity construction, the
our taxi driver or passenger is verynecessary. Now the automatic taxi meter has popularized,
structureofthe FPGA, andexplains the advantages and grammarstructure of VHDL ,meanwhile, analysed the function request, thebasic principle as well as the method ofaccomplishment of each parts.This system's design programmes in the VHDL, compiled and emulatedbasing on Quartus II platform of Altera consists of four modules,that is speed, mileage, timing and billing module. This paperintroduce one method that can use a chip of FPGA to design taximeter, which consists of four modules, that is speed, mileage, timingand billing module, and then, describe the design of each module andgive out the simulation. This taxi meter can be self-chargingaccording to mileage, which also can simulate the state of speed,suchas start, stop, and pause, at the same time, its reliability andcommonality also can be improved. This design FPGA test box onrunning well, realize the different functions of the
messageaccounting device.
KEY | WORDS | FPGA | , | VHDL | , | Quartus | II | ,The | taxi | meter |
目录
第1章绪论.................................................................1
1.1课题研究背景及目标...................................................11.2课题研究现实状况.....................................................21.3课题研究方法.........................................................3
第2章设计相关工具介绍.....................................................4
2.1.1EDA发展..........................................................4
2.1EDA介绍..............................................................4
2.2.2FPGA结构及其特点.................................................7 2.3VHDL介绍.............................................................7 2.3.1VHDL介绍.........................................................7 2.3.2VHDL代码结构.....................................................8 2.3.3 VHDL语言设计硬件电路优点.........................................9 2.4QUARTUS II............................................................10 2.4.1QuartusⅡ介绍...................................................10 2.4.2 QuartusⅡ设计步骤...............................................10 2.5试验箱简述..........................................................11
第3章系统设计............................................................13
3.1总体设计............................................................13 3.1.1 出租车计价器设计要求............................................13 3.1.2 总体框架设计....................................................13 3.1.3步骤图...........................................................14 3.2关键模块设计.........................................................16 3.2.1 出租车总体模块设计..............................................16 3.2.2 车轮大小选择模块设计............................................17 3.2.3 计程模块设计....................................................18 3.2.4 计时模块设计....................................................18 3.2.5 计费模块设计....................................................19 3.2.6数据分配模块设计................................................21
第4章仿真及调试结果......................................................23
4.1仿真结果............................................................234.1.1 出租车总体模块仿真波形..........................................234.1.2 车轮大小选择模块仿真波形........................................234.1.3 计程模块仿真波形................................................244.1.4 计时模块仿真波形................................................244.1.5 计费模块仿真波形................................................254.1.6 数据分配模块仿真波形............................................254.1.7译码模块仿真波形................................................26
4.1.8分频模块仿真波形................................................26
4.2管脚分配及说明......................................................27
4.3调试结果及分析......................................................27
第5章总结................................................................31
致谢.....................................................................34
参考文件..................................................................35
附录.....................................................................36
源代码..................................................................36
第1章绪论
1.1课题研究背景及目标
出租车计价器是乘客和司机之间用于公平贸易工具,
同 | 时 | 它 | 也 | 是 | 出 | 租 | 车 | 行 | 业 | 发 | 展 | 关 | 键 | 标 | 志 | 。 |
所以含有良好性能出租车计价器不管是对司机还是乘客来说全部是很关键。所以,
设计出租车计价器是很有价值。
在 70年代 开始 时中国出 现 了 第 一 辆 出 租 车 ,
伴随经济快速发展,出租车行业发展趋势已十分突出,
不过那时出租车计价器几乎全部是进口,不仅不够正确, 而且价格还十分贵。
但伴随城市建设日益加紧,实现计价器全方面普及是毫无疑问,
所以未来出租车计价器市场是难以想象。
现在中国普遍使用出租车计价器关键是利用单片机来实现计价功效。
出租车计价器功效由刚开始时只能显示旅程,而价钱却需要司机自己经过旅程来计算,
计算后进行四舍五入得到,到现在能实现显示总价而且语音提醒和打印发票。
不过多年来,因为国际油价大幅度变动,所以出租车价格也伴随油价变动而进行调整,
但因为计价器是采取单片机来实现,而单片机程序并是不通用,
且不一样芯片有不一样指令集,所以价格改动全部需要将芯片从新烧录,
使得每次调价全部需要花费大量人力物力,所以极难达成现在油价变动需求。
而且出租车计价器采取硬件模块化设计,分别为:主控模块,
电源模块和按键显示模块。所以其硬件电路很复杂,而且因为分立元器件太多,
造成电源功耗大,使得芯片不易散热,影响计价器使用寿命。
而基于FPGA出租车计价器不仅能够处理由单片机设计引发很多问题,
而且现场可编程门阵列FPGA含有开发简单,静态可反复编程和动态系统编程等优点。
伴随微电子技术迅猛发展,使得FPGA在电子电路设计中能够实现速度愈加快、
集成度更高显著优势,即可实现功效也越来越多。
所以基于FPGA出租车计价器已成为未来计价方法首选。
所以 这次 毕业 设 计在 实现 计 价 功 效 同 时 ,
考虑到现在出租车行业发展趋势和对计价器灵活性高要求,
期望利用现场可编程门阵列FPGA来处理现在出租车计价器存在问题。
1.利用FPGA替换MCU
同时可设计相对复杂功效,而且已经编好程序在不一样FPGA芯片上是通用。
还能够利用FPGA实现任何数字器件功效,基于FPGA数字电路,能够缩短设计周期,
降低PCB面积,提升系统可靠性。又因为FPGA功效只取决于利用VHDL语言或Verilog-
HDL语 | 言 | 编 | 写 | 程 | 序 | , | 而 | 不 | 受 | 具 | 体 | 芯 | 片 | 特 | 殊 | 控 | 制 | , |
所以基于FPGA出租车计价器含有愈加好更新换代能力。
2.计价标准设定
增加该模块,关键考虑在不改变硬件电路前提下,
能够使计价标准设计显得愈加灵活,即依据各地域需求能够在VHDL程序中设置参数,
就能 够 适 应各 地 域出 租 车不 一 样 计 价 标 准 需 要 ,
还可实现依据各地域需求增加其它所需功效。同时还表现现在出租车行业发展,
使因油价变动而方便改变运价成为可能。
3.等候时间计价
该模块增加是为了响应了出租车行业发展需求,使出租车计价愈加合理,让乘客和出租车司机之间一个平衡点更轻易达成。
1.2课题研究现实状况
对于出租车计价器,现在市面上已经出现了很多采取不一样方法设计,譬如有可编程门器件FPGA,单片机和ARM等,但其中以单片机为主流。下来就以单片机为例讲述一下现在市面上出租车计价器存在弊端。采取单片机实现出租车计价器因为而单片机程序不是通用,且不一样芯片有不一样指令集,所以价格改动全部需要将芯片从新烧录,使得每次调价全部需要花费大量人力物力而且所需时间长,
而且因为分立元器件太多,造成电源功耗大, 使得芯片不易散热,影响计价器使用寿命。
在我这次设计中就利用FPGA来设计出租车计价器,因为基于FPGA出租车计价器能够处理由单片机设计引发很多问题。
和 | 利 | 用 | 单 | 片 | 机 | 设 | 计 | 出 | 租 | 车 | 计 | 价 | 器 | 相 | 比 | , |
采取FPGA设计出租车计费功效在很大程度上凸显了EDA优势。因为利用EDA,不仅能够实现在线仿真和测试,还能够将全部设计全部集中在统一文件中,即依据系统需求,设计所需要各个模块,最终对各个模块进行系统综合,从而得到我们所需整个系统设计。
1.3课题研究方法
依据系统总体功效,采取分层次、分模块、 自顶向下设计方法,首先实现系统框图中各个子模块,然后由顶层模块调用各子模块实现整个系统。编程完成后就利用QuartusⅡ软件进行各模块仿真,实现后,分别创建原件符号,新建一个电路图,在图中添加各模块原件符号并进行端口定义和功效划分,经过合理连接和协调各相关各个不一样端口,得到整个电路系统。然后连接电路,检验电路是否连接正确,最终将程序下载到试验装置中,进行引脚分配及编译,检验电路是否能实现所设计功效和要求。
和6个拨码开关,软件部分仿真在QuartusⅡ7.2环境中进行。首先,
此次设计硬件部分采取EP2C5Q208芯片作为主控芯片,8个共阴极数码管,
复位信号和等候时间信号等信息经过控制器处理,得到总价钱和旅程,
并最终将所行驶旅程和所需支付金额经过LED8段数码管显示出来。
第2章设计相关工具介绍
2.1EDA介绍
2.1.1EDA发展
伴随科学技术飞速发展,电子设计规模越来越大,复杂度也越来越高,集成电路制作工艺达成90nm甚至更小尺寸。以计算机为工作平台,融合了电子技术和智能化技术EDA(ElectronicDesign Automation, 电子设计自动化)工具已经在高速,复杂数字系统设计中得到了广泛应运。
聚 | EDA是指利用计算机完成电子系统设计。 EDA技术是以计算机和微电子技术为先导, |
就能够由计算机软件进行处理,得到设计结果,而且修改设计如同修改软件一样方便,可极大地提升设计效率。
从 | 20世 | 纪 | 60年 | 代 | 中 | 期 | 开 | 始 | , |
大家就不停开发多种计算机辅助设计工具来帮助设计人员进行电子系统设计。电路理论和半导体工艺水平提升,对EDA技术发展起了巨大推进作用,使EDA作用范围从PCB版设计延伸到电子线路和集成电路设计,甚至整个系统设计,也使IC芯片系统应用,电路制作和整个电子系统生产过程全部集成在一个环境之中。依据电子设计技术发展特诊,EDA技术发展可大致分为三个阶段。
CAD阶 段 : CAD( Computer Aided Design, 计算机辅助设计)阶段是从20世纪60年代中期到20世纪80年代早期,
该阶段特点是部分单独工具软件,关键有PCB(PrintedCircuit Board)布线设计,电路模拟,逻辑模拟及版图绘制等,经过计算机使用,从而将设计人员从大量繁锁反复计算和绘图工作中解脱出来。
CAE阶 | 段 | : | CAE( | Computer | Aided | Engineering, |
计算机辅助工程)阶段是从20世纪80年代早期到20世纪90年代早期,这个阶段在集成电路和电子设计方法学和设计工具集成化方面取得了很多结果。多种设计工具, 如原理图输入,编译和连接, 逻辑模拟,测试码生成, 版图自动布局和多种单元库已齐全。这个阶段关键采取基于单元库半定制设计方法,采取门阵列和标准单元设计多种ASIC(ApplicationSpecific Integrated Circuit, 专用集成电路)得到了极大发展,将集成电路工业推入ASIC时代。 EDA阶段: 20世纪90年代以来,电子设计技术发展到EDA阶段。
将精力集中于发明性方案和概念构思上。
2.1.2EDA优势
电子产品设计生产,从选题大,方案论证,性能指标确定,装修电路,修改,定型参数直到批量生产,是一个复杂而又费时过程。
传统电路装配, 调试过程,通常均采取专门焊接板,经过手工连线装配, 检验无误后,进行电路测量, 最终评定电路性能。若性能和设计值不符时, 需调换参数并重新调试测量,直至电路符合设计要求为止,不过, 当电路很复杂时,采取焊接板组装电路时所产生连接错误,器件损坏等人为错误,常会造成人力, 财力,时间浪费及错误性能评定。尤其是集成电路设计,
器件在焊接班上就无法组成向集成电路内部那样机密复杂电子电路,
装配版上寄生参数和集成环境中完全不一样。所以,在装配班测试特征将无法正确描述集成电路真实特征。所以,电子电路传统设计发法已经不适应该前电子技术发展要求,这就要借助计算机完成电子电路辅助设计,即电子电路EDA技术。
EDA包含电子工程设计全过程,如系统结构模拟,电路特征分析,
绘 | 电 | 路 | 图 | 和 | 制 | 作 | PCB等 | 。 | EDA还 | 可 | 进 | 行 | 电 | 路 | 仿 | 真 | , |
就是把电子器件或电路模块以数学模型表示,并配合数值分析方法,实现电路功效模拟及特征分析。假如采取电路模型足够正确, 则模拟结果将真实反应电路特征,甚至能够方便地实现电路结构及性能优化设计,并提供相当完整而具体数据库资料。较之传统电路设计方法, EDA优点是显而易见。
2.2 FPGA介绍
它是一个新型高密度PLD,采取CMOS-SRAM工艺制作。
FPGA是一个基于查找表(LUT,Look Up Table)可编程逻辑器件,关键由逻辑单元(LE,LogicElement)组成可配置逻辑块,可编程I/O和可编程内部互联模块组成。用户也能够依据需要对它进行编程,使之生成特定电路结构,完成一定功效。FPGA内部阵列块之间采取分段式进行互连,所以结构比较灵活,不过延时不可估计。
2.2.1FPGA发展趋势
FPGA器件在过去几十年里已经取得了巨大成就,在功效、成本、 功耗、 容量和编程能力方面性能不停提升,在未来发展中,将展现以下多个方面趋势。
1.向大规模、 高集成度方向深入发展
因为微电子制作工艺超高速发展,FPGA在性能、容量方面取得进步很显著,有些人认为:现在多数系统瓶颈是处理器、音频及数据系统引发I/O带宽问题。I/O带宽关键在于收发器性能,这正是FPGA优于其它处理方案之处,AlteraStrative IV GT产品中提供了可达11.3Gb/s高性能收发器,并将40nm工艺、高密度和高性能收发器完美结合,从而使FPGA能更完善地用于视频、音频、 图像处理领域。
2.向低电压、 低功耗方向发展
现在,电子设计一个显著趋势是功耗特征变得日益关键,功耗已经成为电子系统开发中最关键考虑原因之一,并影响着最终产品体积、 重量和效率。FPGA器件内核电压呈不停降低趋势,经历了5V-3.3V-2.5V-1.8V-1.2V演变,未来将会更低。 工作电压降低使得芯片功耗也显著降低,
个人数字助理等。 3.向高速可估计延时方向发展
时间特征也是FPGA器件一个关键标志。因为在部分高速处理系统中, 为了确保系统稳定性,FPGA器件延时可估计性变得十分关键。用户在进行系统重构同时, 担心是延时特征会不会因重新布线而改变,是否将造成系统性能不稳定性,所以, 为了适合未来复杂高速电子系统要求,FPGA高速可估计延时也是一个发展趋势。
4.在FPGA器件内嵌入更多功效模块
现在,FPGA器件中已经广泛嵌入RAM/ROM等存放模块,嵌入了DSP模块、硬件乘法器等,可实现快速乘法累加操作,比DSP芯片快很多倍。
未来FPGA器件还将嵌入更多功效模块,实现更多复杂运算,
5.向模数混合可编程方向发
迄今为止,FPGA开发和应用大部分工作全部集中在数字逻辑上,
模拟电路及数模混合电路可编程技术在未来将得到深入发展。
2.2.2FPGA结构及其特点
FPGA结构通常分为三部分,可编程逻辑块,可编程I/O模块和可编程内部连线。
FPGA发展很快速,形成了多种不一样结构。按逻辑功效模块大小分类,
FPGA能够分为细粒度FPGA和粗粒度FPGA。细粒度FPGA逻辑功效块比较小,
资源能够充足利用,不过伴随设计密度增加,信号不得不经过很多开关,
路由延迟也快速增加,从而减弱了整体性能,造成速度降低;
能够用较少功效块和内部连线就能完成较复杂逻辑功效,易于取得很好性能,
粗粒度FPGA逻 辑 功 , 功 效 强 ,
可分为分段互联型FPGA和连续互连性、型FPGA两种。
分段互 连 型FPGA中 含 有多 个 不一 样 长度 金 属线 ,
各金属线段之间经过开关矩阵或反熔丝编程链接,走线灵活方便,
但走线延时无法估计;连续互连型FPGA是利用相同长度金属线,连接和距离远近无关,
布 | 局 | 走 | 线 | 是 | 固 | 定 | 和 | 可 | 估 | 计 | 。 | 依 | 据 | 编 | 程 | 方 | 法 | , |
FPGA可分为一次编程型和可反复编程型两类。一次编程型采取反熔丝开关元件,
含有体积小、集成密度高、 互连线特征阻抗低、 寄生电容小和高速度特点,
另外还含有加密位、防拷贝、 抗辐射、 抗干扰、 不需外接PROM或EPROM特点,
但只能一次编程。可反复编程型FPGA采取SRAM开关元件或快闪EPROM控制开关元件,
配置数据存放在SRAM或快闪EPROM中。SRAM型FPGA突出优点是可反复编程,
系统上电时,给FPGA加载不一样配置数据就能够完成不一样硬件功效,
甚至在系统运行中改变配置,实现系统功效动态重构。快闪EPROM型FPGA含有非易失性和可反复编程双重优点,但不能动态重构,功耗也较SRAM型高。
2.3VHDL介绍
2.3.1VHDL介绍
VHDL是一个硬件描述语言,它能够对电子电路系统和系统行为进行描述。基于这种描述,结合相关软件工具,能够得到所期望实际电路系统。
VHDL是VHSIC Hardwar DescriptionLanguage(VHSIC硬件描述语言)。VHSIC是HDL(超高 Very 速 集 成 High 电路硬 件 描 述 Integrated 语言 ) 缩 Circuit 写 , 是 在
它第一个规范版本为VHDL87, VHDL 93是其后续升级版本。
使用VHDL语言描述电路,能够进行综合和仿真。然而,值得注意是,尽管全部VHDL代码全部是可仿真,但并不是全部代码全部是可综合。VHDL语言被广泛使用基础原因在于它是一个标准语言,是和工具和工艺无关,
从 | 而 | 能 | 够 | 方 | 便 | 进 | 行 | 移 | 植 | 和 | 重 | 用 | 。 |
VHDL语言两个最直接应用领域是可编程逻辑器件和专用集成电路,其中可编程逻辑器件包含复杂可编程逻辑器件和现场可编程门阵列。一段VHDL代码编写完成后,用户能够使用可编程逻辑器件来实现整个电路。
VHDL语言和常规次序实施计算机程序不一样,VHDL从根本上将是并发实施。 所以,我们通常称之为代码, 而不是程序。在VHDL中, 只有在进程(PROCESS),
函数(FUNCTION)和过程(PROCEDURE)内部语句才是次序实施。
2.3.2VHDL代码结构
1.代码基础单元
一段独立VHDL代码最少包含3个组成部分:
库(LIBRARY)申明:列出了目前设计中需要用到全部库文件,如ieee,std和work等。
实体(ENTITY):定义了电路输入/输出引脚。
结构体(ARCHITECTURE):所包含代码描述了电路要实现功效。
2.代码语法结构
库申明:使用一个库之前, 需要首先对库进行申明。经过申明以后, 在设计中就能够调用库中代码了。库申明方法以下:
实体:是用来描述电路全部输入/输出引脚,其语法结构以下:
ENTITYentity_name IS
POQT (
Pore_name:signal_modelsignal_type;
Pore_name:signal_model signal_type;
…);
END entity_name;
端 | 口 | 信 | 号 | 模 | 式 | 是 | 以 | 下 | 4中 | 之 | 一 | : | IN,OUT,INOUT,BUFFER。 |
ENTITY名称选择没有严格要求,但须注意不要和VHDL保留关键字发生冲突。
结构体: 结构体中代码用来描述电路行为和实现功效,其语法结构以下:
ARCHITECTUREarchitecture_name OF entity_name IS
[declarations]
BEGIN
(code)
ENDarchitecture_name;
从语法结构中能够看到,一个ARCHITECTURE包含两部分:申明部分(可选),
用于对信号和常量等进行申明;代码部分(BEGIN和END之间部分),
用来 描述 电 路 行为 或工 功效 。 和 ENTITY一样 ,
能够采取除VHDL关键字以外任何名称为ARCHITECTURE命名,
而且许可和ENTITY含有相同名称。
设计者从系统整体要求出发,自上而下将系统内容细化, 2.3.3 VHDL语言设计硬件电路优点
最终将模块组合成完整整体设计。
2.VHDL含 | 有 | 多 | 层 | 次 | 描 | 述 | 和 | 仿 | 真 | 系 | 统 | 硬 | 件 | 功 | 效 | 能 | 力 | , |
能够从系统到门级电路不一样层次对数字进行建模和描述,
不一样描述还能够混合使用,大大简化了硬件设计任务,提升了设计效率和可靠性,
缩短了产品开发周期。
3.VHDL是 | 一 | 个 | 工 | 业 | 语 | 言 | , | 设 | 计 | 者 | , |
EDA开发工具供给商和IC芯片生产商全部要遵照这一标准,所以它含有设计和开发环境,
含有电路实现工艺和采取实现芯片无关特点,设计结果便于移植,交流和二次开发。
另外因为其语法严格, 是强类型语言, 所以包含安全性好, 也便于阅读。 | 迟 | , | |||||||||
4.VHDL即 | 支 | 持 | 传 | 输 | 延 | 时 | 也 | 支 | 持延 |
不仅能够很好地描述系统和电路逻辑功效,也能够真实地反应系统和电路时间特征。
5.VHDL能够支持多种不一样类型数字电路和系统设计。既支持同时电路也支持异步电路;既支持TTL电路,也支持CMOS电路;即能够采取CPLD芯片实现,也能够采取FPGA芯片实现。
2.4Quartus II
2.4.1QuartusⅡ介绍
QuartusⅡ是Altera企业在二十一世纪初推出可编程逻辑器件集成开发软件,这个软件是该企业前一代可编程逻辑器件集成开发软件MAX+PLUSⅡ更新换代产品。
QuartusⅡ集成开发软件支持可编程逻辑器件开发整个过程,它提供一个和器件结构五官设计环境。软件界面友好,
计,而且该软件也提供类似传统电子设计中绘制电路图输入方法。
当 | 使 | 用 | 原 | 理 | 图 | 输 | 入 | 方 | 法 | 时 | , |
设计者能够很方便地使用开发软件提供多种元件来提升设计及速度和设计质量。
2.4.2QuartusⅡ设计步骤
QuartusⅡ集 | 成 | 开 | 发 | 软 | 件 | 关 | 键 | 是 | 模 | 块 | 化 | 编 | 译 | 器 | 。 |
编译器包含功效模块有分析/综合器、适配器、 装配器、 时序分析器、 设计辅助模块和EDA网表文件生成器。
利用QuartusⅡ集成开发软件进行可编程逻辑器件开发全部过程包含以下步骤:设计输入、 综合、 布局布线、验证和仿真, 和可编程逻辑器件编程和配置。
QuartusⅡ集成开发软件功效模块和可编程逻辑器件开发过程之间关系图2-2所表示。
设计输入是将设计者所需要电路构思已开发软件要求形式表示出来。QuartusⅡ软件支持模块/原理图输入方法、文本输入方法、
Core输 | 入 | 方 | 法 | 和 | 第 | 三 | 方 | EDA工 | 具 | 输 | 入 | 方 | 法 | 等 | 。 |
QuartusⅡ软件同时许可用户在需要对器件编译或变成进行必需条件约束环境下,使用分配编辑器设定初始设计约束条件。
综 | 合 | 是 | 将 | HDL语 | 言 | 、 |
原理图等设计输入依据给定硬件结构组件和约束控制条件进行编译、优化、 转换和综合, 生成门级电路,或更底层电路描述网表文件,以供适配器实现。
适配 也 称为 布 局布 线 ,这个步骤利用适配器将逻辑综合生成网表文件映射到某一具体器件。该过程包含将设计逻辑和时序要求和器件可用资源相匹配;
选 择生成可用于时序仿真仿真文件和可用于编程编程文件。
仿 | 真 | 包 | 含 | 功 | 效 | 仿 | 真 | 和 | 时 | 序 | 仿 | 真 | 。 |
功效仿真实在不考虑期间延时理想情况下仿真设计项目,以验证其逻辑功效正确性,功效仿真又称前仿真。时序仿真是在考虑具体适配器多种延时情况下仿真设计项目,它是靠近真实器件运行特征仿真,时序仿真又称后仿真。
器 | 件 | 编 | 程 | 和 | 配 | 置 | 是 | 指 | 设 | 计 | 输 | 入 | 编 | 译 | 成 | 功 | 后 | , |
设计者试用器件编译器将编程文件下载到实际器件过程。
QuartusⅡ集成开发软件许可用户在开发过程中使用QuartusⅡ图形用户界面、EDA工具界面和命令实施界面。用户能够在整个开发过程中使用这些界面中任意一个,也能够在开发过程中不一样时骤中使用不一样界面。
上述任何一步犯错,均需要回到设计输入阶段纠正错误,
并重新按设计步骤进行设计。
2.5试验箱简述
本设计采取试验箱为LTE_EDA_02F型EDA/SOC试验开发系统,选择芯片为EP2C5Q208C8。相关FPGA/CPLD器件配置:
当在QuartusⅡ中完成设计后,就应该将所设计电路下载到CPLD芯片中,结适用户系统进行统一调试。针对CPLD器件不一样内部结构,Altera企业提供了不一样器件配置方法。Altera可编程逻辑器件配置可经过编程器、JATG接口在线编程及Altera在线配置三种方法进行。
ByteBlasterMV并口下载电缆,MasterBlaster串行/USB 通信电缆, Altera器件编程连接硬件包含ByteBlaster并口下载电缆,
BitBlaster串
ByteBlaster并口下载电缆提供两种下载模式:
1.标准串行模式(AS模式)——用来产品定型后,完成对FPGA代码固化,在下次上电后,能够自动对FPGA进行配置,使产品独立工作;
2.JTAG模式——含有工业标准JTAG边界扫描测试电路(符合IEEE1149.1: 1990标准),用来调试FPGA或NiosⅡCPU,多在产品开发早期使用。
3.1.1 出租车计价器设计要求 3.1总体设计
根据计价标准能实现计价功效;实现预置功效:能预置起步价、每公里收价、
行车加价里程;实现模拟功效:能模拟汽车开启、停止、 暂停等状态。
该计价系统可靠性高、成本低、 通用性强;该系统在不改变硬件电路前提下,
要含有能够重构系统功效,采取完全相同电路结构,
只 | 要 | 依 | 据 | 各 | 地 | 域 | 需 | 求 | 在 | VHDL程 | 序 | 中 | 设 | 置 | 各 | 参 | 数 | , | ||
就 | 能 | 够 | 适 | 应 | 各 | 地 | 域 | 出 | 租 | 车 | 不 | 一 | 样 | 计 | 价 | 标 | 准 | 需 | 要 | , |
还可实现依据各地域需求增加其它功效。
具体计费方法以下:
1.车 起步 开 始 计 价。
首先显示起步价(此次设计起步价分为7:00至22:00为10.00元,
22:00至7:00为15元),车在行驶3 km以内, 只收起步价。
2.在7:00至22:00行驶时,超出3km未达20km后在10元基础上每行驶1km车价加2元,
行驶旅程达成或超出20km后,车费变成按每公里3.3元开始计价;
在22:00至7:00行驶时,超出3km未达20km后在15元基础上每行驶1km车价加4元,
行驶旅程达成或超出20km后,车费变成按每公里5元开始计价。
3.车临时停止(行驶中遇红灯或中途临时停车)等候累计时间超出5分钟时,
按1元/分钟累计费用。
3.1.2总体框架设计
等待时间计数
分
频
模 数
码
管
计费模块
时钟
图3.1系统设计总框图
分频模块用来将试验系统所提供时钟进行分频,得到所需要时钟频率。
行驶旅程计数模块来统计旅程。当出租车开启并行驶过程中,
当初钟上升沿检测到公里信号(输入端clkout)为1时,
对旅程计数器个位和十位进行加法计数,并在累计旅程超出3km是,
让标志位enable为高电平,该信号将传给控制模块。
等 | 候 | 时 | 间 | 计 | 数 | 模 | 块 | 来 | 统 | 计 | 等 | 候 | 时 | 间 | 。 |
在出租车开启并停止等候过程中(即复位reset为0时,停止信号stop为0),
计数 器 在 时 钟上升 沿 进 行加 法计 数 ,
每60进制产生进位脉冲使分钟计数器个位和十位进行加法计数,
并在累计等候时间超出5分钟时,让标志位timecount为高电平,
该信号将传给控制模块。
计费模块用于出租车开启后,依据行驶旅程和停止等候时间计算费用。
该模块时钟使用控制模块输出信号。当出租车停车复位时,时钟控制模块为clk信号,
用于将费用计数器复位为起步价10元;当出租车处于行驶状态时,
时钟控制模块为满3km信号时enable,旅程每满1km,费用计数器加2元,
时钟控制模块为满20km信号时,旅程每满1km,费用计数器加3.3元,;
当出租 车 处于 停止 等候 状 态时 ,
时钟控制模块为满5分钟信号timecount,时间每满1分钟,费用计数器加1元。
控制模块为计数模块提供时钟信号。停止复位状态输出时钟信号clk;
公里数信号clkout。
3.1.3步骤图
系统工作步骤图图3.2所表示。系统工作步骤为:出租车载客后,
开启计价器即start为1,整个系统开始运行,进入初始化状态,即计程和计时从0开始,
计价从起步价开始,白天起步价为6.0元,晚上起步价为7.0元。
再依据pause信号判定行驶或是停止等候。若pause为0,表示行驶状态,
则计程器开始计数,当旅程超出3km后,假如是白天,计价器按每公里1.4元单价进行累加,
假如是晚上,计价器按每公里2.0元累加,不然计程器保持不变;当旅程超出20km后,
假如是白天,计价器按每公里2.0元单价进行累加,假如是晚上,计价器按每公里3.0元累加,
不然继续按3km后计价方法计价;若pause为1,便是停止等候状态, 则计时器开始加数,
当每超出5min后计价器加1元,不然计价器保持不变;出租车停止后, 按下stop键,
停止计程和计时;然后按下reset键,将全部计数器复位。
各计数器 | 1 | Reset 信号 | 行驶路程累 |
复位 | |||
0 | |||
Start 信号 | 计,等待时间 |
不变
Pause信号
等待时间累
积,行驶路程 Y
未至3km
不变
N
Y
计费器以每5分 计费器以每公 计费器以每公 计费器只显示计费器不变
钟1元累加 里2元累加 里3.3元累加 起步价
图3.2程序步骤图
3.2关键模块设计
3.2.1出租车总体模块设计
图3.3 出租车计价器设计顶层原理图
构建原理图方法:首先建立对应原理图文件。点击New-> Block
Diagram/Schematic File, 生成一个后缀名为.bdf文件。第二步,
打开将要生成元件主代码页面,然后选择File->Create/_Update -> Create Symbol Files for CurrentFile.在.bdf文件空白处左键双击一下,弹出一个Symbol窗口,在左边窗口处选择需要器件,在Project下是自己代码生成元件。然后将所添加元件按逻辑关系连接起来,最终加上output和input管脚。然后对管脚命名。
上图就是按上述方法所得到。其中计价,计程,计时,数据分配和尺寸大小选择模块全部使用相同时钟脉冲,均由分频模块将系统时钟经过分频后传送给各个模块。译码模块用于显示旅程和价钱。
Choose输入端口用于选择白天模式和晚上模式。 |
车轮直径(mm) | 520 | 540 | 560 | 580 |
DIP开关表示 | 00 | 01 | 10 | 11 |
对应计费圈数 | 640 | 610 | 580 | 550 |
图3.4车轮大小选择模块原理框图
开关sp控制不一样车型所应该给出计程圈数,达成所给圈数给出对应计程脉冲,
全部信号均为高有效。
clk为输入脉冲时钟信号,reset为复位键, stop为停止键,start为开始计价键,
3.2.3 计程模块设计
图3.5计程模块原理框图
管脚说明:reset为复位信号,clkout为里程计费脉冲,KM_CNT0~KM_CNT3为旅程十分位到百位输出。
当复位信号为‘1’时,里程百, 十,个, 十分位均被复位为‘0’;反之, clkout开始循环计数。当十分位为9时, 十分位清零,向个位进1, 个位为9时,
向十位进1,个位清零,同理,十位和百位计数方法同前。当计程为999.9公里时,达成最大计程范围,里程各位被清零。
3.2.4计时模块设计
stop为停止信号,pause为暂停信号。
当start=‘1’,stop=‘0’且pause=‘1’时,开始记间,当计时达成30秒时,timecount输出一个脉冲,然后重新开始计时。
3.2.5计费模块设计
图3.7计费模块原理框图
管脚说明:时钟信号CLK,里程计数脉冲clkout,计时计数脉冲timecount,
复 | 位 | 信 | 号 | reset, | chooose为 | 白 | 天 | 、 | 晚 | 上 | 选 | 择 | 输 | 入 | 端 | , |
KM_CNT0~KM_CNT3为旅程十分位到百位,MONEY0~MONEY3是费用角,元,十元,百元输出端。
所以需要旅程信号标志位enable,当enable为1时,说明此时所行旅程已经大于3km,
3km以内为起步价,大于3km以后,每行驶1km费用按price进行改变,
为晚上。 timecount以1元基准进行累加,在时钟信号下对计时脉冲进行累加,当达成一定数值时, 总价加1元,不然计时脉冲继续累加。 代码以下:
ELSIF timecount='1'THEN --每来一次计时脉冲计费加1
IF | MONEY_CN3="1001"AND | MONEY_CN2="1001"AND | MONEY_CN1="1001" | THEN-- |
费用等于999
MONEY_CN3<="0000";
MONEY_CN2<="0000";
MONEY_CN1<="0000";
MONEY_CN0<=MONEY_CN0;
ELSIF MONEY_CN3/="1001" AND MONEY_CN2="1001"AND MONEY_CN1="1001" THEN--
费用大于99小于999
MONEY_CN3<=MONEY_CN3+"0001";
MONEY_CN2<="0000";
MONEY_CN1<="0000";
MONEY_CN0<=MONEY_CN0;
ELSIF MONEY_CN2/="1001"AND MONEY_CN1="1001"THEN MONEY_CN3<=MONEY_CN3;
MONEY_CN2<=MONEY_CN2+"0001";
MONEY_CN1<="0000";
ELSE MONEY_CN0<=MONEY_CN0;
MONEY_CN1<=MONEY_CN1+"0001";
MONEY_CN0<=MONEY_CN0;
END IF;
clkout计 | 价 | 方 | 法 | 为 | : | KM_CNT1>=4时 | , |
MONEY0和MONEY1和计价单价(PRICE0和PRICE1)对应进行相加,在相加过程会产生进位,设计中考虑了以下进位情况:
1.MONEY0和PRICE0相加没有进位,MONEY1和PRICE1相加没有进位;
2.MONEY0和PRICE0相加没有进位,MONEY1和PRICE1相加有进位;
3.MONEY0和PRICE0相加有进位,MONEY1和PRICE1相加没有进位;
4.MONEY0和PRICE0相加有进位,MONEY1和PRICE1相加有进位。
代码见附录。
3.2.6数据分配模块设计
在时钟信号CLK控制下,将里程信号百位十位个位和十分位, 图 3.8数据分配模块原理框图
需要用3位选择信号SEL0~SEL2,还有小数点信号dp 和输出信号d。
最终利用人视觉暂留,提升扫描频率,这么人眼就看到稳定里程和费用信号显示。
3.2.7译码模块设计
图 3.9 译码模块原理框图
译码模块输入为4位BCD码,输出是共阴极七段数码管7位,输入,输出一一对应,将输入信号,正确在数码管上显示出来,让人更为直观看到我们所想要看到结果。
3.2.8分频模块设计
这就需要对已经有信号进行分频。
第4章仿真及调试结果4.1仿真结果
4.1.1出租车总体模块仿真波形
图 4.1 出租车总体模块仿真波形图
伴随脉冲数增加,八段数码管也在发生对应改变,且显示结果和预期一样。
4.1.2车轮大小选择模块仿真波形
图 4.2 车轮大小选择模块仿真波形图
从 | 波 | 形 | 图 | 中 | 能 | 够 | 看 | 出 | 伴 | 随 | sp不 | 一 | 样 | , |
clkout输出脉冲所需系统时钟脉冲数也会发生改变。当sp由00变为10是,
clkout输出脉冲所需系统时钟脉冲数较之前降低。
4.1.3计程模块仿真波形
图4.3计程模块仿真波形图
KM_CNO为旅程输出十分位,KM_CN1为旅程输出个位,KM_CN2为旅程输出十位,
KM_CN3为旅程输出百位。当clkout输出10个脉冲后,KM_CNO自动加1,
当 | KM_CNO为 | 1001即 | 达 | 成 | 最 | 大 | 值 | 9时 | , | KM_CN1加 | 1; | 同 | 理 | , |
KM_CN2和KM_CN3也是形同原理进行计数。
4.1.4计时模块仿真波形
图4.4计时模块仿真波形图
该 | 模 | 块 | 是 | 当 | 出 | 租 | 车 | 处 | 于 | 等 | 候 | 状 | 态 | 时 | 用 | 来 | 计 | 价 | 。 |
从波形图中能够很轻易看出当pause为1时,(start为1且stop和reset为0),当系统时钟输出60个脉冲后timeout输出一个脉冲。和设计要求符合。
4.1.5计费模块仿真波形
图 4.5计费模块仿真波形图
波形图显著显示当旅程出在2km以内(即KM_CN0=0000,KM_CN1=0010, KM_CN2=0000, KM_CN3=0000),只显示起步价,在2km以外(即KM_CN0=0000,KM_CN1=0011, KM_CN2=0000, KM_CN3=0000),按每公里1.4元计价, 5km以外(即KM_CN0=0000,KM_CN1=0110, KM_CN2=0000, KM_CN3=0000),
按每公里2元计价。 等候1min中价格加1。
4.1.6数据分配模块仿真波形
图4.6数据分配模块仿真波形图
在时钟信号CLK控制下,将里程信号百位十位个位和十分位,
百元信号输入端,KM_CNT0~KM_CNT3为里程十分位到里程百位输出。在SEL为0、1、
还有费用信号值分时输出。其中, MONEY~MONEY3分别是费用角,元, 十元,
4.1.7 译码模块仿真波形
图 4.7译码模块仿真波形图
从该波形图能够看出八段数码显示管输出值是伴随输入d改变而相对改变。即: 1.当d=“0000”时数码管输出0;当d=“0001”时数码管输出1;2.当d=“0010”时数码管输出2;当d=“0011”时数码管输出3;
3.当d=“0100”时数码管输出4;当d=“0101”时数码管输出5;4.当d=“0110”时数码管输出6;当d=“0111”时数码管输出7;5.当d=“1000”时数码管输出8;当d=“1001”时数码管输出9。
4.1.8分频模块仿真波形
图4.8分频模块仿真波形图
4.2 管脚分配及说明 该波形图显示是输入脉冲频率是输出脉冲频率500倍。
图4.9管脚分配图
choose分配管脚为28,对应开发板K1;reset分配管脚为27,对应开发板K2;sp[1]分配管脚为168,对应开发板K3;sp[0]分配管脚为169,对应开发板K4;start分配管脚为165,对应开发板K5;stop分配管脚为162,对应开发板K6;
pause分配管脚为161, 对应开发板K7。
4.3调试结果及分析
显示结果是按以下方法所显示:白天起步价6元,晚上起步价7元;2km以内只显示起步价,2km~5km内白天每公里按1.4元计价,晚上按每公里2元计价,5km以外白天每公里按2元计价,晚上按每公里3元计价收费;等候1min费用加1元。
图4.11 晚上计价器起步价显示图
图4.11是reset键为0,K1—choose键为1时,表示现在是晚上,
计价器要根据晚上计价方法开始计价。
图4.12白天计价器起步价显示图
图4.12是reset键为0,K1—choose键为0时,说明现在是白天,
以上三张图片均是在K5—start键位0时所显示结果,然后计价器需根据白天计价方法工作,显示起步价为6元。
当计价开始后,不一样时间和不一样旅程所对应单价不一样,下面四张图片是当按下start键后,
下面是各个单价简明说明:单价1.1是1.4元,单价1.2是2.0元,单价2.1是2.0元,
单价2.2是3.0元。
图4.132km内计价器只显示起步价显示图
上图所显示结果是在choose键为0时出租车行驶了600m后所显示,因为未超出设置起始旅程2km,所以只显示6.0元。
总价=int(旅程-2.0)×(里程单价1.1)+起步价+暂停时间×暂停单价,
即7.4元=int(3.3-2.0)*1.4元+6.0元+0*1元。所以总价和旅程关系正确。
该 | 图 | 图4.15 未暂停时5km外晚上计价器按每公里3元计价显示图 | , | ||||||
是 | 在 | 图 | 4.14基 | 础 | 上 所 | 得 |
当行驶了3km未至4km时choose键由0变为1所得到结果。所以结果分析为:总价=int(旅程-5.0)×(里程单价2.1)+(5.0-3.0)×里程单价1.2+(3.0-2.0)×(里程单价1.1)+起步价+暂停时间×暂停单价,即
14.4元=int(6.3-5.0)*3元+(5.0-3.0)*2.0+(3.0-2.0)*1.4+6.0元+0*1元。
所以总价和旅程关系正确。和图示结果相符。
该结果是在图4.15基础上所得结果。当行驶至6.7km时按下了K7—pause键,
表明出租车处于等候状态。
结果分析:总价=14.4+暂停时间×暂停单价,即15.4元=14.4+0*1元。
第5章总结
毕 | 业 | 设 | 计 | 是 | 对 | 我 | 这 | 四 | 年 | 来 | 所 | 学 | 专 | 业 | 知 | 识 | 检 | 验 | , |
不仅让我对这四年中所学知识进行了综合,还让我温习了部分已经遗忘专业知识,同时增加部分实践经验,经过自己努力,期望以后能够为社会做出一点贡献。
毕业设计我选择是基于FPGA出租车计价器设计。此次设计采取VHDL硬件描述语言,
按自顶向下方法,将设计系统分成七个相对独立模块分别设计,包含分频模块,车型选择模块,计时模块,计程模块,计费模块,数据分配模块和译码显示模块,用QuartusII软件进行各模块仿真得其波形,直到各个模块功效仿真全部经过后,再将其合成整体,最终进行综合仿真。第一章叙述出租车计价器背景,研究现实状况和意义,第二章是对所用语言、使用芯片、仿真软件概述,第三章是对出租车计价器设计软件设计第四章是仿真及调试,第五章做最终总结。
在实际设计过程中,我碰到很多问题。比如说仿真软件QuartusII不熟悉, 以致总体模块顶层编译犯错,这种问题还轻易处理,给我印象最深是设计程序在参考已经有好多资料后,根据设计要求经过加工整合后,看着波形仿真也全部没有太大问题,不过下载到开发板上进行硬件验证时,发觉里程和所产生费用存在很大偏差,而且还存在跳变, 开始一直感觉很迷惑,
对比出现异常几组数据,得出结论是, 控制条件给出不合理,经过修改控制条件,使得计费和里程基础一致,不过每次跳变却不是在整公里处跳变,经过仔细分析, 发觉是,计数初始状态时0, 而到整里程改变,计数从0开始到2.9公里实际上已经是3公里了,为了让人看到更直观, 更符合常理,将计数初值进行重置就能够处理。出现问题远不止这些,还有论文排版问题; 论文只具初稿,无实际内容支撑。
后在指导老师指导和同学帮助下,和到网上查找资料实践,逐步完成了各项内容修改。
出租车计价器在当今还是比较热门,出租车计价器计数脉冲来自时钟脉冲信号,脉冲送至计数器; 动态扫描脉冲由时钟提供,将单位脉冲看做行驶单位公里数,并在此基础上进行计费和显示。设计中考虑了白天和晚上计费单价和起步价差异,经过选择信号端对其进行选择,这么就能够表现不一样情况下,不一样计费需求,
同时还考虑到但碰到红灯,紧急情况或是乘客要求临时停车情况,
这里采取等候时间所产生费用来处理这个问题,。我们全部知道,不一样车型,车轮直径也不一样,那么,行驶100m(里程最小分辨率为0.1KM)所需要计脉冲个数,即车轮所需要转过圈数也会有所差异,设计中给出四种车型所对应计费信息。
此设计只是个大约设计,设计不完善地方肯定有很多,费用,里程,等候时间,目前时间等,全部受所采取开发平台限制,经过数码管不能很好同时显示出来同时,
也 | 没 | 考 | 虑 | 过 | 桥 | 费 | , | 油 | 价 | 波 | 动 | 所 | 产 | 生 | 费 | 用 | 等 | , |
计费脉冲信号也没有经过采集电机转动带动传感器所产生信号得到。针对这些问题,能够经过采取适宜液晶显示器进行显示,就能够将需要显示信息全部显示出来,增加计时模块,即能够显示目前时间。增加电机驱动和传感器模块,就能够愈加好模拟。
不过从各个模块仿真波形能够看出本设计满足所要设计出租车基础要求。即实现了出租车计价器按里程自主计费,模拟了不一样车轮下,计费多种状态。
关键围绕以FPGA控制器为关键软件设计进行研究,实现了出租车记价器功效。经过时序仿真能够看出,计价器实现了预制参数自动计费、自动计程功效;实现起步价、每公里收费参数选择。因为采取了FPGA,整机功耗小、抗干扰能力强、系统稳定、工作可靠、升级方便。同时采取EDA技术很大程度上缩短了开发周期,提升了产品可靠性能、缩小了产品体积,在工程应用方面显示出较大潜力。
经过本文给出出租车计价器设计经过软硬结合试验验证,对芯片设计有以下几点结论:
1.即使VHDL语言和C语言很相同,不过用其语言必需含有一定专业知识;用后者设计思想实现,并不一定能经过最终逻辑综合和编译,掌握二者区分, 相互借鉴设计思想,指导自己愈加好了解掌握一门语言;
2.在设计中, 尤其是设计计数器时,一定要搞清同时和异步计数器区分,
设计中时序问题在一定程度上也影响设计结果;
3.在对芯片进行配置时候,应该注意*.Sof文件用于利用编程电缆ByteBlaster对FPGA芯片进行配置.而*.pof用于配置EPROM.(EPROM只能写入一次),所以在设计时候,先可用编程电缆调试无误后,在写入EPROM中;
4.用QuarterII软件,能够很轻易贯穿TOP—DOWN(自顶向下)设计思想,图形化设计。首先,分模块进行设计,各模块相对独立,能够有多人参与设计,缩短了设计周期,降低了成本,很大程度上提升了设计效率;其次,能够愈加好地掌握设计开发平台,了解其设计思想,提升自我能力。
最终, 珍爱时间,把握机会, 借每次实践机会,不停提升自己能力,让自己在为实现人生理想和人生价值不停奋斗!让自己在人生道路上越走越远,生活越来越美好!
致谢
本毕业设计论文是在导师悉心指导下完成。在整个毕业设计过程中,老师不停引导我们,帮助我们梳理论文思绪,耐心地给我解释部分细节上、我不了解问题,并提出部分新问题,使得我对毕业设计课题能够有更深入思索,帮助我顺利完成毕业设计和论文。
毕业论文正代表着大学终止,完成它现有一个收获感,又有一个失落感, 导师渊博专业知识,严谨治学态度, 精益求精工作作风,诲人不倦高尚师德,严以律己、宽以待人高尚风范,朴实无华、平易近人人格魅力对我影响深远。不仅使我树立了远大学术目标、掌握了基础研究方法,还使我明白了很多待人接物和为人处世道理。
在此,我还要感谢同学对我帮助,这段时间我们之间相互协作,不仅促进了毕设顺利完成,同时也促进我们之间友谊。
最终,感谢全部支持过我、帮助过我老师、好友和同学们,祝福大家全部会有一个美好而又光明未来。
参考文件
[2]杨晓慧, 杨旭FPGA系统设计和实例【M】人民邮电出版社. [1]褚振勇, 齐亮等FPGA设计及应用【M】西安电子科技大学出版社.
电子工业出版社 . [4]王传新FPGA设计基础【M】高等教育出版社.
[5]周淑阁FPGA/CPLD系统设计和应用开发【M】.电子工业出版社.
[6]侯 | 伯 | 亨 | , | 顾 | 新 |
VHDL硬件描述语言和数字逻辑电路设计【M】西安电子科技大学出版社1998.
[7]赵强,许杰电子电路EDA技术【M】西安电子科技大学出版社.
[8]江思敏VHDL数字电路及系统设计【M】.北京:机械工业版社.
[9]谭会生,瞿遂EDA技术综合应用实例和分析【M】.西安:西安电子科技大学出版社.[10]姜雪松,吴钰淳.VHDL设计实例和仿真【M】.机械工业出版社 .
[11](巴西) VolneiA.Pedroni.Circuit Design with VHDL【M】北京:电子工业出版社 . [12]张昌凡可编程逻辑器件及VHDL设计技术【M】.广州:华南理工大学出版社 .
[13]雷伏容VHDL电路设计【M】.北京清华大学出版社 .
[14]李精华,李燕EDA技术和VHDL程序设计【M】.桂林:广西师范大学出版社
[15]肖鹏,陈伟民一个新型多功效出租车计价器方案设计【J】.自动化和仪器仪表.
[16]胡大友新型出租车计价器模块应用【J】.国外电子元器件1995
[17]路而红专用集成电路设计和电子设计自动化【M】.北京:清华大学出版社.
[18]王金明数字系统图设计和VHDL【M】.北京:电子工业出版社
[19]王振红VHDL数字电路设计和应用实践教程【M】北京:机械工业出版社.
[20]赵世强 许杰, 荆炳礼,王兴亮, 王瑜电子电路EDA技术【M】.西安:西安电子科技大学出版社 .[21]张原可编程逻辑器件设计及应用【M】.北京:机械工业出版社.
附录
源代码
Ⅰ车轮大小选择模块代码
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYsize IS
PORT( --定义输入输出端口
CLK:IN STD_LOGIC; --系统时钟输入 reset:IN STD_LOGIC; --系统复位输入
start,stop:IN STD_LOGIC; --出租车开启/停止
sp:IN STD_LOGIC_vector(1 DOWNTO 0);--出租车车轮大小选择
pause:IN STD_LOGIC;
clkout:OUT STD_LOGIC --每行驶100m产生一个脉冲
);
END size;
ARCHITECTURE rtl OF size IS
TYPEstates IS(s0,s1); --定义出租车状态,s0表示停止状态, s1表示运行状态 signal state:states;
signal cnt:integer range 0 to620;--暂存速度值 signalkinside:integer range 0 TO 620; --设定档位计数值
U1:PROCESS(sp) BEGIN
BEGIN
CASE sp IS --车轮大小选择
WHEN "00"=>kinside<=620; --车轮直径520mm WHEN "01"=>kinside<=600;--车轮直径540mm WHEN "10"=>kinside<=580;--车轮直径560mm WHEN "11"=>kinside<=560; --车轮直径580mm END CASE;
END PROCESS U1;
U2:PROCESS(CLK,reset,stop,start,kinside,pause) BEGIN
IF reset='1' THEN --复位清零
state<=s0;
ELSIF CLK'EVENT AND CLK='1' THEN -- 时钟下降沿到时,状态转换 CASE state IS
WHEN s0=> --出租车停止状态
cnt<=0; --速度为0
clkout<='0'; --100m输出信号为低电平
IF start='1' THEN
state<=s1;--出租车运行状态
ELSE --不然出租车未开启
END IF; state<=s0;
IF stop='1' THEN --出租车停止,乘客已达目标地(不收费)
state<=s0;
ELSIF pause='1' THEN --出租车暂停(需收费)
state<=s1;
ELSIF cnt=kinside THEN --出租车在运行时,判定目前计数值
cnt<=0; --100m已达成,计数值清零
clkout<='1'; --产生速度计数脉冲
state<=s1;
ELSE --100m未达成,计数值继续加1
cnt<=cnt+1;
state<=s1;
END IF;
END CASE;
END IF;
END PROCESSU2;
END rtl;
Ⅱ 旅程行驶模块代码
libraryieee;
use ieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entity jicheng isport(reset,clkout:in std_logic;
end jicheng; architecture rtl of jicheng is
signalCNT0,CNT1,CNT2,CNT3: std_logic_vector(3 downto 0);
begin
PROCESS(clkout,reset) --敏感信号发生改变时,开启进程
BEGIN
IF reset='1'THEN --复位信号有效
CNT0<="0000"; --里程清零
CNT1<="0000";
CNT2<="0000";
CNT3<="0000";
ELSIF clkout'EVENT AND clkout='1' THEN --每100m信号上升沿抵达
IFCNT3="1001" AND CNT2="1001" AND CNT1="1001"ANDCNT0="1001" THEN CNT0<="0000"; --里程清零
CNT1<="0000";
CNT2<="0000";
CNT3<="0000";
ELSIF CNT2="1001" AND CNT1="1001"AND CNT0="1001"THEN
CNT0<="0000"; --里程十分位清零
CNT1<="0000"; --里程个位清零
CNT2<="0000"; --里程十位清零
ELSIF CNT1="1001"AND CNT0="1001" THEN CNT3<=CNT3+"0001"; --里程百位加1
CNT2<=CNT2+"0001";--里程十位加1
CNT3<=CNT3; --里程百位不变
ELSIF CNT0="1001" THEN
CNT0<="0000"; --里程十分位清零
CNT1<=CNT1+"0001";--里程个位加1
CNT2<=CNT2;--里程十位不变
CNT3<=CNT3; --里程百位不变
ELSE
CNT0<=CNT0+"0001";--里程十分位加1
CNT1<=CNT1;--里程个位不变 CNT2<=CNT2;--
里程十位不变
CNT3<=CNT3; --里程百位不变
ENDIF;
ENDIF;
KM_CNT0<=CNT0;--取十分位里程输出 KM_CNT1<=CNT1;--取个位里程输出 KM_CNT2<=CNT2;--取十位里程
KM_CNT3<=CNT3;--取百位里程
ENDPROCESS;
ENDrtl;
Ⅲ 暂停时计时模块代码
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; LIBRARY IEEE;
ENTITY jishi IS
PORT( --定义输入输出端口
CLK:IN STD_LOGIC; --系统时钟,500hz, 计数30000次即1分钟
reset,start:IN STD_LOGIC;--复位,开启
stop:INSTD_LOGIC;
pause:IN STD_LOGIC;
timecount:OUTSTD_LOGIC --计时收费脉冲
);
END jishi; ARCHITECTURE rtl OF jishi IS
TYPE states IS(s0,s1,s2); --s0表示车未开启,s1表示车已开启, S2车暂停
signal state:states;
signal time_cnt:integer RANGE 0 TO30000;
BEGIN
PROCESS(CLK,reset,start,stop,pause)
BEGIN
IF reset='1' THEN --系统复位
state<=s0; --出租车恢复原始状态
ELSIF CLK'EVENT AND CLK='1' THEN -- 每来一个系统时钟脉冲
CASE state IS WHEN s0=> --出租车未开启,不需计时(不需计时收费)
IF start='1' THEN
state<=s1;--出租车开启,不需计时(不需计时收费)
ELSE
state<=s0;
ENDIF;
WHEN s1=> --出租车开启
IF pause='1' THEN --出租车开启,处于停止状态(需收费)
state<=s2;
ELSE
time_cnt<=0;
state<=s1;
END IF;
WHEN s2=> --计时收费
time_cnt<=time_cnt+1; --计时器加1
timecount<='0';--不产生计时收费信号
IF time_cnt=30000 THEN--计时达成一分钟
time_cnt<=0; --计时清零
timecount<='1';--产生收费脉冲
ELSIF stop='1'THEN --未达成30000个CLK,出租车停止时
state<=s0; --不计时收费
ELSIF pause='1'THEN --出租车空挡等候时,进行计时收费 state<=s2;
timecount<='0';
ENDIF;
END CASE;
END IF;
END PROCESS;
ENDrtl;
Ⅳ 计价模块
LIBRARYIEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY jifei IS
PORT( --定义输入输出端口
CLK:IN STD_LOGIC; --系统时钟脉冲输入
clkout:IN STD_LOGIC;--100m里程脉冲
reset:IN STD_LOGIC;--复位
choose:IN STD_LOGIC;--白天/晚上选择键
timecount:IN STD_LOGIC;--计时收费脉冲
KM_CNT0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
KM_CNT1:INSTD_LOGIC_VECTOR(3 DOWNTO 0);--里程个位
KM_CNT2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);--里程十位 KM_CNT3:IN STD_LOGIC_VECTOR(3 DOWNTO 0);--里程百位
MONEY2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--费用(十位)
MONEY3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--费用(百位)
ENOUT: OUT STD_LOGIC
);
END jifei;
ARCHITECTURErtl OF jifei IS
SIGNAL MONEY_CN0: STD_LOGIC_VECTOR(3 DOWNTO0);--暂存费用(十分位)
SIGNAL MONEY_CN1: STD_LOGIC_VECTOR(3 DOWNTO 0);--暂存(个位)
SIGNAL MONEY_CN2: STD_LOGIC_VECTOR(3 DOWNTO 0);--暂存(十位)
SIGNAL MONEY_CN3: STD_LOGIC_VECTOR(3 DOWNTO 0);-- 暂存(百位)
SIGNAL PRICE0: STD_LOGIC_VECTOR(3 DOWNTO 0);-- 暂存单价(十分位)
SIGNAL PRICE1: STD_LOGIC_VECTOR(3 DOWNTO 0);-- 暂存(个位)
SIGNAL ENABLE:STD_LOGIC;
BEGIN
ENOUT<=ENABLE;
U1:PROCESS(KM_CNT0,KM_CNT1,MONEY_CN2,choose)--确定PRICE单价
BEGIN
IF (KM_CNT3="0000" AND KM_CNT2="0000"AND KM_CNT1<"0010" ) AND KM_CNT0>="0000"THEN --没有超出2KM
ENABLE<='0';
IF choose='0'THEN --假如为白天 PRICE1<="0110"; --起步价为6元
PRICE1<="0111";--假如为晚上
PRICE0<="0000";--起步价为7元
END IF;
ELSIF (KM_CNT3/="0000" OR KM_CNT2/="0000")OR KM_CNT1>="0010" THEN
ENABLE<='1';
IF(KM_CNT3="0000" AND KM_CNT2="0000"AND KM_CNT1<="0101" ) THEN IF choose='0'THEN --假如为白天
按1.4元/KM计费 | ELSE | PRICE1<="0001";--超 | 出 | 2KM时 | , | |
PRICE0<="0100"; |
| |||||
|
PRICE1<="0010";--假如为晚上
PRICE0<="0000";--超 | 出 | 2KM时 | , |
按2.0元/KM计费
ENDIF;
ELSE
IF choose='0'THEN --假如为白天
PRICE1<="0010";--超出5KM时,按2元/KM计费 PRICE0<="0000";
ELSE
PRICE1<="0011";--假如为晚上 PRICE0<="0000";--超 出 5KM时 ,按3.0元/KM计费
ENDIF;
END IF;
ENDPROCESS U1;
U2:PROCESS(reset,clkout,CLK,choose,PRICE1,PRICE0,ENABLE)VARIABLE clkout_cnt:INTEGER RANGE 0 TO 10:=0;
BEGIN
IF reset='1'THEN --系统复位
MONEY_CN0<="0000";
MONEY_CN1<="0000";
MONEY_CN2<="0000";
MONEY_CN3<="0000";
ELSIF CLK'EVENT AND CLK='1'THEN --每来一次系统时钟
IF (ENABLE='0') THEN
MONEY_CN3<="0000";
MONEY_CN2<="0000";
MONEY_CN1<=PRICE1;
MONEY_CN0<=PRICE0;
ELSIF timecount='1'THEN --每来一次计时脉冲计费加1
IF MONEY_CN3="1001"AND MONEY_CN2="1001"ANDMONEY_CN1="1001" THEN--费用等于999
MONEY_CN3<="0000"; MONEY_CN2<="0000";
ELSIF MONEY_CN3/="1001"AND MONEY_CN2="1001"ANDMONEY_CN1="1001" THEN--费用大于99小于999
MONEY_CN3<=MONEY_CN3+"0001";
MONEY_CN2<="0000";
MONEY_CN1<="0000";
MONEY_CN0<=MONEY_CN0;
ELSIF MONEY_CN2/="1001"ANDMONEY_CN1="1001" THEN
MONEY_CN3<=MONEY_CN3;
MONEY_CN2<=MONEY_CN2+"0001"; MONEY_CN1<="0000";
MONEY_CN0<=MONEY_CN0;
ELSE
MONEY_CN3<=MONEY_CN3;
MONEY_CN2<=MONEY_CN2;
MONEY_CN1<=MONEY_CN1+"0001";
MONEY_CN0<=MONEY_CN0;
END IF;
ELSIF(clkout='1'ANDENABLE='1') THEN
IF clkout_cnt=10 THEN --计程1KM
clkout_cnt:=1;--超出2KM后,每公里按PRICE1和PRICE0计价
IF MONEY_CN3>"1001"THEN MONEY_CN3<="0000";
IF MONEY_CN2>"1001"THEN
MONEY_CN2<="0000";
MONEY_CN3<=MONEY_CN3+"0001";
ELSIFMONEY_CN2="1001"THEN
IF(MONEY_CN1+PRICE1>"1001")THEN
IF(MONEY_CN0+PRICE0>"1001")THEN
MONEY_CN0<=MONEY_CN0+PRICE0-"1010";
MONEY_CN1<=MONEY_CN1+PRICE1-"1001";
MONEY_CN2<="0000";
MONEY_CN3<=MONEY_CN3+"0001";
ELSE
MONEY_CN0<=MONEY_CN0+PRICE0;
MONEY_CN1<=MONEY_CN1+PRICE1-"1010";
MONEY_CN2<="0000";
MONEY_CN3<=MONEY_CN3+"0001";
END IF;
ELSIF (MONEY_CN1+PRICE1="1001")THEN
IF(MONEY_CN0+PRICE0>"1001")THEN
MONEY_CN0<=MONEY_CN0+PRICE0-"1010";
MONEY_CN1<="0000";
MONEY_CN2<="0000"; MONEY_CN3<=MONEY_CN3;
MONEY_CN1<=MONEY_CN1+PRICE1;
MONEY_CN2<=MONEY_CN2;
MONEY_CN3<=MONEY_CN3;
END IF;
ELSIF (MONEY_CN1+PRICE1<"1001")THEN
IF (MONEY_CN0+PRICE0>"1001")THEN
MONEY_CN0<=MONEY_CN0+PRICE0-"1010";
MONEY_CN1<=MONEY_CN1+PRICE1+"0001";
ELSE
MONEY_CN0<=MONEY_CN0+PRICE0; MONEY_CN1<=MONEY_CN1+PRICE1;
END IF;
END IF;
ELSIF MONEY_CN2<"1001"THEN
IF(MONEY_CN1+PRICE1>"1001")THEN
IF(MONEY_CN0+PRICE0>"1001")THEN
MONEY_CN0<=MONEY_CN0+PRICE0-"1010"; MONEY_CN1<=MONEY_CN1+PRICE1-"1001";
MONEY_CN2<=MONEY_CN2+"0001";
ELSE
MONEY_CN0<=MONEY_CN0+PRICE0; MONEY_CN1<=MONEY_CN1+PRICE1-"1010";
ELSIF(MONEY_CN1+PRICE1="1001")THEN
IF(MONEY_CN0+PRICE0>"1001")THEN
MONEY_CN0<=MONEY_CN0+PRICE0-"1010";
MONEY_CN1<="0000";
MONEY_CN2<=MONEY_CN2+"0001";
MONEY_CN3<=MONEY_CN3;
ELSE
MONEY_CN0<=MONEY_CN0+PRICE0;
MONEY_CN1<=MONEY_CN1+PRICE1; MONEY_CN2<=MONEY_CN2;
MONEY_CN3<=MONEY_CN3;
END IF;
ELSIF (MONEY_CN1+PRICE1<"1001")THEN
IF (MONEY_CN0+PRICE0>"1001")THEN
MONEY_CN0<=MONEY_CN0+PRICE0-"1010"; MONEY_CN1<=MONEY_CN1+PRICE1+"0001"; ELSE
MONEY_CN0<=MONEY_CN0+PRICE0;
MONEY_CN1<=MONEY_CN1+PRICE1;
END IF;
END IF; END IF;
clkout_cnt:=clkout_cnt+1;
END IF;
END IF;
END IF;
MONEY3<=MONEY_CN3;
MONEY2<=MONEY_CN2;
MONEY1<=MONEY_CN1;
MONEY0<=MONEY_CN0;
END PROCESS U2;
END rtl;
Ⅴ 数据分配模块代码
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYscan IS
PORT(CLK:INSTD_LOGIC;
MONEY0,MONEY1,MONEY2,MONEY3,KM_CNT0,KM_CNT1,KM_CNT2,KM_CNT3:INSTD_LOGIC_VECTOR(3 DOWNTO 0);
SEL:BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0); dp:OUT STD_LOGIC;
END; ); ARCHITECTURE behave OF scan IS
BEGIN
PROCESS(CLK)
BEGIN
IF(CLK'EVENT ANDCLK='1')THEN
IF SEL<"111"THEN
SEL<=SEL+1;
ELSE SEL<="000";
END IF; |
|
END PROCESS;
PROCESS(SEL,MONEY0,MONEY1,MONEY2,MONEY3,KM_CNT0,KM_CNT1,KM_CNT2,KM_CNT3) BEGIN
CASE SEL IS
WHEN"000"=>d<=KM_CNT3;dp<='0';
WHEN"001"=>d<=KM_CNT2;dp<='0';
WHEN"010"=>d<=KM_CNT1;dp<='1';
WHEN"011"=>d<=KM_CNT0;dp<='0';
WHEN"100"=>d<=MONEY3;dp<='0';
WHEN"101"=>d<=MONEY2;dp<='0'; WHEN"110"=>d<=MONEY1;dp<='1';
END PROCESS;
END behave;
Ⅵ 译码显示模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entityyima is
PORT(d:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
seg:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)
);
END yima;
ARCHITECTURE behave OF yima IS
BEGIN
process(d)
begin
case d is
WHEN"0000"=>seg<="0111111";
WHEN"0001"=>seg<="0000110";
WHEN"0010"=>seg<="1011011";
WHEN"0011"=>seg<="1001111"; WHEN"0100"=>seg<="1100110";
WHEN "0111"=>seg<="0000111";
WHEN "1000"=>seg<="1111111";
WHEN "1001"=>seg<="1101111";
WHEN OTHERS=>seg<="0111111";
end case;
END process;
END behave ;
Ⅶ 分频模块代码
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY fenpin IS
PORT(clk1:IN STD_LOGIC;
clk:OUT STD_LOGIC);
ENDfenpin;
ARCHITECTURE ONE OF fenpin IS
signal y:std_logic;
BEGIN
process(clk1)
variable temp:integerrange 0 to 499; begin
temp:=0;
y<=not(y);
else
temp:=temp+1;
end if;
end if;
CLK<=y;
endprocess;
end; |
|