EDA基于VHDL语言的出租车计价器课程设计.docx

上传人:b****1 文档编号:11013049 上传时间:2023-05-28 格式:DOCX 页数:31 大小:575.69KB
下载 相关 举报
EDA基于VHDL语言的出租车计价器课程设计.docx_第1页
第1页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第2页
第2页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第3页
第3页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第4页
第4页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第5页
第5页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第6页
第6页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第7页
第7页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第8页
第8页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第9页
第9页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第10页
第10页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第11页
第11页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第12页
第12页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第13页
第13页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第14页
第14页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第15页
第15页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第16页
第16页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第17页
第17页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第18页
第18页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第19页
第19页 / 共31页
EDA基于VHDL语言的出租车计价器课程设计.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

EDA基于VHDL语言的出租车计价器课程设计.docx

《EDA基于VHDL语言的出租车计价器课程设计.docx》由会员分享,可在线阅读,更多相关《EDA基于VHDL语言的出租车计价器课程设计.docx(31页珍藏版)》请在冰点文库上搜索。

EDA基于VHDL语言的出租车计价器课程设计.docx

EDA基于VHDL语言的出租车计价器课程设计

 

哈尔滨远东理工学院

EDA课程设计

 

题目:

基于VHDL语言出租车计费器

 

 

摘要

本文介绍了一种采用单片FPGA芯片进行出租车计费器的设计方法,主要阐述如何使用新兴的EDA器件取代传统的电子设计方法,利用FPGA的可编程性,简洁而又多变的设计方法,缩短了研发周期,同时使出租车计费器体积更小功能更强大。

本设计实现了出租车计费器所需的一些基本功能,计费包括起步价、行车里程计费、等待时间计费,同时考虑到出租车行业的一些特殊性,更注重了把一些新的思路加入到设计中。

主要包括采用了FPGA芯片,使用VHDL语言进行编程,使其具有了更强的移植性,更加利于产品升级。

关键词:

VHDL计费器FPGA

Abstract

ThispaperdescribestheuseofasinglechipFPGAforthedesignofaccounting-feemachine,mainlyonhowtousetheemergingEDAelectronicdevicesdesignedtoreplacetraditionalmethods,usingtheprogrammableFPGA,conciseandchangingthedesignWaystoshortenthedevelopmentcycle,sothattaxiaccounting-feemachineinasmallermorepowerful.Thedesignandimplementationofthetaxiaccounting-feemachineforsomebasicfunctions,includingbillingstartingprice,drivingmetered,thewaitingtimebilling,takingintoaccountthespecialnatureofsomeofthetaxiindustry,topaymoreattentiontoanumberofnewIdeasintothedesign.MainlyincludingtheuseoftheFPGAchip,theuseofVHDLprogramming,soastomakeitastrongertransplanted,andmoreconducivetoproductupgrades.

Keywords:

VHDL,accounting-feemachine,FPGA

前言

随着出租车行业的发展,对出租车计费器的要求也越来越高。

二十世纪后半期,随着集成电路和计算机技术的飞速发展,数字系统也得到了飞速发展,其实现方法经历了由分立元件、SSI、MSI到LSI、VLSI以及UVLSI的过程。

同时为了提高系统的可靠性与通用性,微处理器和专业集成电路(ASIC)逐渐取代了通用全硬件LSI电路,而ASIC以其体积小、重量轻、功耗低、速度快、成本低、保密性好而脱颖而出。

目前,业界大量可编程逻辑器件(PLD),尤其是现场可编程逻辑器件(FPLD)被大量地应用在ASIC的制作当中。

在可编程集成电路的开发过程中,以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术最新成果的电子设计自动化(EDA)技术主要能辅助进行三方面的设计工作:

IC设计,电子电路设计以及PCB设计理想的可编程逻辑开发系统能符合大量的设计要求:

它能够支持不同结构的器件,在多种平台运行,提供易于使用的界面,并且有广泛的特征。

EDA技术(即ElectronicDesignAutomation技术)就是依赖强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL(HardwareDdscriptionLangurage)为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、化简、分割、综合、布局布线以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。

它在硬件实现方面融合了大规模集成电路制造技术、IC版图设计、ASIC测试和封装、FPGA(GieldPeogrammableGateArray)/CPLD(ComplexProgrammableLogicDevice)编程下载和自动测试等技术。

VHDL的英文全名是VHSIC(VeryHighSpeedIntegratedCircuit)HardwareDescriptionLanguage,由IEEE(TheInstituteofElectricalandElectronicsEngineets)进一步发展,并在1987年作为“IEEE标准1076”公布。

