基于FPGA的數(shù)字電壓表的設(shè)計(jì)
0 引 言
傳統(tǒng)的數(shù)字電壓表設(shè)汁通常以大規(guī)模ASIC(專用集成電路)為核心器件,并輔以少量中規(guī)模集成電路及顯示器件構(gòu)成。ASIC完成從模擬量的輸入到數(shù)字量的輸出,是數(shù)字電壓表的心臟。這種電壓表的設(shè)計(jì)簡(jiǎn)單、精確度高,但是這種設(shè)計(jì)方法由于采用了ASIC器件使得它欠缺靈活性,其系統(tǒng)功能固定,難以更新擴(kuò)展。后來發(fā)展起來的用微處理器(單片機(jī))控制通用A/D轉(zhuǎn)換器件的數(shù)字電壓表的設(shè)計(jì)的靈活性明顯提高,系統(tǒng)功能的擴(kuò)展變得簡(jiǎn)單,但是由于微處理器的引腳數(shù)量有限,其控制轉(zhuǎn)換速度和靈活性還是不能滿足日益發(fā)展的電子工業(yè)的需求。而應(yīng)用EDA(電子設(shè)汁自動(dòng)化)技術(shù)及FPGA(現(xiàn)場(chǎng)可編程門陣列),其集成度高、速度快、性能十分可靠、用戶可自由編程且編程語言通俗易懂、系統(tǒng)功能擴(kuò)展非常方便[1]。采用FPGA芯片控制通用A/D轉(zhuǎn)換器可使速度、靈活性大大優(yōu)于由微處理器和通用A/D轉(zhuǎn)換器構(gòu)成的數(shù)字電壓表。
1 系統(tǒng)設(shè)計(jì)原理
本設(shè)計(jì)利用ADC0809作為電壓采樣端口,F(xiàn)PGA作為系統(tǒng)的核心器件,用LED(發(fā)光二極管)進(jìn)行數(shù)碼顯示。
采用Alterla公司FLEX10K系列EPF10K20TC144-4 芯片F(xiàn)PGA作為系統(tǒng)的核心器件,負(fù)責(zé)ADC0809的A/D轉(zhuǎn)換的啟動(dòng)、地址鎖存、輸入通道選擇、數(shù)據(jù)讀取。同時(shí),把讀取的8位二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成便于輸出的3位十進(jìn)制BCD碼送給數(shù)碼管,以顯示當(dāng)前測(cè)量電壓值。這些工作由ADC0809轉(zhuǎn)換控制模塊、數(shù)據(jù)轉(zhuǎn)換模塊、譯碼模塊完成。
2 FPGA軟件設(shè)計(jì)及模塊仿真
2.1 A/D轉(zhuǎn)換控制模塊的軟件設(shè)計(jì)
本模塊完成ADC0809的初始化、A/D轉(zhuǎn)換的啟動(dòng)、地址鎖存、通道選擇、狀態(tài)讀取及數(shù)據(jù)讀取、數(shù)據(jù)鎖存等功能。此模塊的軟件設(shè)計(jì)主要采用VHDL的多進(jìn)程狀態(tài)機(jī)完成[4]。
工作時(shí)序如下:上電瞬問,F(xiàn)PGA初始化,ADD置成"01",狀態(tài)機(jī)處于第1個(gè)狀態(tài),此時(shí)ALE、START、OE、LOCK(數(shù)據(jù)鎖存信號(hào))均置0,初始化ADC0809。第1個(gè)上升沿到來時(shí),狀態(tài)機(jī)由狀態(tài)1轉(zhuǎn)換到狀態(tài)2,ALE、START置1,OE、LOCK為0,此時(shí)地址鎖存信號(hào)有效,由ALE將ADD的"01"狀態(tài)鎖存到地址鎖存器并譯碼,選擇IN1即通道1作為模擬信號(hào)輸入端,同時(shí)STRAT信號(hào)有效,啟動(dòng)采樣。第2個(gè)上升沿到來時(shí),狀態(tài)機(jī)由狀態(tài)2轉(zhuǎn)換到狀態(tài)3,ALE、START返回到低電平,OE、LOCK繼續(xù)為低電平,此時(shí)如果FPGA檢測(cè)到ADC0809的EOC引腳由低電平變成高電平(A/D轉(zhuǎn)換完成),則當(dāng)時(shí)鐘上升沿到來時(shí),轉(zhuǎn)換到狀態(tài)3,否則繼續(xù)保持在狀態(tài)2,直到轉(zhuǎn)換完成。由狀態(tài)2轉(zhuǎn)換到狀態(tài)3后,OE置高電平,允許轉(zhuǎn)換數(shù)據(jù)輸出,其余信號(hào)狀態(tài)保持不變。時(shí)鐘上升沿再次到來時(shí),狀態(tài)機(jī)由狀態(tài)3轉(zhuǎn)換到狀態(tài)4,LOCK置高電平,其余信號(hào)與狀態(tài)3一樣。當(dāng)LOCK由低電平轉(zhuǎn)換到高電平的瞬問,穩(wěn)定的數(shù)據(jù)鎖存到鎖存器。上升沿再次到來,則狀態(tài)機(jī)返回狀態(tài)0??刂破髟跁r(shí)鐘信號(hào)控制下完成狀態(tài)轉(zhuǎn)換,實(shí)現(xiàn)對(duì)ADC0809的控制[3]。
2.2 數(shù)據(jù)轉(zhuǎn)換模塊的軟件設(shè)計(jì)
本設(shè)計(jì)采用5 V參考電壓,測(cè)量范圍為0~5 V,由于轉(zhuǎn)換器件為8位,則電壓的最小分辨率為0.02V,因此待轉(zhuǎn)換數(shù)據(jù)。
編一個(gè)查表程序,對(duì)上述電壓進(jìn)行BCD碼編碼,然后根據(jù)對(duì)應(yīng)的4位BCD碼相加的結(jié)果決定是否進(jìn)位,從而得到待處理數(shù)據(jù)的BCD碼[5]。例如:從AD0809上取得的數(shù)據(jù)為"11011110",1101對(duì)應(yīng)的電壓值為4.16 V,其對(duì)應(yīng)的BCD編碼為"010000010110",1110對(duì)應(yīng)的電壓值為0.28 V,其對(duì)應(yīng)的BCD編碼為"000000101000"。低4位相加為1110,大于9,加6將其調(diào)整為BCD碼,其值為0100,并且向前有一進(jìn)位。4位相加的結(jié)果為0011,由于低位有進(jìn)位,因此最終結(jié)果為0100。高4位的結(jié)果為0100。3位合計(jì)的值為4.44 V,與4.16+0.28的結(jié)果相符。
2.3 譯碼輸出模塊的軟件設(shè)計(jì)
本模塊的任務(wù)是把數(shù)據(jù)處理模塊處理得到的BCD碼轉(zhuǎn)換成能被數(shù)碼管識(shí)別的字型編碼。8位二進(jìn)制數(shù)轉(zhuǎn)換成BCD碼后為12位,因此需3個(gè)數(shù)碼管顯示結(jié)果。為了節(jié)省資源,采用掃描方式控制數(shù)碼管的顯示,掃描時(shí)鐘由CK提供,其頻率應(yīng)大于100 Hz,否則會(huì)有閃爍現(xiàn)象。
3 系統(tǒng)仿真及驗(yàn)證
當(dāng)FPGA從AD0809上讀取的數(shù)據(jù)為0F8H(十進(jìn)制248)時(shí)輸出的段碼為66H、6FH、7D,分別對(duì)應(yīng)字符4、9、6,加上小數(shù)點(diǎn)就是4.96 V,而其分辨率為0.02 V,則A/D轉(zhuǎn)換得到的電壓值應(yīng)為0F8x0.02 V=4.96 V。顯示結(jié)果與理論推算完全相符。
選EPF10K10TC20TC144-4作為目標(biāo)器件并進(jìn)行正確的引腳鎖定后,將程序下載到目標(biāo)配置器件[6]。改變ADC0809的模擬通道輸入電壓,觀察數(shù)碼管的輸出,其輸出隨著輸人電壓的變化而變化,當(dāng)輸入電壓變?yōu)?時(shí),數(shù)碼管的輸出為0,輸人為5 V時(shí)數(shù)碼管輸出也為5.00 V,其余情況下輸入與輸出也一致,至此,基于FPGA的數(shù)字電壓表設(shè)計(jì)完成。本設(shè)計(jì)的結(jié)果已通過硬件測(cè)試。
4 結(jié)束語
本設(shè)計(jì)只用了ADC0809的一個(gè)通道,在不改變硬件電路的前提下,只要稍微改變VHDL的源程序,就可實(shí)現(xiàn)其余通道的利用,構(gòu)成復(fù)雜的數(shù)據(jù)采集系統(tǒng)。數(shù)據(jù)處理模塊用查表方式設(shè)計(jì),設(shè)計(jì)比較簡(jiǎn)單,易于理解,但對(duì)FPGA的芯片資源利用率不高,因此要想編寫出更高效率的數(shù)據(jù)處理源程序,可以用權(quán)位相加的方法實(shí)現(xiàn),其原理見文獻(xiàn)[5]。這種方法不是很好理解,但是其資源利用率明顯高于查表方式;同時(shí)可以用LCD(液晶顯示器)代替LED顯示,用LCD顯示時(shí)譯碼程序要進(jìn)行相應(yīng)更改,以便與LCD驅(qū)動(dòng)時(shí)序同步。編碼用ASCII碼,并且由于LCD的速度較慢,因此時(shí)鐘頻率不能過高,否則將不能對(duì)LCD進(jìn)行讀寫。本設(shè)計(jì)通過添加一些前置電路就可擴(kuò)展其功能,如果采用16位A/D轉(zhuǎn)換器,則可以提高其分辨率。