基于FPGA的出租车计价器设计.docx

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

基于FPGA的出租车计价器设计.docx

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

基于FPGA的出租车计价器设计.docx

基于FPGA的出租车计价器设计

目录

摘要I

1概述1

2出租车计价器的设计3

2.1出租车计价器总体设计3

2.1.1出租车计价标准3

2.1.2总体框架设计3

2.1.3VHDL设计方法4

2.2出租车计价器程序设计5

2.2.1控制模块6

2.2.2译码显示模块8

3仿真显示14

3.1QuartusⅡ简介14

3.2控制模块系统仿真14

3.2.1计程模块仿真14

3.2.2计价模块仿真14

3.2.3taxi总模块仿真15

3.3译码显示模块系统仿真15

3.3.1分频模块仿真15

3.3.2译码模块仿真16

3.3.3数据显示模块仿真16

3.3.4decoder总模块仿真17

总结18

致谢19

参考文献20

附录21

附录1VHDL控制模块程序21

附录2译码显示模块23

基于FPGA的出租车计价器设计

摘要

近年来,出租车行业迅速发展,出租车已经成为城市公共交通的重要组成部分。

传统的基于单片机的出租车计费系统已经很难满足现在的需要,而FPGA等可编程器件的出现很好地解决了这些问题,FPGA不同逻辑可以并行执行,可以同时处理不同任务,可以根据不同的需要来设计不同模块,能够很快的实现其需要的功能。

本文介绍了基于FPGA的出租车计价器系统的功能、设计思想和实现,以及出租车计价器系统的组成及工作原理描述了研究该课题的意义和应用价值。

该设计采用模块化设计,主要有两大模块和一些子模块,分为计程模块、计费模块、分频模块、译码模块和数据显示模块,各模块采用VHDL设计,完成了可预置自动计价、自动计程、数据显示等多功能的计价器。

在QuartusⅡ下实现编译、仿真等,最后成功下载到FPGA芯片中。

由于FPGA具有高密度、可编程及有强大的软件支持等特点,所以计价器具有功能强、灵活和可靠性高等特点,具有一定的实用价值。

关键词FPGA,VHDL,计价器,QuartusⅡ

1概述

随着FPGA等数字可编程器件的出现解决传统电子设计不能完成的任务,利用FPGA来实现出租车计价器。

可行性很高,而且电路简单,大大减少外围器件,可以用软件完全仿真,灵活度高,可以设计一些复杂的系统,而且编好的系统可以在不同的FPGA或CPLD芯片上通用。

FPGA能完成任何数字器件的功能,使用FPGA来开发数字电路,可以大大缩短设计时间,减少PCB面积,提高系统的可靠性。

同时由于FPGA的功能完全取决于VHDL语言编写的程序,不拘泥于某种芯片的特殊指令,更加提高了产品的更新换代能力。

现代数字系统的设计采用“Top→down”(自顶向下)设计方法,设计步骤如图1-1所示。

图1-1设计流程图

在“Top→down”(自顶向下)的设计方法中,设计者首先需要对整个系统进行方案设计和功能划分,拟订采用一片或几片专用集成电路ASIC来实现系统的关键电路,系统和电路设计师亲自参与这些专用集成电路的设计,完成电路和芯片版图,再交由IC工厂投片加工,或者采用可编程ASIC(例如CPLD和FPGA)现场编程实现。

利用HDL语言,采用“Top→down”(自顶向下)设计方法的设计系统硬件电路,一般分为三个步骤,如图1-2所示。

图1-2“Top→down”(自顶向下)设计系统硬件的过程

(1)行为描述

对系统进行行为描述的目的是在系统设计的初始阶段,通过对系统行为描述的仿真来发现系统设计中存在的问题。

在行为描述阶段,考虑的是系统的结构及其工作过程是否能达到系统设计规格书的要求,并不考虑其实际的操作和算法用什么方法来实现。