从此VHDL成为硬件描述语言的业界标准之一。

第一部分设计要求

一、设计目的

为培养学生树立正确的设计思想和实事求是的工作作风,学习运用所学基础知识理论、专业知识、基本技能去分析和解决工程技术实际问题,提高学生的综合素质,使学生成为工程应用型合格人才,故进行《EDA技术及应用》的课程设计。

帮助学生全面熟悉、掌握VHDL语言基本知识,掌握利用VHDL语言对常用的的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用设计综合电路的能力,养成提供文档资料的习惯和规范编程的思想。

二、系统要求

设计一个简单的满足生活所需功能的出租车计费器。

三、功能描述

该计费器能实现计费功能。

车起步开始计费,首先显示起步价,起步费为3.00元,车在行驶3km以内,只收起步价。

车行驶超过3km后,每km加2元,车费一次累加。

当遇到红灯或客户需要停车等待时,则按时间计费,计费单价为每20s收费1元。

要求用2位数码管显示里程,2位数码管显示费用。

四、补充说明

(1).实现计费器预置功能,能够预置起步费、每公里收费、车行加费里程、计时收费等。

(2).可以模拟汽车行驶、停止、暂停等状态,并根据不同状态进行计费。

(3).以十进制显示出租车行驶路程与车费。

第二部分系统设计方案

出租车自动计价器的系统方框图如图2.1所示:

它有脉冲模块、控制模块、计程模块、计费模块及显示等模块组成

图2.1出租车自动计价器的系统方框图

控制模块将其他模块进行连接,是本次设计的核心。

它包含计程器、计时器、计价器,同时还有读取外部开关控制信号,提供当前显示信号与显示位选信号,从而周期性交替显示计价/计费信息。

计程器在非停车状态完成计程功能并产生里程计价信号,计时器在停车状态完成计时功能并产生等时计价信号。

计价器是设计的核心与难点,涉及到多种时钟信号,并有多种计费标准。

拟使用有限次高速脉冲发生器向一组级联的十进制计数器提供不同费率的计价脉冲,根据里程计价信号、等时计价信号、停车开关状态、当前计费结果等信号,综合考虑,挑选适合次数的计价脉冲,从而实现不同条件的不同计费。

计程器、计价器根据位选信号,输出相应数据的当前选中数字,由顶层模块根据显示数据类型变换信号进行选择,传输给显示模块。

显示模块由实验箱上的四个七段数码管、程序编写的一个七段数码管译码器程序组成。

程序是本次设计的核心部分,首先要有清晰的思路,然后去实现,程序流程如图2.2所示。

图2.2出租车自动计价器的程序流程图

本次设计首先在ispLEVER环境中对出租车自动计费器的各个部分利用VHDL描述语言予以设计,进行仿真,然后编写顶层模块将各个模块连接,并对相互之间的信号进行必要处理,从而实现整机功能,最后在实验箱上进行物理测试,寻找漏洞、调整参数,最终确定设计。

第三部分主要模块设计

一、计程计费模块

计程计费模块如图3.2所示:

图3.1计程计费模块

计程计费部分用于计算乘客所行使的公里数及金额。

计程器的量程为99公里,满量程自动归零;计费器的量程为99元,满量程自动归零。

计程计费数据送入显示模块进行译码,最后分别送至以公里和元为单位对应的数据管上显示。

二、显示模块

显示模块如图3.3所示:

 

图3.2显示模块

显示模块包含一个3进制计数器Cnt,位选Scan[0:

3],四位Data转换,七段数码管译码器Seg[0:

6],如图3.2所示。

当系统复位时,数码管一起显示0。

开始计费时,计费为03,计程为00。

具体程序代码详见附录。

三、控制模块

控制模块如图3.3所示:

Money1

 

Distance1

 

图3.3控制模块

控制模块部分用于计程计费模块的结合和衔接。

如图3.3所示,总输入有Clk,Start,Pause,Stop,总输出有Scan[0:

3]和Seg[0:

7],中间由信号Money1和Distance1连接。

具体程序代码见附录top部分。

该模块将计费数据、计程数据动态选择输出。

其中计费数据送入显示译码模块进行译码,最后送至十元、元为单位对应的数码管上显示,最大显示为99元;计程数据送入显示译码模块进行译码,最后送至以公里为单位的数码管上显示,最大显示为99公里。

第四部分仿真结果与分析

一、计程计费模块仿真

图4.1计程计费模块仿真结果

该模块的任务是当Start产生一个高脉冲后,计程计费开始,脉冲输入,进行计程计费,3公里内为3元,3公里后,每公里2元。

