姚利彬,許 勇,潘 明
(桂林電子科技大學 電子工程與自動化學院,廣西 桂林 541004)
隨著出租車行業(yè)的發(fā)展,出租車在交通運輸中承擔著重要的角色,具有良好性能的計價器對加強行業(yè)管理以及減少乘客與司機之間的糾紛是必不可少的。采用模擬電路和數(shù)字電路設(shè)計的計費系統(tǒng)整體電路較復雜,器件多,故障率高且難調(diào)試。目前市場上的出租車計費器主要采用的都是利用微控器如89C51、μPD78F0034單片機設(shè)計的計費器[1]。
傳統(tǒng)的出租車計費器由于發(fā)展使用了十幾年,在穩(wěn)定性、成本、以及使用習慣上都具有一定優(yōu)勢,但在運行過程中系統(tǒng)不是很穩(wěn)定,有時會造成死機的現(xiàn)象。而且基于單片機設(shè)計的計費器產(chǎn)品更新周期長,大部分功能可用單片機來實現(xiàn),但是單片機程序是不通用的,不同的芯片有不同的指令集,因此設(shè)計研發(fā)比較困難,周期長。如果系統(tǒng)設(shè)計的不好,則系統(tǒng)不穩(wěn)定,且靈活度不夠,不易實現(xiàn)功能復雜的設(shè)計。再者,計價方式也不夠不靈活,每次計價標準的修改都需要將芯片重新燒錄,使得每次調(diào)價都需要耗費大量的人力物力,很難達到目前油價聯(lián)動的需求[2-3]。這些都體現(xiàn)了目前對出租車計費器市場更新?lián)Q代的需求。比較而言,基于FPGA的計費系統(tǒng)不像微控制器那樣會漏掉某些特性,它可以編程,并根據(jù)需要重新編程,快速完成原型開發(fā),更迅速地將產(chǎn)品推向市場[4]。如果需求變化了,還可以在現(xiàn)場對其進行更新。
本設(shè)計采用Alter的CycloneⅢ系列EP3C5E144C8型芯片,利用VHDL語言,實現(xiàn)對出租車的多功能計費器設(shè)計,采用LCD1602液晶輸出顯示,如需要,只需重新鎖定輸出端口,便可外接七段數(shù)碼管顯示。該計費系統(tǒng),不但能實現(xiàn)基本的計費,而且還能根據(jù)行駛的路程、總費用等調(diào)節(jié)行駛單價。最后將可執(zhí)行文件下載到康芯公司的KX_7C CycloneⅢ系列EP3C5E144C8型實驗開發(fā)系統(tǒng)上進行驗證。經(jīng)實際電路驗證,該系統(tǒng)可以實現(xiàn)通過程序設(shè)置起步價格、行駛單價、等待計費價格,并且計費正常,達到了預先設(shè)計要求。
出租車計費系統(tǒng)應有的功能有:1)車起步開始計費,起步價為7元,車行駛5 km以內(nèi),只收取起步價。2)車行駛超過5 km后,每千米收費1.6元,在起步價的基礎(chǔ)上每行駛1 km累加計費。3)當總費用達到或超過100元時或行駛公里數(shù)超過50 km后,每千米收費上升為2.4元。4)當遇到等紅燈或客戶需要停車等待時,前5分鐘等待時間計價器不計費,超出5分鐘后的等待時間按每60 s收費0.8元計費。5)若計價器收到暫停命令,則不計費,車費保持不變。若收到停止命令,則車費清零,計費標準返回初始值,等待下一次計費開始。
要求本系統(tǒng)能夠?qū)崿F(xiàn)計費器預置功能,即能夠預置起步價、單價、漲價里程、漲價費用、計時收費標準等。并且可以模擬汽車行駛、暫停、停止等狀態(tài),根據(jù)不同狀態(tài)進行計費。以十進制顯示租車行駛路程、收費標準、總費用及等待時間[5]。
從上述設(shè)計要求中可以得出出租車計費器的系統(tǒng)結(jié)構(gòu)圖,如圖1所示。整個出租車計費系統(tǒng)按功能主要分為分頻模塊、速度模塊、時間模塊、倒/正計時模塊、計程模塊、計費模塊和LCD1602顯示模塊。
系統(tǒng)接收到reset信號后,總費用變?yōu)槠鸩絻r7元,倒計時寄存器變?yōu)?5:00(5分鐘),同時其他計數(shù)器、寄存器等全部復位。
系統(tǒng)接收到start_stop信號后,首先把部分寄存器賦值,總費用不變,通過對總費用和總路程的判斷后單價unit_price賦值為1.6元,其他寄存器和計數(shù)器繼續(xù)保持原始狀態(tài)。
Grade信號是速度傳感器的輸入信號,本設(shè)計采用4位二進制數(shù)來模擬輸入脈沖頻率的大小,并與速度模塊中預先設(shè)置好的速度大小進行比較,為計程模塊提供100 m路程標志脈沖。系統(tǒng)采用經(jīng)過分頻模塊產(chǎn)生的1 Hz和500 Hz的時鐘信號[6]。
圖1 系統(tǒng)結(jié)構(gòu)圖Fig.1 System structure
Key_stable模塊:通過對reset信號的采樣判斷處理,能夠?qū)eset按鍵進行消抖處理[7-8],防止由于微小震動而產(chǎn)生的復位信號。
Divider模塊:生成適合于本系統(tǒng)需要的500 Hz與1 Hz的時鐘信號。
Speed模塊:通過對速度信號Grade的判斷,決定變量need_100m的值。need_100m即是行進100 m所需要的時鐘周期數(shù),當?shù)竭_到所需的時鐘周期數(shù)后,產(chǎn)生一個脈沖clk_100m。
Timer模塊:在汽車啟動后,當遇到顧客等人、紅燈或堵車不能前進時,出租車采用計時收費的方式。通過對速度信號Grade的判斷決定是否開始記錄時間。當Grade為零時,開始記錄時間。當時間達到預設(shè)時長時則產(chǎn)生clk_time脈沖,并重新計時。一個clk_time脈沖相當于等待的時間達到了計時收費單位。本設(shè)計采用60 s的計時收費單位。
Do_undo模塊:通過對速度信號Grade與Start_stop信號的判斷,來控制Watch模塊工作還是暫停狀態(tài)。
Watch模塊:通過對do_undo輸出信號的判斷,當輸出1時,本模塊內(nèi)的倒計時dec_watch模塊先開始工作,并使得二選一mux2_1模塊選擇倒計時顯示輸出;當?shù)褂嫊r到00:00時,倒計時停止的同時正計時inc_watch模塊從00:00開始計時,并使得mux2_1模塊選擇正計時顯示輸出。dec_watch模塊與inc_watch模塊分別由模為十和模為六的減/加法計數(shù)器構(gòu)成,其內(nèi)部系統(tǒng)結(jié)構(gòu)如圖2所示。
圖2 Watch電路模塊內(nèi)部系統(tǒng)結(jié)構(gòu)圖Fig.2 Structure of watch circuit module
Dff1模塊:由Watch模塊輸出的flag信號來控制Dff1的選通,當flag=0時,即還處在倒計時狀態(tài)下,dff1關(guān)閉,使得Timer模塊輸出的 clk_time不能通過 dff1傳送給Money模塊;當在正計時狀態(tài)下,flag=1,dff1打開,使clk_time傳送給Money模塊進行計費,這樣就實現(xiàn)了預設(shè)時間內(nèi)不收取等待時間費用的功能[9-10]。
Kilometers模塊:由于Speed模塊傳送來的一個clk_100m信號代表行駛100 m,故通過對clk_100m計數(shù),可以獲得總行進的距離km_cnt。
Money模塊:由兩個進程組成。其中,一個進程根據(jù)Kilometers模塊輸出的行駛里程判斷是否超過5 km,超過后開始按每公里進行收費,當行駛公里數(shù)大于50 km或者總費用大于100后,則單價unit_price由原來的1.6元/km漲為2.4元/km;第二個進程在每個時鐘周期檢測Speed模塊的輸出信號clk_100m是否累積到10個(即1 km),同時檢測Dff1模塊的輸出信號clk_time_ok的值。當行駛公里超過5 km且clk_100m累積到10個后總費用加上行駛單價,當檢測到clk_time_ok=1時,總費用上加上計時收費單價。模塊中嵌入了將二進制數(shù)轉(zhuǎn)換為十進制的B_to_BCD模塊,將行駛單價和總費用轉(zhuǎn)化為可讀性更強的十進制輸出。
LCD顯示模塊:系統(tǒng)采用字符型液晶顯示數(shù)據(jù),將行駛單價、總公里、總費用以及等待時間在LCD上顯示。1602液晶具有體積小、外圍電路簡單、穩(wěn)定性好而且價格低廉,綜合考慮所以選用LCD1602而并沒有采用電路較為復雜的LED數(shù)碼管。但為適應實際應用中不同的顯示方式,在程序設(shè)計時,將數(shù)據(jù)輸出格式調(diào)整為BCD碼,可以很方便地將LCD1602更換為七段LED數(shù)碼管顯示,滿足不同客戶的要求。
該模塊是模擬實際速度脈沖信號的模塊。通過對開始信號start_stop和速度信號grade進行判斷,對系統(tǒng)時鐘進行計數(shù),當計數(shù)達到與grade值相對應的數(shù)目時輸出一個clk_100m脈沖。Speed電路模塊仿真波形如圖3所示。
圖3 Speed電路模塊仿真波形Fig.3 Simulation waveform of Speed circuit module
仿真時采用的是100MHz的時鐘脈沖,當reset無效且stat_stop為高電平時,輸出clk_100m信號的頻率隨著grade的大小發(fā)生相應變化。
Timer模塊用于計時收費,記錄允許計費后出租車速度為零的時間。通過對Grade信號的判斷,當Grade=0時開始記時。當累積時間達到預設(shè)時長,則產(chǎn)生clk_time脈沖,并重新計時。模塊的仿真波形如圖4所示。從圖中可以清楚看到,在允許計費時段,當Grade=0時,每隔固定時間會有一個clk_time脈沖,在Grade不為零時,沒有clk_time脈沖輸出。
圖4 Timer電路模塊仿真波形Fig.4 Simulation waveform of Timer circuit module
該模塊是完成倒/正計時的功能模塊,輸入頻率為1 Hz,當do_undo=1時開始計時,當do_undo=0時暫停計時。無論在什么狀態(tài)下,只要reset=0,則該模塊輸出為程序中設(shè)定好的05:00(5 分鐘)。
Watch電路模塊內(nèi)部是由3部分構(gòu)成的,第一部分就是倒計時鐘dec_watch模塊,該電路根據(jù)對信號do_undo的判斷,開啟倒計時工作,當?shù)褂嫷?0:00時,輸出端flag置1,并反饋給dec_watch模塊,使其停止工作。dec_watch電路模塊仿真波形如圖5所示。由dec_watch電路模塊的仿真波形可以看出,當?shù)褂嫊r到00:00時,再來一個clk脈沖后flag被置為1,且停止倒計時。
圖5 dec_watch電路模塊仿真波形Fig.5 Simulation waveform of dec_watch circuit module
第二部分就是正計時鐘inc_watch模塊,該電路通過對信號do_undo和dec_watch模塊輸出信號flag的判斷,開啟正計時電路。inc_watch電路模塊仿真波形如圖6所示。由仿真波形圖可以看出,復位信號結(jié)束后,當do_undo=1且flag=1時,inc_watch電路開始正計時,當do_undo=0時,正計時處于保持狀態(tài)。
圖6 inc_watch電路模塊的仿真波形Fig.6 Simulation waveform of inc_watch circuit module
此模塊主要用于記錄行進的距離,通過對clk_100m信號的計數(shù),計算行駛的距離km_cnt。一個clk_100m脈沖表示行駛100 m,所以只要記錄clk_100m脈沖的數(shù)目即可確定行駛的距離。km_cnt0為十分位,km_cnt1為個位,km_cnt2為十位,分別為十進制數(shù),F(xiàn)lag_100 km為滿量程溢出標志位,light是為了體現(xiàn)速度快慢的輸出端口,順序連接上LED燈后,能夠直觀的看到速度的大小。此模塊的仿真波形如圖7所示。
由仿真波形圖可以看出,當行駛公里數(shù)達到99.9 km后,F(xiàn)lag_100km加1,公里數(shù)又重新從零開始計數(shù)。而且伴隨著公里的增加,light也在進行循環(huán)變化。
圖7 Kilometers電路模塊的仿真波形Fig.7 Simulation waveform of kilometers circuit module
計費模塊可分為M1、M2兩個進程和二進制轉(zhuǎn)BCD碼模塊。M1進程用于設(shè)置公里收費的單價unit_price和產(chǎn)生允許按公里計費的en_km信號。當記錄距離達到5 km后,en_km=1,允許開始按公里收費。當總費用大于100元或行駛總公里數(shù)超過50 km后,單價unit_price由原來的1.6/km變?yōu)?.4/km。
M2進程用于進行總費用的累計。當clk_time_ok=1時,總費用加上等待時間單價wait_unit_price;當en_km=1且對clk_100m=1計數(shù)達到10時,總費用加上公里收費的單價unit_price。為了進行加法運算時候更便捷,此處采用的是二進制加法,要顯示出十進制數(shù)字,需將總費用和單價經(jīng)過B_to_BCD模塊進行轉(zhuǎn)換,輸出總費用以及單價的BCD碼,以便顯示模塊進行顯示輸出。
將各個模塊輸出的需要顯示的數(shù)據(jù)(總費用,行駛公里,等待時間,當前行駛單價 )傳送給此電路模塊,經(jīng)本電路將數(shù)據(jù)輸出顯示到LCD1602上。由于LCD1602顯示的是數(shù)據(jù)的ASCⅡ碼值,故在將要顯示的數(shù)據(jù)前先轉(zhuǎn)換為對應數(shù)字的ASCⅡ碼值,再將此值傳送給LCD1602[11]。利用VHDL編寫的LCD1602顯示核心程序為:
利用VHDL狀態(tài)機實現(xiàn)對LCD1602的數(shù)據(jù)寫入。圖8為LCD1602顯示屏的初始狀態(tài)。
圖8 LCD1602顯示屏的初始狀態(tài)Fig.8 Original state of LCD1602
根據(jù)以上10個模塊的程序,編寫頂層程序文件(TAXI_TOP.vhd),進行編譯,鎖定引腳。整個系統(tǒng)的輸入引腳共有 7位,一位時鐘信號(clk_20M),一位復位信號(reset),一位啟動/暫停信號(start_stop)和4位速度信號(grade)。輸出引腳共有 27位,其中 3位 LCD1602控制位(RS/RW/EN),8位數(shù) 據(jù) (DATA),8 位 速 度 指 示 燈 (light),4 位 百 公 里 標 志(Flag_100km),4 位千元標志(Flag_1000RMB)。
由clk_20 M引入20MHz時鐘頻率,reset鎖定到一個常高按鍵,start_stop鎖定到一位撥碼開關(guān),grade[3..0]由4位撥碼開關(guān)輸入。Light[7..0]鎖定到8個LED燈上,F(xiàn)lag_100km[3..0]和Flag_1000RMB[3..0]分別鎖定到兩位LED數(shù)碼管上,RS、RW、EN、DATA[7..0]分別鎖定到對應的LCD1602的輸入引腳上。通過編譯把程序下載到康芯 KX_7C CycloneⅢ 系列EP3C5E144C8型實驗開發(fā)系統(tǒng)上進行實驗測試。
首先將start_stop和grade[3..0]置零,然后按下復位鍵reset,液晶屏上顯示免費等待時間“<05:00>”,公里計費單價“<1.6/km>”,起步價“¥:007.0”,行駛公里數(shù)“km:00.0”。
當把start_stop置1后,倒計時鐘開始倒計時,表示開始計費,處在等待狀態(tài)。若此時將grade置為任何一個非零值,則倒計時鐘停止倒計時,并且公里數(shù)開始增加,同時8位LED數(shù)碼管順序點亮,點亮的速度隨著grade的值增大而增大。公里數(shù)超過5 km后,每增加1 km,總費用累加1.6元。當公里數(shù)漲到50 km后,行駛單價由1.6變?yōu)?.4,每再增加1 km,總費用累加2.4元。直到公里數(shù)增至100 km,公里數(shù)溢出標志數(shù)碼管加1,而LCD1602顯示公里數(shù)變?yōu)?。此時,如果將grade置零,則倒計時鐘又接著開始倒計時。當?shù)褂嫷?0:00時,開始正計時,且每1分鐘,總費用累加0.8元。當總費用達到1 000時,總費用標志數(shù)碼管加1,LCD1602顯示的總費用從零開始繼續(xù)計費。我們還可以復位后重新開始測試,讓公里數(shù)未到達50 km時,使grade為零,系統(tǒng)進入等待計費狀態(tài),直到總費用增至100元后,行駛單價也會由1.6元變?yōu)?.4元。
在上述過程中,一旦start_stop置0,整個系統(tǒng)將處于暫停狀態(tài),停留在暫停前一時刻的狀態(tài)。一旦reset置0,整個系統(tǒng)復位,回到初始狀態(tài)。
本系統(tǒng)中各個收費參數(shù)標準都可精確到0.1元,在程序中可輕松更改起步價、里程單價、等待時間收費單價等參數(shù),而無需費力更改大量程序。
由于在數(shù)字電路的輸入信號中抖動是不可避免的,抖動會造成嚴重的后果。所以對輸入信號去抖是邏輯電路設(shè)計中的必要環(huán)節(jié),也是提高數(shù)字系統(tǒng)電磁兼容能力的關(guān)鍵技術(shù)[10]。所以在系統(tǒng)中加入了復位按鍵去抖電路 (Key_stable電路模塊),有效的防止在汽車上嘈雜震動環(huán)境下的誤操作。
在使用康芯CycloneⅢ系列EP3C5E144C8型芯片實驗板時,為了實驗演示清晰明了,利用僅有的8個LED燈順序點亮快慢以表示行駛速度的大小,以為客戶顯示更直觀的效果。由于系統(tǒng)總費用的量程范圍為999.9元,總公里數(shù)的量程范圍為99.9 km,為了能夠顯示更大的量程范圍,利用實驗板上的兩位LED數(shù)碼管分別表示總費用和總量程的溢出標志位,即每到1 000元或100 km后,相應的溢出位加1,其范圍為(1~F),這樣該系統(tǒng)顯示的總費用量程能夠達到 15 999.9元,行駛總公里數(shù)能夠達到1 599.9 km。
文中運用VHDL語言采用電子產(chǎn)品設(shè)計中比較先進的FPGA技術(shù)設(shè)計了一款出租車計費系統(tǒng),實現(xiàn)了出租車計費器的主要功能,運行穩(wěn)定、可靠。EDA技術(shù)是以計算機為工具來完成數(shù)字系統(tǒng)的邏輯綜合、布局布線和設(shè)計仿真等工作,電路設(shè)計者只需要完成對系統(tǒng)功能的描述,就可由計算機軟件進行系統(tǒng)處理,得到設(shè)計結(jié)果,且修改設(shè)計方案如同修改軟件一樣方便。如本出租車計費系統(tǒng)中設(shè)定的起步價、行駛單價、免費行駛公里數(shù)、等待時間計費標準、免費等待時間等均不需要硬件電路的支持而直接可以在VHDL源程序中進行修改??梢?,利用FPGA可以極大地提高設(shè)計效率和靈活度并且修改快捷。
[1]黃再銀.基于μPD78F0034單片機的出租車計費器的設(shè)計與實現(xiàn)[J].電子設(shè)計工程,2004(8):21-24.HUANG Zai-yin.The design and realization of taxi-meter based on upD78F0034 microcontro//er[J].Electronic Design Engineering,2004(8):21-24.
[2]廖艷秋.基于FPGA的出租車計費器設(shè)計[D].成都:電子科技大學,2008.
[3]焦敏.FPGA在出租車計費器上的應用研究[J].中國科技信息,2009(9):145-146.JIAO Min.Research of taximeter based on FPEA[J].China Science and Technology Information,2009(9):145-146.
[4]San Jose.實現(xiàn)靈活的汽車電子設(shè)計[R].Altera公司:2007.
[5]劉欲曉,方強,黃宛寧.EDA技術(shù)與VHDL電路開發(fā)應用實踐[M].北京:電子工業(yè)出版社,2009,175-186.
[6]曹公正,陳娟,張寶利,等.FPGA在出租車記費器上的研究與設(shè)計[J].長春工業(yè)大學學報,2007,28(3):267-270.CAO Gong-zheng,CHEN Juan,ZHANG Bow-li,et al.Design of a taxi meter based on FPGA[J].Journal of changchun University of Technology,2007,28(3):267-270.
[7]白瑩杰,杜建銘,羅一星.基于FPGA的脈沖分頻技術(shù)研究[J].微計算機應用,2010,31(3):67-71.BAI Ying-jie,DU Jian-ming,LUO Yi-xing.Research of the pulse frenquency-division technology based on FPGA[J].micro Computer Application,2010,31(3):67-71.
[8]陳英梅,席亮亮.基于FPGA的多種分頻設(shè)計與實現(xiàn)[J].電子元器件應用,2007,9(6):47-52.CHEN Ying-mei,XI Liang-liang.Design and implementation of a mult frequency based on FPGA[J].Electronic Design Engineering,2007,9(6):47-52.
[9]陳忠平,高金定,高見芳.基于Quartus II的FPGA/CPLD設(shè)計與實踐[M].北京:電子工業(yè)出版社,2010.
[10]Stephen Brown,Zvonko Vranesic.數(shù)字邏輯基礎(chǔ)與VHDL設(shè)計[M].3版.北京:清華大學出版社,2011.
[11]劉福奇.基于VHDL的FPGA和Nios II實例精煉[M].北京:北京航空航天大學出版社,2011.
[12]潘松,黃繼業(yè).EDA技術(shù)與VHDL[M].2版.北京:清華大學出版社,2007.