行为描述是对整个系统的数学模型的描述,其设计与器件工艺无关。

(2)寄存器传输描述RTL

将行为方式描述的HDL程序,采用RTL方式描述,导出系统的逻辑表达式,再用仿真工具对RTL方式描述的程序进行仿真。

如果仿真通过,就可以利用逻辑综合工具进行综合了。

(3)逻辑综合

利用逻辑综合工具,将RTL方式描述的程序转换成用基本逻辑元件表示的文件(门级网络表),也可将综合结果以逻辑原理图方式输出。

此后再对逻辑综合结果在门电路级上进行仿真,并检查定时关系,如果一切正常,那么系统的硬件设计基本结束。

如果在某一层上仿真发现问题,就应返回上一层,寻找和修改相应的错误,然后再向下继续未完的工作。

由逻辑综合工具产生门级网络表后,在最终完成硬件设计时,还可以有两种选择:

一种是由自动布线程序将网络表转换成相应的ASIC芯片的制造工艺,定制ASIC芯片;第二种是将网络表转换成相应的PLD编程码点,利用PLD完成硬件电路的设计。

2出租车计价器的设计

2.1出租车计价器总体设计

2.1.1出租车计价标准

计价器显示的营运金额是营运里程与价格的函数。

出租车计价器通过传感器与行驶车辆连接,出租车的实际里程通过传感器的脉冲信号在计价器里折算成一定的计价营运里程。

针对这一点我们来利用FPGA来设计一款出租车计价器,具有计程显示、计价显示相关功能。

设计要求如下:

(1)实现计价功能:

按行驶里程计价,可以设置每公里单价,起步价为10元(含3公里),超过3公里后每公里单价2元,当出租车到达目的地后,结束计价。

(2)设计数码管动态扫描电路能够实时显示价格和路程数。

2.1.2总体框架设计

出租车有起动键、停止键、暂停键和档位键。

起动键为脉冲触发信号,当发出一个脉冲时,表示汽车已起动,并根据车速的选择和基本车速发出响应频率的脉冲(计价脉冲)实现车费和路程的计数,同时车费显示起步价;当停止键为高电平时,表示汽车熄火,同时停止发出脉冲,此时车费和路程计数清零;当暂停键为高电平时,表示汽车暂停并停止发出脉冲,此时车费和路程计数暂停;档位键用来改变车速,不同的档位对应不同的车速,同时路程计数的速度也不同。

出租车计价器可以分成两个模块,控制模块实现了计价和路程计数,并通过不同的档位控制车速。

译码显示模块实现了十进制到4位十进制的转换,以及车费和路程的显示。

设计完成后应用VHDL语言进行编辑,实现其功能。

基于FPGA的出租车计价器的总体设计框图如图2-1所示。

图2-1出租车计价器的总体设计框图

2.1.3VHDL设计方法

使用VHDL设计系统方法是自顶向下的系统设计方法,在设计过程中,首先是从整体上对系统功能进行细致的划分,达到比较合理的功能模块;设计出各个功能模块;各功能模块调试完成后,再将所有模块的电路连接起来进行系统的统一调试,最终完成电路系统功能的设计。

其设计流程如图2-2所示。

图2-2VHDL工程设计流程

2.2出租车计价器程序设计

设计的总电路图如图2-3所示,其中,clk为计价时钟脉冲信号输入端,clk20MHZ为译码高频时钟信号输入端,start为汽车启动键,stop为汽车停止键,pause为汽车暂停键,speed[1…0]为档位键,money[12…0]为计费输出端,distance[12…0]为计程输出端,money_in[12…0]为计费输入端,distance_in[12…0]为计程输入端,scan[7…0]为数码管地址选择信号输入端,seg[6…0]为7段显示控制信号输出端,dp为小数点信号输出端。

包括两大模块:

控制模块和译码显示模块。

图2-3计价器总电路图

出租车计价器的电路符号如图2-4所示。

图2-4出租车计费器电路符号图