当暂停信号(Pause)为1时,计程停止,按每20秒1元计费,当停止信号(Stop)时为1时,计程计费清零。

如图4.1所示。

二、总体仿真

图4.2总体仿真结果

总体仿真如图4.2所示,当Start产生一个高脉冲后,计程计费开始,clk为基本输入时钟即基本车速,Clk1kHz为数码管位扫描脉冲,即配合Scan对计程计费各位逐位显示。

Seg[6:

0]即为数码管显示编码,根据计程计费模块数据进行显示。

具体程序代码见附录程序Display部分。

 

第五部分硬件调试

一、引脚锁定

做硬件验证之前需要清楚实验板上各键与各信号的链接情况,参照资料得出本设计中各引脚的对应情况,如图5.1所示:

图5.1引脚锁定表

 

二、硬件验证情况

做好引脚锁定后,连接线路后,打开硬件箱的电源,数码管有正确的数字显示,链接硬件箱与计算机开始验证。

操作运行实验结果完全符合要求。

通过仿真验证表明,本文所设计的出租车计价器能够正常地显示行驶的里程数和乘客应付的费用,符合预定的计费标准和功能要求,如图5.2所示:

图5.2实验箱实践结果

d.9公里时计费15元

c.7公里时计费11元

b.6公里时计费9元

a.5公里时计费7元

总结

短短一个月的EDA课程设计已经接近尾声了,我们从挑选课设题目,查阅资料,到研究出总体设计,详细设计,然后分工合作,再到最后的编程上机调试,修改程序,完善程序,收获颇多。

出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动,停止、暂停等功能,并设计动态扫描电路显示车费数目。

车暂停时停止计费。

若停止清零,等待下一次计费的开始。

出租车计费系统设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及FPGA器件速度快,使用方便,便于修改等特点。

本设计由于时间有限和经验的欠缺,不足之处还望老师予以指正。

在这一段时间里我们再次熟悉和增强了对VHDL语言的基本知识,熟悉利用VHDL语言对常用的的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来。

VHDL硬件描述语言打破了硬件和软件设计人员之间互不干涉的界限,可以使用语言的形式来进行数字系统的硬件结构、行为的描述,直接设计数字电路硬件系统。

通过编程、下载后,该芯片已经具备了原来需要使用复杂的数字电路实现的功能;更加了解和加深了对编制和调试程序的技巧,进一步提高了上机动手能力,培养了使用设计综合电路的能力,养成了提供文档资料的习惯和规范编程的思想。

本次的课程设计将各个单一的模块实现其功能后,学会通过原理图或顶层文件把各模块连接,从而实现对出租车自动计费。

课设注重的不仅是把理论知识巩固,而且应把理论和实际相结合,把知识应用到生活中。

在课设过程中,遇到了不少问题,数码管无法正常显示,计费不按要求等。

通过的对源代码的修改,发现了一些易忽略的细节。

课设考验的是思维逻辑能力,对知识的灵活应用,当然,合作精神是不可或缺的。

课设时间不长,要在短时间内完成绝不是个人力量能达到的,要学会集众人之精华,还要善于利用已有的工具为自己服务,开拓思维。

在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。

课程设计结束了,但是从中学到的知识会让我受益终身。

发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。

致谢

EDA课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础.

通过这次设计,我们在多方面都有所提高。

同时各科相关的课程都有了全面的复习,独立思考的能力也有了提高。

在这次设计过程中,体现出自己单独设计模具的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。

不经意间,这段时间的课程设计已经接近尾声。

在这次设计中,我学到了在设计这种思维很严密的报告中一定要按照老师给的要求和步骤一步一步的走下去。

自己在动手之前一定要先有一个总体的设计,总的框架图,这样在设计中不至于手忙脚乱的或者丢三落四。

在此感谢我们的老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪。

在此感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。

这次设计的每个细节和每个数据,都离不开老师您的细心指导。

而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。

参考文献

1)《EDA技术与VHDL》潘松黄继业编著清华大学出版社

2)《EDA实用技术》宋嘉玉孙丽霞编著人民邮电出版社

3)《VHDL电路设计实用技术》齐洪喜陆颖编著清华大学出版社

4)《EDA实用技术及应用》刘艳萍高振斌李志军编著国防工业出版社

5)《EDA应用技术》章彬宏主编北京理工大学出版社

6)《EDA应用技术及应用》姜波郭宏编著哈尔滨工业大学出版社

附录A电路图

一、电路图

二、PCB图

三、3D仿真图

附录B程序代码

一、top顶层文件

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

entitytopis

