王曉磊 李宏生
(東南大學(xué)微慣性?xún)x表與先進(jìn)導(dǎo)航技術(shù)教育部重點(diǎn)實(shí)驗(yàn)室 南京 210096)
有限狀態(tài)機(jī)(Finite State Machine,FSM)及其技術(shù)是實(shí)用數(shù)字系統(tǒng)設(shè)計(jì)中實(shí)現(xiàn)高效率高可靠邏輯控制的重要途徑,是一種簡(jiǎn)單、結(jié)構(gòu)清晰、設(shè)計(jì)靈活的方法,它易于建立、理解和維護(hù),特別應(yīng)用在具有大量狀態(tài)轉(zhuǎn)移和復(fù)雜時(shí)序控制的系統(tǒng)中,更顯其優(yōu)勢(shì)。
有限狀態(tài)機(jī)模型可以用下面包含5種元素的集合來(lái)表示{X,Y,S,f,g},假設(shè)S={S1,S2,…,Sk}是FSM中狀態(tài)的集合;X={X1,X2,…,Xn}是FSM中輸入的集合;Y={Y1,Y2,…,Ym}是FSM中輸出的集合;f為狀態(tài)轉(zhuǎn)移函數(shù),表示由輸入信號(hào)變量X和當(dāng)前狀態(tài)X決定下一個(gè)狀態(tài),即:XY→S;g為輸出函數(shù),表示由輸入信號(hào)變量X和狀態(tài)S決定狀態(tài)機(jī)的輸出變量Y,即:XS→Y。從上面定義可以看出,有限狀態(tài)機(jī)包含5類(lèi)基本要素:即狀態(tài)、輸入、輸出、轉(zhuǎn)移函數(shù)及輸出函數(shù)。它們分別用矢量函數(shù)表示如下[1]:
根據(jù)有限狀態(tài)機(jī)是否使用輸入信號(hào),分為Moore型有限狀態(tài)機(jī)和Mealy型有限狀態(tài)機(jī)。Moore型狀態(tài)機(jī)的輸出只與當(dāng)前的狀態(tài)有關(guān)而與輸入無(wú)關(guān),而Mealy型狀態(tài)機(jī)的輸出不僅與當(dāng)前狀態(tài)有關(guān),還與當(dāng)前的輸入有關(guān),它們共同決定Mealy狀態(tài)機(jī)的輸出。本控制系統(tǒng)采用Moore型有限狀態(tài)機(jī)實(shí)現(xiàn)數(shù)字溫度傳感器的控制。
DS18B20是單總線(xiàn)式數(shù)字溫度傳感器,支持“一線(xiàn)總線(xiàn)”接口,測(cè)量得到的數(shù)據(jù)為數(shù)字量,不需要經(jīng)過(guò)模數(shù)轉(zhuǎn)換。每一次命令和數(shù)據(jù)傳輸都是從主機(jī)啟動(dòng)寫(xiě)時(shí)序開(kāi)始,如果要求從機(jī)回送數(shù)據(jù),在寫(xiě)命令后,主機(jī)需啟動(dòng)讀時(shí)序接收數(shù)據(jù)。
DS18B20有嚴(yán)格的信號(hào)時(shí)序,包括:
1)復(fù)位脈沖和應(yīng)帶脈沖
單總線(xiàn)上的所有通信都是以初始化序列開(kāi)始。主機(jī)輸出低電平,保持低電平時(shí)間至少480μ s,以產(chǎn)生復(fù)位脈沖。接著主機(jī)釋放總線(xiàn),4.7kΩ上拉電阻將單總線(xiàn)拉高,延時(shí) 15~60μ s,并進(jìn)入接收模式。接著DS18B20拉低總線(xiàn)60~240μ s,以產(chǎn)生低電平應(yīng)答脈沖,若為低電平,再延時(shí)480μ s。如圖1所示。
圖1 復(fù)位與應(yīng)答脈沖
2)寫(xiě)時(shí)隙
寫(xiě)時(shí)隙包括寫(xiě)0時(shí)隙和寫(xiě)1時(shí)隙。所有寫(xiě)時(shí)隙至少需要60μ s,且在2次獨(dú)立的寫(xiě)時(shí)隙之間至少需要1μ s的恢復(fù)時(shí)間,兩種寫(xiě)時(shí)隙均起始于主機(jī)拉低總線(xiàn)。
3)讀時(shí)隙
DS18B20僅在主機(jī)發(fā)出讀時(shí)隙時(shí),才向主機(jī)傳輸數(shù)據(jù),所以,在主機(jī)發(fā)出讀數(shù)據(jù)命令后,必須馬上產(chǎn)生讀時(shí)隙,以便從機(jī)能夠傳輸數(shù)據(jù)。所有讀時(shí)隙至少需要60μ s,且在2次獨(dú)立的讀時(shí)隙之間至少需要1μ s的恢復(fù)時(shí)間。每個(gè)讀時(shí)隙都由主機(jī)發(fā)起,至少在時(shí)隙起始后的15μ s之內(nèi)采樣總線(xiàn)狀態(tài)。
本設(shè)計(jì)采用Altera公司的 EP2C8T144I8N CYCLONEⅡ芯片作為系統(tǒng)控制器[3]。
控制模塊包括clk_div分頻模塊和Temperature狀態(tài)機(jī)控制模塊。clk_div模塊功能是將系統(tǒng)時(shí)鐘20MHz分頻為1MHz;temperature模塊功能是向DS18B20輸出控制命令,并將DS18B20并將測(cè)量得到的數(shù)字溫度值輸出。
在FPGA芯片中,一般信號(hào)線(xiàn)用做總線(xiàn)等雙向數(shù)據(jù)傳輸?shù)臅r(shí)候就要用到INOUT類(lèi)型了。inout在具體實(shí)現(xiàn)上一般用三態(tài)門(mén)來(lái)實(shí)現(xiàn)。三態(tài)門(mén)的第三個(gè)狀態(tài)就是高阻‘Z'。當(dāng)inout端口不輸出時(shí),將三態(tài)門(mén)置高阻。在 Temperature控制模塊中,sensor_DQ引腳在VerilogHDL語(yǔ)法中定義為inout類(lèi)型,此引腳連接DS18B20的DQ引腳[4]。
本系統(tǒng)設(shè)計(jì)中,定義了:
對(duì)于sensor_DQ_out,可以通過(guò)組合邏輯或者時(shí)序邏輯根據(jù)sensor_DQ_in對(duì)其賦值。通過(guò)控制sensor_DQ_en的高低電平,從而設(shè)置sensor_DQ是輸出數(shù)據(jù)還是處于高阻態(tài),如果處于高阻態(tài),則此時(shí)當(dāng)做輸入端口使用,sensor_DQ_en可以通過(guò)相關(guān)電路來(lái)控制。
為了保證測(cè)量數(shù)據(jù)的可靠傳輸,任一時(shí)刻單總線(xiàn)上只能有一個(gè)控制或數(shù)據(jù)信號(hào)。訪(fǎng)問(wèn)DS18B20的操作順序遵循以下三步:
第一步:初始化;
第二步:ROM命令;
第三步:DS18B20功能命令;
單總線(xiàn)數(shù)字溫度傳感器DS18B20時(shí)序控制流程圖如圖5所示。
圖5 狀態(tài)機(jī)時(shí)序控制流程圖
采用VerilogHDL語(yǔ)言描述此Moore型有限狀態(tài)機(jī),FPGA通過(guò)單總線(xiàn)對(duì)DS18B20進(jìn)行操作,其one-hot編碼定義的狀態(tài)變量如表1所示[5]。
表1 one-hot編碼定義
其中,initial_pulse:復(fù)位和應(yīng)答脈沖狀態(tài),用于DS18B20的初始化,以及主從器件通信的開(kāi)始;程序中首先發(fā)送480μ s的低電平,而后釋放總線(xiàn)90μ s,然后再釋放總線(xiàn)400μ s,檢測(cè)器件的應(yīng)答脈沖。
skip_ROM:跳過(guò)ROM狀態(tài)。當(dāng)主機(jī)檢測(cè)到應(yīng)答脈沖后,發(fā)出ROM命令,本系統(tǒng)只連接單個(gè)DS18B20,故發(fā)出跳過(guò) ROM(skip ROM)命令CCh。
write_byte:寫(xiě)字節(jié)狀態(tài)。由于DS18B20功能命令均為一個(gè)字節(jié)長(zhǎng)度,故用于其他寫(xiě)指令狀態(tài)的調(diào)用。
write_0:寫(xiě) 0時(shí)隙狀態(tài),用于主機(jī)向DS18B20寫(xiě)低電平;程序中寫(xiě)時(shí)隙15μ s,拉低總線(xiàn);而后FPGA 發(fā)送60μ s的低電平;再經(jīng)過(guò)10μ s的恢復(fù)時(shí)間,這就完成了寫(xiě)數(shù)據(jù)0。
write_1:寫(xiě) 1時(shí)隙狀態(tài),用于主機(jī)向DS18B20寫(xiě)高電平;程序中寫(xiě)時(shí)隙15μ s,拉低總線(xiàn);而后FPGA 發(fā)送60μ s的高電平;再經(jīng)過(guò)10μ s的恢復(fù)時(shí)間,這就完成了寫(xiě)數(shù)據(jù)1。
convert_Temp:溫度轉(zhuǎn)換狀態(tài);FPGA發(fā)送命令數(shù)據(jù)44h,用于主機(jī)啟動(dòng)溫度轉(zhuǎn)換。
wait_750ms:等待器件溫度轉(zhuǎn)換狀態(tài);主機(jī)發(fā)出溫度轉(zhuǎn)換命令后,進(jìn)入wait_750ms狀態(tài),等待傳感器溫度轉(zhuǎn)換,以及數(shù)據(jù)存儲(chǔ)。
read_scratchpad:讀暫存器(scratchpad)狀態(tài);FPGA發(fā)送命令數(shù)據(jù)BEh。
get_Temp:讀取溫度轉(zhuǎn)換數(shù)據(jù)狀態(tài),主機(jī)命令DS18B20讀取溫度值。
read_bit:位讀取狀態(tài);傳感器轉(zhuǎn)換后的數(shù)據(jù)存于暫存器,主機(jī)通過(guò)單總線(xiàn)一位一位的讀出,存于寄存器中;程序中先2μ s讀時(shí)隙,而后延時(shí)10μ s;再經(jīng)過(guò)3μ s的讀數(shù)據(jù)時(shí)間,而后延時(shí) 55μ s,這樣就完成了一位數(shù)據(jù)的讀出[6]。
嵌入式邏輯分析儀Signal TapⅡ主要用于分析數(shù)字系統(tǒng)的檢測(cè)和故障診斷問(wèn)題,是數(shù)據(jù)域測(cè)試中一種非常有效的測(cè)試方式。它在對(duì)系統(tǒng)硬件模塊進(jìn)行監(jiān)測(cè)時(shí),是將測(cè)得的樣本數(shù)據(jù)暫存于目標(biāo)器件的RAM中,然后通過(guò)器件的JTAG端口和USB BlasterⅡ下載線(xiàn)一起將樣本數(shù)據(jù)信息傳出并送入計(jì)算機(jī)進(jìn)行數(shù)據(jù)分析。通過(guò)實(shí)踐證明,在 FPGA上用這種方法抓取數(shù)字信號(hào)更便捷,更準(zhǔn)確,易實(shí)現(xiàn)更高的精度。
其調(diào)試的基本步驟如下[8]:
1)打開(kāi)Signal TapⅡ編輯窗;
2)調(diào)入待測(cè)信號(hào);
3)相關(guān)參數(shù)設(shè)置。首先設(shè)置采樣時(shí)鐘;其次設(shè)置采樣深度;最后設(shè)置觸發(fā)條件;
4)下載、啟動(dòng)并查看數(shù)據(jù)。
當(dāng)測(cè)試程序下載到FPGA并運(yùn)行后,用Signal TapⅡ抓取DS18B20的輸入輸出端口以及讀取溫度數(shù)據(jù)信號(hào)如圖6所示。
圖6 Signal TapⅡ調(diào)試圖
文中分析了DS18B20的工作原理,并采用有限狀態(tài)機(jī)設(shè)計(jì)其控制邏輯,相比單片機(jī)控制,更具有實(shí)時(shí)性,實(shí)現(xiàn)了溫度采集接口,該接口可以作為一個(gè)獨(dú)立模塊嵌入到其他電路組成的應(yīng)用系統(tǒng)中。
有限狀態(tài)機(jī)作為數(shù)字邏輯理論的一個(gè)重要組成部分,不僅是重要的軟件基礎(chǔ)理論,而且在硬件設(shè)計(jì)中也發(fā)揮著重要的作用,特別是在利用EDA技術(shù)進(jìn)行可編程ASIC設(shè)計(jì)時(shí)。
[1]Zhang Peiren,Zhou Yanping.A Large-Scale Temperature Alarm System Based on 1-Wire Bus and CAN bus[J].Control&Automation,2003(2):25~26
[2]李鋼,趙彥峰.1-Wire總線(xiàn)數(shù)字溫度傳感器DS18B20原理及應(yīng)用[J].現(xiàn)代電子技術(shù),2005,28(21):77~79
[3]周岳斌.基于FPGA的數(shù)字溫度傳感器接口設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2007,12:51~52
[4]何文龍,房建東.基于FPGA的數(shù)字溫度傳感器控制方法[J].電子測(cè)量技術(shù),2008,11:178~181
[5]劉小平,何云斌,董懷國(guó).基于VerilogHDL的有限狀態(tài)機(jī)設(shè)計(jì)與描述[J].計(jì)算機(jī)工程與設(shè)計(jì),2008,29(4):958~960
[6]王凌,宋揚(yáng)等.基于有限狀態(tài)機(jī)的飛行器自毀系統(tǒng)時(shí)序控制設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2009,8
[7]胡文軍,李英輝.嵌入式邏輯分析儀在FPGA設(shè)計(jì)中的應(yīng)用[J].微計(jì)算機(jī)信息,2007,23:211~212,203
[8]袁火平,盧艷娥,等.基于SignaltapⅡ的高速數(shù)據(jù)采集系統(tǒng)[J].微計(jì)算機(jī)信息,2008,24:9