2.2.1控制模块

控制模块主要完成记录行车里程和加速的情况,并按照通用的计费标准进行计算并输出路程和车费。

主要包括计程模块和计价模块,每个模块的功能实现后,通过合理连接和协调各相关端口,得到控制模块的总电路图。

下面分别是各分模块的简单介绍:

(1)计程模块:

根据提供的里程脉冲信号,计算出租车行驶路程出租车每行驶一公里输出端就发出一个上升沿给计程模块;输入端为车轮大小的设定值,根据车轮直径的不同,每转一圈行进路程也不同,因此每公里计的clk次数也会不同,车轮越大计的clk数越少;乘客上车后出租车所行驶的里程数,到达后自动归零。

车停时或者暂停时不计。

begin

ifstop='1'then-------汽车停止,计价和路程清零

money_reg:

=0;

distance_reg:

=0;

dis:

=0;

num:

=0;

elsifstart='1'then---汽车启动后,起步价为10元

money_reg:

=1000;

distance_reg:

=0;

dis:

=0;

num:

=0;

elsifclk'eventandclk='1'then

ifstart='0'andspeedup="00"andpause='0'andstop='0'then----1档

ifnum=9then

num:

=0;

distance_reg:

=distance_reg+1;

dis:

=dis+1;

elsenum:

=num+1;

endif;

elsifstart='0'andspeedup="01"andpause='0'andstop='0'then---2档

ifnum=9then

num:

=0;

distance_reg:

=distance_reg+2;

dis:

=dis+2;

elsenum:

=num+1;

endif;

elsifstart='0'andspeedup="10"andpause='0'andstop='0'then----3档

ifnum=9then

num:

=0;

distance_reg:

=distance_reg+5;

dis:

=dis+5;

elsenum:

=num+1;

endif;

elsifstart='0'andspeedup="11"andpause='0'andstop='0'then---4档

distance_reg:

=distance_reg+1;

dis:

=dis+1;

endif;

ifdis>=100then

d:

='1';

dis:

=0;

elsed:

='0';

endif;

endif;

endif;

当产生stop信号,所有变量清零;当start信号不为0时,暂停信号pause为0时,汽车启动后,起步价为10元,然后开始计程,根据汽车的档位不同,车速不同,计算路程也不同。

(2)计价模块:

当汽车开始时计价为10元,行驶3公里后按2元每公里计价。

计价模块的输入端口分别用设定信号来模拟汽车启动、停止、暂停按键,起到信号输入作用,外部时钟频率20MHz。

每次计价结束后自动清零,保证下次计价的准确性。

ifdistance_reg>=300then-------如果超过3km则按2元每km计算

ifmoney_reg<2000andd='1'then

money_reg:

=money_reg+120;

elsifmoney_reg>=2000andd='1'then

money_reg:

=money_reg+180;

endif;

如果行驶路程超过3km则按2元每km计算。

最后把计算出的价钱数和行驶的路程通过端口money和distance传输到译码显示模块。

其总原理如图2-5所示。

图2-5控制模块

2.2.2译码显示模块

译码显示模块:

该模块主要是把控制模块传输过来的计价器的费用和所出租车所行使的路程进行译码,并通过LCD显示屏显示出来。

主要包括:

分频模块、译码模块和显示模块,这两个模块相互连接实现显示功能。

(1)分频器模块:

将外部时钟信号clk经过适当分频后,产生1Hz的基准时钟信号,提供给电路系统中各有关模块作为计时工作用。

这里主要是用一个计数器来实现时钟的分频,当累加到预置的数值以后输出高电平。

否则输出低电平,从而实现时钟的分频。

process(clk20mhz)

variablecount:

integerrange0to9999;

begin

ifclk20mhz'eventandclk20mhz='1'then

ifcount=0thenclk1khz<=notclk1khz;count:

=0;

elsecount:

=count+1;

endif;

endif;

endprocess;