port(clk:

INSTD_LOGIC;

start:

INSTD_LOGIC;

stop:

INSTD_LOGIC;

pause:

INSTD_LOGIC;

clk1khz:

instd_logic;

scan:

outstd_logic_vector(3downto0);

seg7:

outstd_logic_vector(6downto0)

);

endtop;

architecturetttoftopis

componenttaxi

port(clk:

INSTD_LOGIC;

start:

INSTD_LOGIC;

stop:

INSTD_LOGIC;

pause:

INSTD_LOGIC;

money:

OUTINTEGERRANGE0TO29;

distance:

OUTINTEGERRANGE0TO29

);

endcomponent;

componentdecoder

port(clk1khz:

instd_logic;

money_in:

inintegerrange0to29;

distance_in:

inintegerrange0to29;

scan:

outstd_logic_vector(3downto0);

seg7:

outstd_logic_vector(6downto0)

);

endcomponent;

signalmoney1:

integerrange0to29;

signaldistance1:

integerrange0to29;

begin

u1:

taxiportmap(clk,start,stop,pause,money1,distance1);

u2:

decoderportmap(clk1khz,money1,distance1,scan,seg7);

endttt;

二、taxi控制模块

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitytaxiis

PORT(clk:

INSTD_LOGIC;

start:

INSTD_LOGIC;

stop:

INSTD_LOGIC;

pause:

INSTD_LOGIC;

money:

OUTINTEGERRANGE0TO29;

distance:

OUTINTEGERRANGE0TO29);

end;

architectureoneoftaxiis

begin

PROCESS(clk,start,stop,pause)

VARIABLEmoney_reg:

INTEGERRANGE0TO29;

VARIABLEdistance_reg:

INTEGERRANGE0TO29;

VARIABLEnum:

INTEGERRANGE0TO9;

VARIABLEtime1:

INTEGERRANGE0TO20;

BEGIN

IFstop='1'THEN

money_reg:

=0;

distance_reg:

=0;

num:

=0;

ELSIFstart='1'THEN

money_reg:

=3;

distance_reg:

=0;

num:

=0;

ELSIFclk'EVENTANDclk='1'THEN

IFpause='1'THEN

IFtime1=20THEN

time1:

=0;

money_reg:

=money_reg+1;

ELSEtime1:

=time1+1;

ENDIF;

ELSIFstart='0'ANDpause='0'ANDstop='0'THEN

time1:

=0;

IFnum=9THEN

num:

=0;

distance_reg:

=distance_reg+1;

IFdistance_reg>3THEN

money_reg:

=money_reg+2;

ENDIF;

ELSEnum:

=num+1;

ENDIF;

ENDIF;

ENDIF;

money<=money_reg;

distance<=distance_reg;

ENDPROCESS;

END;

三、display显示模块

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitydecoderis

port(clk1khz:

instd_logic;

money_in:

inintegerrange0to29;

distance_in:

inintegerrange0to29;

scan:

outstd_logic_vector(3downto0);

seg7:

outstd_logic_vector(6downto0)

);

end;

architectureoneofdecoderis

signaldata:

std_logic_vector(3downto0);

signalm_one,m_ten:

std_logic_vector(3downto0);

signald_one,d_ten:

std_logic_vector(3downto0);

begin

process(clk1khz,money_in)

variablecomb1:

integerrange0to29;

variablecomb1_a,comb1_b:

std_logic_vector(3downto0);

begin

ifclk1khz'eventandclk1khz='1'then

ifcomb1

ifcomb1_a=9andcomb1_b=9then

comb1_a:

="0000";

comb1_b:

="0000";

comb1:

=0;

elsifcomb1_a=9then

comb1_a:

="0000";

comb1_b:

=comb1_b+1;

comb1:

=comb1+1;

else

comb1_a:

=comb1_a+1;

comb1:

=comb1+1;

endif;

elsifcomb1=money_inthen

m_one<=comb1_a;

m_ten<=comb1_b;

elsifcomb1>money_inthen

comb1_a:

="0000";

comb1_b:

="0000";

comb1:

=0;

endif;

endif;

endprocess;

process(clk1khz,distance_in)

variablecomb2:

integerrange0to29;

variablecomb2_a,comb2_b:

std_logic_vector(3downto0);

begin

ifclk1khz'eventandclk1khz='1'then

ifcomb2

ifcomb2_a=9andcomb2_b=9then

comb2_a:

="0000";

comb2_b:

="0000";

comb2:

=0;

elsifcomb2_a=9then

comb2_a:

="0000";

comb2_b:

=comb2_b+1;

comb2:

=comb2+1;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2