摘要: 介紹了出租車(chē)計(jì)費(fèi)器系統(tǒng)的組成及工作原理,簡(jiǎn)述了在EDA平臺(tái)上用單片CPLD器件構(gòu)成該數(shù)字系統(tǒng)的設(shè)計(jì)思想和實(shí)現(xiàn)過(guò)程。論述了車(chē)型調(diào)整模塊、計(jì)程模塊、計(jì)費(fèi)模塊、譯碼動(dòng)態(tài)掃描模塊等的設(shè)計(jì)方法與技巧。
關(guān)鍵詞: CPLD/PPGA 硬件描述語(yǔ)言 出租車(chē)計(jì)費(fèi)器 MAX+PLUS軟件 數(shù)字系統(tǒng)
隨著EDA技術(shù)的高速發(fā)展,電子系統(tǒng)的設(shè)計(jì)技術(shù)和工具發(fā)生了深刻的變化,大規(guī)???a target="_blank">編程邏輯器件CPLD/FPGA的出現(xiàn),給設(shè)計(jì)人員帶來(lái)了諸多方便。利用它進(jìn)行產(chǎn)品開(kāi)發(fā),不僅成本低、周期短、可靠性高,而且具有完全的知識(shí)產(chǎn)權(quán)。本文介紹了一個(gè)以Altera公司可編程邏輯芯片EPM7128SLC84-15為控制核心、附加一定外圍電路組成的出租車(chē)計(jì)費(fèi)器系統(tǒng)。
1 系統(tǒng)組成
基于CPLD/FPGA的出租車(chē)計(jì)費(fèi)器的組成如圖1所示。各部分主要功能如下:(1)A計(jì)數(shù)器對(duì)車(chē)輪傳感器送來(lái)的脈沖信號(hào)進(jìn)行計(jì)數(shù)(每轉(zhuǎn)一圈送一個(gè)脈沖)。不同車(chē)型的車(chē)輪直徑可能不一樣,通過(guò)“設(shè)置1”對(duì)車(chē)型做出選擇,以實(shí)現(xiàn)對(duì)不同車(chē)輪直徑的車(chē)進(jìn)行調(diào)整。(2)B計(jì)數(shù)器對(duì)百米脈沖進(jìn)行累加,并輸出實(shí)際公里數(shù)的BCD碼給譯碼動(dòng)態(tài)掃描模塊。每計(jì)滿(mǎn)500送出一個(gè)脈沖給C計(jì)數(shù)器。“設(shè)置2”實(shí)現(xiàn)起步公里數(shù)預(yù)制。(3)C計(jì)數(shù)器實(shí)現(xiàn)步長(zhǎng)可變(即單價(jià)可調(diào))的累加計(jì)數(shù),每500米計(jì)費(fèi)一次?!霸O(shè)置3”用來(lái)完成超價(jià)加費(fèi)、起步價(jià)預(yù)制等。(4)譯碼/動(dòng)態(tài)掃描將路程與費(fèi)用的數(shù)值譯碼后用動(dòng)態(tài)掃描的方式驅(qū)動(dòng)數(shù)碼管。(5)數(shù)碼管顯示將公里數(shù)和計(jì)費(fèi)金額均用四位LED數(shù)碼管顯示(三位整數(shù),1位小數(shù))。
2 功能模塊設(shè)計(jì)
出租車(chē)計(jì)費(fèi)器由車(chē)型調(diào)整模塊、計(jì)程模塊、計(jì)費(fèi)模塊、譯碼動(dòng)態(tài)及掃描等模塊組成,整個(gè)系統(tǒng)采用模塊化設(shè)計(jì),首先用VHDL編寫(xiě)功能模塊,然后用頂層原理圖將各功能模塊連接起來(lái)。
2.1 車(chē)型調(diào)整模塊
出租車(chē)車(chē)型并非單一,各個(gè)車(chē)型的輪胎直徑亦有所不同。據(jù)調(diào)查統(tǒng)計(jì),現(xiàn)行出租車(chē)輪胎直徑大致有四種,直徑分別為520mm、540mm、560mm和580mm。若要使不同車(chē)型的出租車(chē)每行駛一百米均送出一個(gè)脈沖,可通過(guò)設(shè)置“可預(yù)制分頻器”的系數(shù)來(lái)完成。根據(jù)上述車(chē)輪直徑計(jì)算出的分頻系數(shù)分別為61、59、57和55。預(yù)制數(shù)據(jù)受兩個(gè)車(chē)型設(shè)置開(kāi)關(guān)控制,DIP開(kāi)關(guān)狀態(tài)與車(chē)輪直徑對(duì)應(yīng)關(guān)系如表1所示(表中“1”為高電平,“0”為低電平)。
表1 車(chē)型設(shè)置
車(chē)輪直徑(mm)
|
520
|
540
|
560
|
580
|
DIP開(kāi)關(guān)(兩位)
|
00
|
01
|
10
|
11
|
在參數(shù)預(yù)制中,使用With_Select語(yǔ)句(查表法)做分頻選擇:
with cartype select
typecounter<=“111101”when“00”, --520mm
“111011”when“01”, --540mm
“111001”when“10”, ——560mm
“111000”when“11”, --580mm
“000000”when others;
分頻器采用的是加法分頻電路,其占空比可通過(guò)datal(x)進(jìn)行調(diào)整,并且分頻器帶有“開(kāi)始”/“清零”端(高電平清零)。時(shí)序仿真波形如圖2所示。從圖中可以看出,對(duì)于設(shè)置開(kāi)關(guān)為“10”的車(chē)型,當(dāng)?shù)?7個(gè)脈沖到來(lái)時(shí),該模塊oclk端從高變低,輸出一低電平信號(hào)。車(chē)型調(diào)整模塊(以下簡(jiǎn)稱(chēng)FP)封裝見(jiàn)圖4。
2.2 計(jì)程模塊
計(jì)程模塊是一個(gè)模為10、步長(zhǎng)為1的加法計(jì)數(shù)器。該模塊可以預(yù)制參數(shù),使其實(shí)際計(jì)數(shù)值大于預(yù)制數(shù)值后,每500米送出一個(gè)脈沖,并將計(jì)數(shù)值送譯碼動(dòng)態(tài)掃描模塊進(jìn)行顯示。預(yù)制參數(shù)采用非壓縮BCD碼,所以在計(jì)數(shù)器設(shè)計(jì)時(shí)必須將二進(jìn)制1010至1111六個(gè)狀態(tài)跳過(guò)去。在VHDL程序中,用IF語(yǔ)句來(lái)實(shí)現(xiàn)。
if km(3 downto 0)=“1001”then km:=km+“0111”:
else km:=kin+1;
end if;
計(jì)程模塊也帶有“開(kāi)始”/“清零”端。參數(shù)預(yù)制同樣使用With_Select語(yǔ)句?!捌鸩嚼锍獭焙汀伴_(kāi)關(guān)設(shè)置”對(duì)應(yīng)關(guān)系如表2所示。計(jì)程模塊(以下簡(jiǎn)稱(chēng)MILE)封裝見(jiàn)圖4。
表2 起步里程設(shè)置
起步里程(km)
|
1.0
|
2.0
|
3.0
|
4.0
|
5.0
|
6.0
|
7.0
|
8.0
|
DIP開(kāi)關(guān)(3位)
|
000
|
001
|
010
|
011
|
100
|
101
|
110
|
111
|
2.3 計(jì)費(fèi)模塊
計(jì)費(fèi)模塊是一個(gè)模為10、步長(zhǎng)可變的加法計(jì)數(shù)器。該模塊通過(guò)開(kāi)關(guān)量預(yù)制步長(zhǎng),當(dāng)超過(guò)一定預(yù)制參數(shù)時(shí)改變步長(zhǎng)。計(jì)費(fèi)模塊也采用非壓縮BCD碼,但因步長(zhǎng)不為1,所以在做非壓縮BCD加法時(shí)必須調(diào)整,否則可能導(dǎo)致在超過(guò)或未超過(guò)預(yù)置參數(shù)時(shí)出現(xiàn)超程錯(cuò)誤。這里采用模仿微機(jī)的AF標(biāo)志位,在其設(shè)立一個(gè)半進(jìn)位標(biāo)志,當(dāng)累加和大于9或半進(jìn)位標(biāo)志為“1”時(shí),對(duì)累加和進(jìn)行調(diào)整。
if datal(3 downto 0)>9 or datal(4)=‘1'then
datal(3 downto 0):=datal(3 downto 0)+“0110”;
datal(8 downto 5):=datal(8 downto 5)+1;
end if;
其中,data(4)為半進(jìn)位標(biāo)志?!捌鸩絻r(jià)格”和“超價(jià)加費(fèi)”設(shè)置參數(shù)分別如表3和表4所示。計(jì)費(fèi)模塊(以下簡(jiǎn)稱(chēng)MONEY)封裝見(jiàn)圖4。
表3 起步價(jià)格設(shè)置
起步價(jià)格(元)
|
1.2
|
1.6
|
2.0
|
2.4
|
2.8
|
3.2
|
3.6
|
DIP開(kāi)關(guān)(3位)
|
001
|
010
|
011
|
100
|
101
|
110
|
111
|
表4 超價(jià)加費(fèi)設(shè)置
超價(jià)加費(fèi)(元)
|
10.0
|
15.0
|
20.0
|
25.0
|
DIP開(kāi)關(guān)(2位)
|
00
|
01
|
10
|
11
|
2.4 顯示模塊
顯示模塊由七段LED數(shù)碼管譯碼和動(dòng)態(tài)掃描顯示兩部分組成。
2.4.1 七段LED數(shù)碼管譯碼
本次設(shè)計(jì)采用的是共陰極七段數(shù)碼管,根據(jù)16進(jìn)制數(shù)和七段顯示段碼表的對(duì)應(yīng)關(guān)系,用VHDL的With_Select或When_Else語(yǔ)句可方便實(shí)現(xiàn)它們的譯碼。
圖2
2.4.2 動(dòng)態(tài)掃描顯示
動(dòng)態(tài)掃描是利用人眼的視覺(jué)暫留原理,只要掃描頻率不小于24Hz,人眼就感覺(jué)不到顯示器的閃爍。本系統(tǒng)24Hz的掃描脈沖由相應(yīng)的外圍電路提供。動(dòng)態(tài)掃描電路設(shè)計(jì)的關(guān)鍵在于位選信號(hào)要與顯示的數(shù)據(jù)在時(shí)序上一一對(duì)應(yīng),因此電路中必須提供同步脈沖信號(hào)。這里采用八進(jìn)制計(jì)數(shù)器提供同步脈沖,VHDL程序段如下:
cIkl_label:PROCESS(scp)
BEGIN
IF scp'vent and scp=‘1'THEN count<=count+1;
END IF;
END PROCESS clkl_label;
顯示數(shù)據(jù)的選擇由計(jì)數(shù)器控制,VHDL程序段如下:
temp<=counterl when count=“000”else...
counter4 when count=“011”else
milel when count=“100”else...
mile4 when count=“111”;
位選信號(hào)時(shí)序仿真如圖3所示。從時(shí)序仿真圖和上述程序可以看出,位選信號(hào)和要顯示的數(shù)據(jù)實(shí)現(xiàn)了同步。
圖3
動(dòng)態(tài)掃描電路中小數(shù)點(diǎn)的顯示無(wú)法在譯碼電路中完成。由于小數(shù)點(diǎn)的位置是固定的,因此可由計(jì)數(shù)器提供的同步信號(hào)產(chǎn)生另一信號(hào)控制DP。VHDL程序?qū)崿F(xiàn)如下:
if (count:“101”or count=“001”)then data(0)<=‘1';
else data(0)<=‘0';
end if;
顯示模塊(以下簡(jiǎn)稱(chēng)SHOW)封裝見(jiàn)圖4。此模塊中應(yīng)用了兩個(gè)過(guò)程,在過(guò)程內(nèi)程序順序執(zhí)行,其中第一個(gè)過(guò)程觸發(fā)第二個(gè)過(guò)程。
3 系統(tǒng)綜合
3.1 模塊聯(lián)調(diào)
各個(gè)功能子模塊設(shè)計(jì)完成后,利用MAXPLUSⅡ的圖形編輯器(Graphic Editor)將各功能子模塊(.sym)進(jìn)行連接。由于MILE模塊中存在毛刺,故不能直接與后級(jí)相連,通過(guò)對(duì)輸出脈沖信號(hào)加門(mén)電路延時(shí),再與原始信號(hào)相“與”的方法即可消除毛刺。系統(tǒng)頂層原理圖如圖4所示。
芯片管腳定義可以直接用編輯.pin文件或在Floor—Plan Editor下進(jìn)行。完成管腳定義后選擇器件(EPM7128SIC84—15),編譯后生成.sof、.pof及報(bào)告文件.rpt。查看報(bào)告文件可得到器件管腳的利用情況及器件內(nèi)部資源的使用情況。通過(guò)更換適當(dāng)?shù)钠骷蛊滟Y源配置達(dá)到最優(yōu)。選擇器件的一般原則是系統(tǒng)所使用的資源不要超過(guò)器件資源的80%,若超過(guò)90%,系統(tǒng)功耗將增大,工作不穩(wěn)定。從本次設(shè)計(jì)器件部分報(bào)告中得知:輸入、輸出管腳各用16只,芯片資源利用率僅為51%,具有較大的擴(kuò)展空間。
圖4
3.2 硬件設(shè)計(jì)說(shuō)明
本次設(shè)計(jì)的出租車(chē)計(jì)費(fèi)器計(jì)數(shù)脈沖CP來(lái)自車(chē)輪轉(zhuǎn)速傳感器(干簧管),脈沖經(jīng)器件內(nèi)部整形后送計(jì)數(shù)器;動(dòng)態(tài)掃描脈沖由外圍電路給出;系統(tǒng)使用整流、濾波、降壓后的出租車(chē)電源供電;由于CPLD/FPGA的驅(qū)動(dòng)能力有限,為了增強(qiáng)數(shù)碼管的亮度,提高系統(tǒng)的可靠性,設(shè)計(jì)中在LED驅(qū)動(dòng)和位驅(qū)動(dòng)上分別增加了電流驅(qū)動(dòng)器件ULN2803和2SCl015。
現(xiàn)場(chǎng)實(shí)驗(yàn)表明:該計(jì)費(fèi)器實(shí)現(xiàn)了按預(yù)制參數(shù)自動(dòng)計(jì)費(fèi)(最大計(jì)費(fèi)金額為999.9元)、自動(dòng)計(jì)程(最大計(jì)程公里數(shù)為999.9公里)等功能;能夠?qū)崿F(xiàn)起步價(jià)、每公里收費(fèi)、車(chē)型及加費(fèi)里程的參數(shù)預(yù)制(如:起步價(jià)5.00元;3公里后,1.20元/公里;計(jì)費(fèi)超過(guò)15.00元,每公里加收50%的車(chē)費(fèi)等),且預(yù)置參數(shù)可調(diào)范圍大。由于采用了CPLD/FPGA大規(guī)模可編程邏輯器件,整機(jī)功耗小、抗干擾能力強(qiáng)、系統(tǒng)穩(wěn)定、工作可靠、升級(jí)方便。另外,根據(jù)實(shí)際需要,系統(tǒng)可方便地增加以下功能:①通過(guò)芯片內(nèi)部編程增加時(shí)鐘功能(器件內(nèi)部資源足夠),既可為司機(jī)和乘客提供方便,又能為夜間行車(chē)自動(dòng)調(diào)整收費(fèi)標(biāo)準(zhǔn)提供參考;②用CPLD/FPGA的輸出引線(xiàn)控制語(yǔ)音芯片,可向乘客發(fā)出問(wèn)候語(yǔ)、提醒乘客告訴司機(jī)所要到達(dá)的地點(diǎn)、報(bào)出應(yīng)收繳的費(fèi)用等。
評(píng)論
查看更多