输入20MHz的频率,当时钟信号为上升沿时,判断变量count是否为9999,如果是则,clk1khz的信号取反,然后count清零,否则count加1。

(2)译码模块:

本设计采用的是共阴极七段数码管,将车费和路程的十进制转换成4位的十进制数,根据十进制数和七段显示段码表的对应关系,用VHDL的case语句实现译码。

通过译码器译成LED可以识别的7位数字编码。

计费的十进制转化为4位十进制数:

process(clk20mhz,money_in)

variablecomb1:

integerrange0to8000;

variablecomb1_a,comb1_b,comb1_c,comb1_d:

std_logic_vector(3downto0);

begin

ifclk20mhz'eventandclk20mhz='1'then

ifcomb1

ifcomb1_a=9andcomb1_b=9andcomb1_c=9then

comb1_a:

="0000";

comb1_b:

="0000";

comb1_c:

="0000";

comb1_d:

=comb1_d+1;

comb1:

=comb1+1;

elsifcomb1_a=9andcomb1_b=9then

comb1_a:

="0000";

comb1_b:

="0000";

comb1_c:

=comb1_c+1;

comb1:

=comb1+1;

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;

m_hun<=comb1_c;

m_tho<=comb1_d;

elsifcomb1>money_inthen

comb1_a:

="0000";

comb1_b:

="0000";

comb1_c:

="0000";

comb1_d:

="0000";

comb1:

=0;

endif;

endif;

endprocess;

车费显示有4位,分别为a、b、c、d,a为最低位,从最低位a开始累加,当遇到90开始进位,当累加comb1=money_in时将四个变量赋给显示变量,如果comb1>money_in时,所有变量全部清零,等待下次转换。

路程的十进制转化为4位十进制数:

process(clk20mhz,distance_in)

variablecomb2:

integerrange0to8000;

variablecomb2_a,comb2_b,comb2_c,comb2_d:

std_logic_vector(3downto0);

begin

ifclk20mhz'eventandclk20mhz='1'then

ifcomb2

ifcomb2_a=9andcomb2_b=9andcomb2_c=9then

comb2_a:

="0000";

comb2_b:

="0000";

comb2_c:

="0000";

comb2_d:

=comb2_d+1;

comb2:

=comb2+1;

elsifcomb2_a=9andcomb2_b=9then

comb2_a:

="0000";

comb2_b:

="0000";

comb2_c:

=comb2_c+1;

comb2:

=comb2+1;

elsifcomb2_a=9then

comb2_a:

="0000";

comb2_b:

=comb2_b+1;

comb2:

=comb2+1;

else

comb2_a:

=comb2_a+1;

comb2:

=comb2+1;

endif;

elsifcomb2=distance_inthen

d_one<=comb2_a;

d_ten<=comb2_b;

d_hun<=comb2_c;

d_tho<=comb2_d;

elsifcomb2>distance_inthen

comb2_a:

="0000";

comb2_b:

="0000";

comb2_c:

="0000";

comb2_d:

="0000";

comb2:

=0;

endif;

endif;

endprocess;

路程显示也有4位,分别为a、b、c、d,a为最低位,从最低位a开始累加,当遇到90开始进位,当累加comb2=distance_in时将四个变量赋给显示变量,如果comb2>distance_in时,所有变量全部清零,等待下次转换。

(3)数据显示模块:

实现计费和计程的数据显示。

计价显示输出总费用,用到4个数码管,用来显示总费用comb1_a、comb1_b、comb1_c和comb1_d。

计程显示输出模块LED显示屏上会显示0到9999公里的路程,用到4个数码管,用来显示总费用comb2_a、comb2_b、comb2_c和comb2_d。

通过显示模块,显示直观的费用和路程。

process(clk1khz,m_one,m_ten,m_hun,m_tho,d_one,d_ten,d_hun,d_tho)

variablecnt:

std_logic_vector(2downto0);

begin

ifclk1khz'eventandclk1khz='1'then

cnt:

