摘 要:文章利用VHDL語言設(shè)計了一種出租車計費器,能夠?qū)崿F(xiàn)計費及顯示的功能。采用動態(tài)掃描技術(shù)分別顯示汽車載客時行駛里程、中途停車等待時間及總費用。在Altera公司的QuartusⅡ9.0開發(fā)環(huán)境下進行了源程序的編譯、仿真,下載到FPGA芯片EP1K30TC144-3進行了硬件測試,具有一定的實用價值。
關(guān)鍵詞:VHDL;計費器;QuartusⅡ;FPGA
中圖分類號:TP312 文獻標(biāo)識碼:A 文章編號:1006-8937(2013)29-0007-03
出租車是現(xiàn)代人類的重要交通工具,而出租車的計費系統(tǒng)的安全性和先進性是人們普遍關(guān)心的問題,要求計費器性能穩(wěn)定,計費準(zhǔn)確,以及預(yù)防司機作弊行為等等都關(guān)系到乘客的切身利益。因此,設(shè)計出符合人們普遍要求及放心的產(chǎn)品具有重要的意義。采用模擬電路和數(shù)字電路設(shè)計的計價器整體電路的規(guī)模較大,用到的器件多,造成故障率高,難調(diào)試,對于模式的切換需要用到機械開關(guān),機械開關(guān)時間久了會造成接觸不良,功能不易實現(xiàn)?;趩纹瑱C設(shè)計的計費器更新周期長,而且單片機程序是不通用的,不同的單片機芯片有不同的指令集,因此設(shè)計研發(fā)比較困難。利用VHDL語言設(shè)計的基于CPLD/FPGA的出租車計費器不僅可以解決電子系統(tǒng)小型化、低功耗、高可靠性等問題,而且其開發(fā)周期短、設(shè)計靈活、易于調(diào)試、修改方便。
1 出租車計費器的設(shè)計要求
1.1 能夠?qū)崿F(xiàn)計費的功能
費用的計算是按行駛的里程收費,設(shè)出租車的起價為5.00元,當(dāng)里程小于3 km時,按起步價計算費用;當(dāng)里程大于3 km時每公里按1.3元計費。等待累計時間超過2 min,按每分鐘1.5元計費。所以總費用按下式計算:總費用=起費用+(里程-3 km)×里程單價+等候時間×等候單價。
1.2 能夠?qū)崿F(xiàn)顯示的功能
顯示汽車行駛里程:用兩位數(shù)字顯示,顯示方式為“XX”,單位為km。計程范圍為0~99 km,計程分辨率為1 km;顯示等候時間:用兩位數(shù)字顯示分鐘,顯示方式為“XX”。計時范圍為0~59 min,計時分辨率為1 min;顯示總費用:用四位數(shù)字顯示,顯示方式為“XXX.X”,單位為元。計價范圍為0~999.9元,計價分辨率為0.1元。
2 系統(tǒng)總體設(shè)計
根據(jù)設(shè)計要求,采用自頂向下的設(shè)計方法,將整個系統(tǒng)設(shè)計分為分頻模塊、計量模塊、計費模塊、控制模塊及動態(tài)掃描顯示模塊,系統(tǒng)組成框圖如圖1所示,其中計量模塊是整個設(shè)計的重點。
3 各模塊具體設(shè)計
下面將介紹系統(tǒng)各模塊及頂層電路的具體設(shè)計。
3.1 分頻模塊
分頻模塊對系統(tǒng)時鐘信號進行分頻,分別得到15 Hz,13 Hz,1 Hz三種頻率;1 Hz作為計量模塊的驅(qū)動信號,計費模塊采用13 Hz、15 Hz的驅(qū)動信號;計量模塊每計數(shù)一次,計費模塊就實現(xiàn)13次或者15次計數(shù),即為實現(xiàn)出租車等待計時的1.5 元/min、計里程時的1.3元/km的收費。那么分頻模塊輸入時鐘頻率應(yīng)為15×13=195 Hz,由于系統(tǒng)設(shè)計硬件驗證時所用EDA實驗箱上面沒有195 Hz的時鐘源,只有192 Hz及16 384 Hz的時鐘源,195 Hz與192 Hz相隔3 Hz,誤差太大,而將16 384 Hz的時鐘源84分頻后得到時鐘信號與195 Hz相差0.047619 Hz,誤差較小,故分頻模塊選擇輸入時鐘頻率clk_16384為16 384 Hz,經(jīng)過兩次分頻得到clk_1(1 Hz),clk_13(13 Hz),clk_15(15 Hz)。
3.2 計量模塊
此模塊主要功能是計算載客時汽車行駛的公里數(shù)及停車等待時的等候時間即完成計程和計時功能。計程器的量程為99 km,滿量程后自動歸零,計時器的量程為59 min,滿量程后自動歸零。輸入端口clk1為計量脈沖信號,是由分頻模塊提供的1 Hz時鐘信號,s是計量開始/停止信號,pause是停車等待信號,fin是汽車的里程脈沖信號。當(dāng)s=1,pause=0時表示汽車正常行駛,開始計量,clk1的上升沿到來時,若fin為高電平,則以記錄的clk1的脈沖個數(shù)作為汽車行駛的公里數(shù),行駛超過3 km時,en0輸出高電平。s=1,pause=1表示汽車中途停車等待,記錄clk1的脈沖個數(shù),60個脈沖為1 min,當(dāng)超過2 min時,en1輸出高電平。s=0時不論pause為何值,計量停止,顯示清零。輸出端口k1、k0分別表示里程的十位數(shù)字和個位數(shù)字,m1、m0分別表示等待時間的十位數(shù)字和個位數(shù)字。將設(shè)計的VHDL程序編譯之后生成的元件符號圖如圖2所示。
程序編譯通過后對計量模塊進行仿真,仿真圖如圖3所示。在第2個clk1時鐘周期,s信號為1,pause仍為0,里程k0開始計數(shù),計數(shù)到3后,表示汽車行駛超過3 km,需按1.3元/km收費,此時en0輸出高電平。在具體程序設(shè)計中,為了縮短硬件測試時間,使得測試時間與實際時間縮短了6倍,既實際時間1 min,測試時間為10 s。所以當(dāng)s為1、pause為1時,汽車處于載客等待狀態(tài),每10個clk1周期模擬實際的1分鐘,m0的值自動加1,當(dāng)m0加到2后,表示等待超過2 min,需按1.5元/min收費,此時en1輸出有效脈沖信號。
3.3 控制模塊
控制模塊主要是根據(jù)兩個不同的輸入使能信號ent0和ent1,對兩個輸入脈沖13 Hz及15 Hz進行選擇輸出,提供給計費模塊計費。ent0和ent1分別由計量模塊的en0、en1提供。其參考程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity kongzhi is
port(ent0,ent1:in std_logic;
clk_in1:in std_logic;
clk_in2:in std_logic;
clk_out:out std_logic);
end kongzhi;
architecture rt4 of kongzhi is
begin
process(ent0,ent1)
begin
if ent1='1' then
clk_out<=clk_in1;
elsif ent0='1' then
clk_out<=clk_in2;
end if;
end process;
end rt4;
3.4 計費模塊
當(dāng)輸入的start信號不為0時,對不同的輸入脈沖頻率clk2的脈沖個數(shù)進行計數(shù)即為乘車費用,輸出端口c0、c1、c2、c3分別表示費用的小數(shù)位,個位、十位、百位數(shù)字的四位BCD碼輸出。
3.5 動態(tài)掃描顯示模塊
本模塊包括9個輸入端口,2個輸出端口。系統(tǒng)顯示部分利用人眼的視覺暫留效應(yīng),采用動態(tài)掃描的方法,點亮8個數(shù)碼管,當(dāng)輸入數(shù)碼管掃描信號clkweixuan選擇實驗箱上面的750 kHz頻率,硬件現(xiàn)象顯示良好,沒有閃爍的感覺。八個四位BCD碼輸入中wc0、wc1、wc2、wc3分別是計費模塊輸出的c0、c1、c2、c3,即為乘客乘車的費用;Wmin0和wmin1為汽車停車等待時間的個位和十位,wk0、wk1為汽車行駛的公里數(shù)的個位和十位。輸出端口weixuan為數(shù)碼管的片選信號,qout為數(shù)碼管的位選信號。
本模塊包括兩個process,一個process在時鐘信號的控制下從0到7進行循環(huán)計數(shù),不同的計數(shù)值,輸出八個不同的4位BCD碼輸入,并產(chǎn)生數(shù)碼管的片選信號;一個process完成對4位BCD碼輸出值的七段數(shù)碼管顯示譯碼,產(chǎn)生數(shù)碼管位選信號,在這個進程要注意顯示費用個位數(shù)字的數(shù)碼管必須帶小數(shù)點。
3.6 頂層設(shè)計
對各個子模塊程序進行編譯,仿真,然后生成各個模塊的元件符號,采用原理圖的輸入方式將各模塊連接起來構(gòu)成頂層模塊,或者用VHDL語言采用元件例化語句編寫頂層模塊程序。圖4是采用VHDL語言編寫頂層程序生成的RTL電路圖。
4 硬件測試
整個系統(tǒng)程序設(shè)計完成,仿真通過后選擇器件。本設(shè)計在武漢恒科HK-Ⅵ型EDA實驗箱上進行硬件測試,選擇器件為Atera的FPGA芯片EP1K30TC144-3,然后根據(jù)設(shè)計要求合理分配引腳,進行全編譯生成編程文件。連接好實驗箱,將編程文件下載到FPGA器件上,觀察硬件現(xiàn)象。數(shù)碼管顯示初始狀態(tài)如圖5所示。當(dāng)start=1、pause=1(start輸入高電平,pause輸入高電平),出租車進入等待狀態(tài),行駛路程顯示數(shù)碼管停止計數(shù),等待時間顯示數(shù)碼管跳動計數(shù),同時繼續(xù)計費。圖6為某時刻當(dāng)前狀態(tài)下的數(shù)碼管顯示,里程為39 km,等待時間為3 min,總費用=5+(39-3)×1.3+(3-2)
×1.5=53.3元,硬件現(xiàn)象完全符合。
5 總 結(jié)
本文設(shè)計硬件系統(tǒng)采用VHDL語言編程,基于FPGA實現(xiàn)了出租車計費器的計時、計程、計費功能。使用硬件語言描述的形式,可以充分利用FPGA的優(yōu)勢,成本低、靈活性強、功耗小、周期短。使用VHDL語言設(shè)計硬件電路,設(shè)計與器件無關(guān),具有良好的可移植性。如果出租車計費標(biāo)準(zhǔn)發(fā)生變化時,修改VHDL源程序即可,設(shè)計具有一定的實用價值。
參考文獻:
[1] 付揚.出租車計價器的FPGA實現(xiàn)[J].微計算機信息,2008,12(2),203-204.
[2] 譚會生,張昌凡.EDA技術(shù)及應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2011.