基于FPGA的出租车计价器设计04207Word文档格式.docx
《基于FPGA的出租车计价器设计04207Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于FPGA的出租车计价器设计04207Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
在等待信号未作用时,来一个时钟脉冲信号,里程值加1。
该模块还包含一个路程计费标志的小模块,输出一个路程计费的信号。
(5)等待状态模块:
等待信号作用时,该模块可以记录等待的时间,并产生等待计费的信号。
(6)车费计数模块:
按行驶里程收费,分为白天和黑夜。
白天收费标准:
起步费为12.00元,超过3公里按4元/公里,车暂停超过三分钟按2元/分钟计算。
黑夜收费标准:
起步费为15.00元,超过3公里按5元/公里,车暂停超过三分钟按1元/分钟计算。
(7)输出控制模块:
分时输出里程、等待时间、费用三个信号,实现动态显示功能。
(8)译码模块:
实现将车费计数模块、等待状态模块和里程计数模块输出的BCD码转换成七段码输出。
4.1分频模块:
4.1.1分频模块的框图
图3.1.1分频器的实体图
此模块的功能是对总的时钟进行分频,总的时钟是50M。
计数分频器使用五个这样基本的分频器(35分频)组合而成,控制模块分频器使用三个这样基本的分频器(35分频)组合而成。
4.1.2分频模块的VHDL程序
LIBRARYIEEE。
USEIEEE.STD_LOGIC_1164.ALL。
USEIEEE.STD_LOGIC_UNSIGNED.ALL。
ENTITYPULSEIS
PORT(CLK0:
INSTD_LOGIC。
FOUT:
OUTSTD_LOGIC)。
ENDPULSE。
ARCHITECTUREONEOFPULSEIS
BEGIN
PROCESS(CLK0)
VARIABLECNT:
STD_LOGIC_VECTOR(2DOWNTO0)。
VARIABLEFULL:
STD_LOGIC。
BEGIN
IFCLK0'
EVENTANDCLK0='
1'
THEN
IFCNT="
100"
CNT:
="
000"
。
FULL:
='
。
ELSE
=CNT+1。
0'
ENDIF。
FOUT<
=FULL。
ENDPROCESS。
ENDONE。
4.2.1计程模块的框图:
此模块的功能是计算出租车行驶的路程。
在出租车启动并行驶的过程中(开始/结束信号SS为1,行驶/等待信号WR为1),当时钟clks是上升沿的时候,系统即对路程计数器JC的里程计数器进行加计数,当路程超过三公里时,系统将输出标志正脉冲LCJFBZ。
4.2.2计程模块的VHDL程序
(1)计程程序
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entityJCis
port(clks,SS,WR:
instd_logic。
LC:
BUFFERstd_logic_vector(7downto0))。
endentityJC。
architectureoneofJCis
SIGNALQ1,Q0:
std_logic_vector(3downto0)。
begin
process(clks,SS,WR,LC)
VARIABLESW:
STD_LOGIC_VECTOR(1DOWNTO0)。
begin
SW:
=SS&
WR。
IFSW="
00"
ORSW="
01"
THENQ1<
0000"
Q0<
ELSIFSW="
11"
=Q1。
=Q0。
ELSIFCLKS'
EVENTANDCLKS='
IFQ1=9ANDQ0=9THEN
Q1<
ELSIFQ0=9THENQ1<
=Q1+1。
ELSEQ1<
=Q0+1。
(2)计程标志程序
entityLCJFBZis
port(SS:
--SS开始/复位信号,
INSTD_LOGIC_VECTOR(7DOWNTO0)。
LCJFBZ:
OUTstd_logic)。
endentityLCJFBZ。
architectureTWOofLCJFBZis
PROCESS(SS,LC)
IFSS='
OR(LC(7DOWNTO4)="
ANDLC(3DOWNTO0)<
4)THENLCJFBZ<
ELSELCJFBZ<
ENDPROCESS。
ENDTWO。
4.3计时模块:
4.3.1计时模块的框图:
此模块用于计算停车等待的时间。
在出租车行进中,如果车辆停止等待,计数器则在信号clk的上升沿进行加计数,当累计等待时间超过2(不包括2分钟)分钟时,输出标志DDJFBZ正脉冲信号。
4.3.2计时模块的VHDL程序:
ENTITYDDZTIS
PORT(CLK,SS:
DDBZ:
DDJFBZ:
OUTSTD_LOGIC。
DDSJ:
OUTSTD_LOGIC_VECTOR(7DOWNTO0))。
ENDENTITYDDZT。
ARCHITECTUREONEOFDDZTIS
PROCESS(CLK,SS,DDBZ)
VARIABLEQ1,Q0:
STD_LOGIC_VECTOR(3DOWNTO0)。
THENQ1:
Q0:
DDJFBZ<
ELSIFDDBZ='
THEN
IFCLK='
ANDCLK'
EVENTTHEN
Q1:
ELSIFQ0=9THENQ1:
ELSEQ1:
IF(Q1>
0ORQ0>
3)THEN
DDJFBZ<
DDSJ(7DOWNTO4)<
DDSJ(3DOWNTO0)<
4.4计费模块:
4.4.1计费模块的框图:
费用计数器模块用于出租车启动后,根据行驶路程和等待时间计算费用。
当出租车启动时,SS为高电平,用于将费用计数器复位为起步价10元;
当车处于行驶状态且满3公里时,select_clk信号选择distans_enable,此后路程每满1公里,费用计数器加1元;
当出租车处于停止等待状态且时钟满2分钟时,select_clk信号选择time_enable信号,时间每满1分钟,费用计数器加1元。
4.4.2计费模块的VHDL的程序:
libraryIEEE。
useIEEE.STD_LOGIC_1164.ALL。
useIEEE.STD_LOGIC_UNSIGNED.ALL。
--定义函数名
PACKAGEPACKEXP1IS
FUNCTIONbcd_add8(AIN,BIN:
instd_logic_vector)
RETURNstd_logic_vector。
END。
--描述函数体
PACKAGEBODYPACKEXP1IS
std_logic_vector)
RETURNstd_logic_vectorIS
typetype_bcdx4isarray(3downto0)ofstd_logic_vector(4downto0)。
VARIABLESA,SB:
type_bcdx4。
VARIABLECI:
std_logic_vector(4downto0)。
VARIABLESOUT:
std_logic_vector(11downto0)。
CI:
=(others=>
'
)。
SOUT:
foriin0to1loop--0-1的循环
SA(i):
=('
&
AIN(i*4+3downtoi*4))+('
BIN(i*4+3downtoi*4))+("
CI(i))。
if((SA(i)(4)='
)or(SA(i)(3downto0)>
9))then
SB(i):
=SA(i)+"
00110"
else
=SA(i)。
endif。
CI(i+1):
=SB(i)(4)。
SOUT(i*4+4downtoi*4):
=SB(i)。
endloop。
RETURNSOUT。
ENDFUNCTIONbcd_add8。
USEWORK.PACKEXP1.ALL。
ENTITYJFis
PORT(SS:
--开始/停止信号,低电平停止,高电平开始
DN:
--白天黑夜控制,高电平夜间,低电平白天
INstd_logic_vector(7downto0)。
--路程
--等待时间
--路程计费标志
--等待计费标志,高电平时等待开始计费,低电平不计费
FY:
--总费用
ENDENTITYJF。
architectureONEofJFis
--讨论白天/黑夜?
路程计费?
等待计费?
PROCESS(SS,DN,LC,DDSJ,DDJFBZ,LCJFBZ)
VARIABLEFY1:
STD_LOGIC_VECTOR(11DOWNTO0)。
FY1:
000000000000"
ELSIFDN='
THEN--白天时
IFLCJFBZ='
THEN--起始价
FY1(11DOWNTO4):
=(OTHERS=>
--9
FY1(3DOWNTO0):
1001"
ELSE--加收路程费
=bcd_add8(LC,LC)。
=bcd_add8(FY1,LC)。
--多一个脉冲加收3,则变成LC*3
ELSIFLCJFBZ='
FY1(11DOWNTO5):
FY1(4DOWNTO0):
10010"
--12
--每一个脉冲加收4,则变成LC*4
IFDN='
IFDDJFBZ='
THEN--未到等待收费时间
=FY1。
--不加收
ELSE--加收路程费
=bcd_add8(FY1,DDSJ)。
--一超过等待收费时间,就立即加收等待时的每个脉冲加2
ELSIFDDJFBZ='
--一超过等待收费时间,就立即加收等待时的每个脉冲加1
FY<
=FY1(7DOWNTO0)。
4.6控制模块:
4.6.1控制模块的框图:
控制模块用于对数码管里程、时间、费用显示的选择,起到位选的作用,实现了数码管动态显示,节省了芯片的资源。
4.6.2控制模块的VHDL程序:
(1)sel1模块
entitysel1is
port(clk1:
s1:
outstd_logic_vector(1downto0))。
endsel1。
architecturesel_arcofsel1is
process(clk1)
variablecnt:
std_logic_vector(1downto0)。
ifclk1'
eventandclk1='
then
IFcnt="
10"
thencnt:
elsecnt:
=cnt+1。
s1<
=cnt。
endprocess。
endsel_arc。
(2)sel2模块
entitysel2is
port(sel2:
instd_logic_vector(1downto0)。
s2:
outstd_logic_vector(2downto0))。
endsel2。
architecturebbb_arcofsel2is
process(sel2)
casesel2is
when"
=>
s2<
110"
101"
011"
whenothers=>
ZZZ"
endcase。
endbbb_arc。
5.1顶层模块的VHDL程序:
useieee.std_logic_arith.all。
entityczcis
port(clk,wr,ss,dn:
dnpd:
outstd_logic。
shuc1,shuc0:
outstd_logic_vector(6downto0)。
weix:
endentityczc。
architectureoneofczcis
componentbz
PORT(AJ:
BZ:
endcomponent。
componentpulse
componentddzt
componentjc
port(clks,SS,WR:
componentlcjfbz
port(SS:
componentjf
componentymq
port(din:
instd_logic_vector(7downto0)。
dout1:
dout0:
outstd_logic_vector(6downto0))。
componentxzsc
port(jc,jf,wt:
sel:
q:
outstd_logic_vector(7downto0))。
componentsel1
port(clk1:
s1:
componentsel2
s2:
signala,b,c,d,e,f,i,j,m,n:
std_logic。
signalx,y,z,W:
std_logic_vector(7downto0)。
signalk:
dnpd<
=a。
u1:
bzportmap(aj=>
dn,bz=>
a)。
u2:
ss,bz=>
b)。
u3:
wr,bz=>
c)。
u4:
pulseportmap(clk0=>
clk,fout=>
d)。
u5:
d,fout=>
i)。
u6:
i,fout=>
j)。
u7:
j,fout=>
m)。
u8:
m,fout=>
n)。
u9:
jcportmap(clks=>
n,ss=>
b,wr=>
c,lc=>
z)。
u10:
ddztportmap(clk=>
b,ddbz=>
c,ddjfbz=>
f,ddsj=>
y)。
u11:
lcjfbzportmap(ss=>
b,lc=>
z,lcjfbz=>
e)。
u12:
jfportmap(ss=>
b,dn=>
a,lc=>
z,ddsj=>
y,lcjfbz=>
e,ddjfbz=>
f,fy=>
x)。
u13:
xzscportmap(jf=>
x,jc=>
z,wt=>
y,sel=>
k,q=>
W)。
u14:
sel1portmap(clk1=>
j,s1=>
K)。
u15:
sel2portmap(sel2=>
K,s2=>
weix)。
u16:
ymqportmap(din=>
W,dout1=>
shuc1,dout0=>
shuc0)。
endarchitectureone。
5.3输入、输出信号说明:
DN:
dayORnight控制;
SS:
StartORstop控制;
WR:
waitORrun控制;
CLK:
输入