=cnt+1;

endif;

casecntis

when"000"=>data<=m_one;dp<='0';scan<="00000001";

when"001"=>data<=m_ten;dp<='0';scan<="00000010";

when"010"=>data<=m_hun;dp<='1';scan<="00000100";

when"011"=>data<=m_tho;dp<='0';scan<="00001000";

when"100"=>data<=d_one;dp<='0';scan<="00010000";

when"101"=>data<=d_ten;dp<='0';scan<="00100000";

when"110"=>data<=d_hun;dp<='1';scan<="01000000";

when"111"=>data<=d_tho;dp<='0';scan<="10000000";

endcase;

endprocess;

-----------------------------------------七段译码--------------------

process(data)

begin

casedatais

when"0000"=>seg7<="1111110";

when"0001"=>seg7<="0110000";

when"0010"=>seg7<="1101101";

when"0011"=>seg7<="1111001";

when"0100"=>seg7<="0110011";

when"0101"=>seg7<="1011011";

when"0110"=>seg7<="1011111";

when"0111"=>seg7<="1110000";

when"1000"=>seg7<="1111111";

when"1001"=>seg7<="1111011";

whenothers=>seg7<="0000000";

endcase;

endprocess;

end;

数码管采用动态扫描显示,频率为1khz,总共8个,分别对应前面的车费和路程的显示变量,根据显示变量的不同值在数码管中对应不同的数字,然后在数码管中读出所显示的车费和路程。

Clk20mhz为输入的频率,money_in[12…0]为控制模块输入的费用,distance_in[12…0]为控制模块输入的路程,scan[7…0]是片选信号,seg7[6…0]为显示输出。

译码显示模块总图如2-6图所示。

图2-6译码显示模块

在设计中从整体上对系统功能进行细致的划分,设计出比较合理的功能模块,由taxi模块和decoder模块组成,设计出各个功能模块;再对各模块进行仿真,当各模块实现仿真功能调试完成后,在QuartusⅡ中将所有模块的电路连接起来进行系统的统一调试进行连线,实现总体设计功能。

 

3仿真显示

3.1QuartusⅡ简介

QuartusⅡ软件是MAX+plusⅡ的升级版本,Altera公司的第四代开发软件。

其提供了一个完整高效的设计环境,非常适应具体的设计需要。

QuartusⅡ提供了方便的设计输入方式、快速的编译和直接易懂的器件编程,能够支持逻辑门数在百万门以上的逻辑器件的开发,并且为第三方工具提供了无缝接口。

QuartusⅡ软件包的编程器是系统的核心,提供功能强大的设计处理,设计者可以添加特定的约束条件来提高芯片的利用率。

在设计流程的每一步,QuartusⅡ软件能够引导设计者将注意力放在设计上,而不是软件的使用上。

同时,自动的错误定位、完备的错误和警告信息,使设计修改变得简单容易。

3.2控制模块系统仿真

3.2.1计程模块仿真

仿真结果如图3-1所示,当汽车开始启程时开始计程。

图3-1计程模块仿真结果

3.2.2计价模块仿真

仿真结果如图3-2所示,当汽车开始时计价为10元,行驶3km后按2元每km计价。

图3-2计价模块仿真结果

3.2.3taxi总模块仿真

对控制模块taxi整体进行仿真后得到的功能仿真结果为如图3-3所示,观察波形可知,当启动键为一个脉冲时,表示汽车已起动,车费money显示起步价10元,同时路程distance随着计价脉冲开始计数;当停止键(stop)为1时,表示汽车熄火停止,车费money和路程distance均为0;当暂停键为1时,车费路程停止计数;当档位键分别取0、2、3是路程计数逐渐增加,表示车速逐渐增加。

图3-3模块taxi仿真结果

3.3译码显示模块系统仿真

3.3.1分频模块仿真

仿真结果如图3-4所示,该模块

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

当前位置:首页 > 解决方案 > 学习计划

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

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