王曉磊 李宏生
(東南大學微慣性儀表與先進導航技術教育部重點實驗室 南京 210096)
有限狀態機(Finite State Machine,FSM)及其技術是實用數字系統設計中實現高效率高可靠邏輯控制的重要途徑,是一種簡單、結構清晰、設計靈活的方法,它易于建立、理解和維護,特別應用在具有大量狀態轉移和復雜時序控制的系統中,更顯其優勢。
有限狀態機模型可以用下面包含5種元素的集合來表示{X,Y,S,f,g},假設S={S1,S2,…,Sk}是FSM中狀態的集合;X={X1,X2,…,Xn}是FSM中輸入的集合;Y={Y1,Y2,…,Ym}是FSM中輸出的集合;f為狀態轉移函數,表示由輸入信號變量X和當前狀態X決定下一個狀態,即:XY→S;g為輸出函數,表示由輸入信號變量X和狀態S決定狀態機的輸出變量Y,即:XS→Y。從上面定義可以看出,有限狀態機包含5類基本要素:即狀態、輸入、輸出、轉移函數及輸出函數。它們分別用矢量函數表示如下[1]:

根據有限狀態機是否使用輸入信號,分為Moore型有限狀態機和Mealy型有限狀態機。Moore型狀態機的輸出只與當前的狀態有關而與輸入無關,而Mealy型狀態機的輸出不僅與當前狀態有關,還與當前的輸入有關,它們共同決定Mealy狀態機的輸出。本控制系統采用Moore型有限狀態機實現數字溫度傳感器的控制。
DS18B20是單總線式數字溫度傳感器,支持“一線總線”接口,測量得到的數據為數字量,不需要經過模數轉換。每一次命令和數據傳輸都是從主機啟動寫時序開始,如果要求從機回送數據,在寫命令后,主機需啟動讀時序接收數據。
DS18B20有嚴格的信號時序,包括:
1)復位脈沖和應帶脈沖
單總線上的所有通信都是以初始化序列開始。主機輸出低電平,保持低電平時間至少480μ s,以產生復位脈沖。接著主機釋放總線,4.7kΩ上拉電阻將單總線拉高,延時 15~60μ s,并進入接收模式。接著DS18B20拉低總線60~240μ s,以產生低電平應答脈沖,若為低電平,再延時480μ s。如圖1所示。

圖1 復位與應答脈沖
2)寫時隙
寫時隙包括寫0時隙和寫1時隙。所有寫時隙至少需要60μ s,且在2次獨立的寫時隙之間至少需要1μ s的恢復時間,兩種寫時隙均起始于主機拉低總線。
3)讀時隙
DS18B20僅在主機發出讀時隙時,才向主機傳輸數據,所以,在主機發出讀數據命令后,必須馬上產生讀時隙,以便從機能夠傳輸數據。所有讀時隙至少需要60μ s,且在2次獨立的讀時隙之間至少需要1μ s的恢復時間。每個讀時隙都由主機發起,至少在時隙起始后的15μ s之內采樣總線狀態。
本設計采用Altera公司的 EP2C8T144I8N CYCLONEⅡ芯片作為系統控制器[3]。
控制模塊包括clk_div分頻模塊和Temperature狀態機控制模塊。clk_div模塊功能是將系統時鐘20MHz分頻為1MHz;temperature模塊功能是向DS18B20輸出控制命令,并將DS18B20并將測量得到的數字溫度值輸出。

在FPGA芯片中,一般信號線用做總線等雙向數據傳輸的時候就要用到INOUT類型了。inout在具體實現上一般用三態門來實現。三態門的第三個狀態就是高阻‘Z'。當inout端口不輸出時,將三態門置高阻。在 Temperature控制模塊中,sensor_DQ引腳在VerilogHDL語法中定義為inout類型,此引腳連接DS18B20的DQ引腳[4]。
本系統設計中,定義了:

對于sensor_DQ_out,可以通過組合邏輯或者時序邏輯根據sensor_DQ_in對其賦值。通過控制sensor_DQ_en的高低電平,從而設置sensor_DQ是輸出數據還是處于高阻態,如果處于高阻態,則此時當做輸入端口使用,sensor_DQ_en可以通過相關電路來控制。
為了保證測量數據的可靠傳輸,任一時刻單總線上只能有一個控制或數據信號。訪問DS18B20的操作順序遵循以下三步:
第一步:初始化;
第二步:ROM命令;
第三步:DS18B20功能命令;
單總線數字溫度傳感器DS18B20時序控制流程圖如圖5所示。

圖5 狀態機時序控制流程圖
采用VerilogHDL語言描述此Moore型有限狀態機,FPGA通過單總線對DS18B20進行操作,其one-hot編碼定義的狀態變量如表1所示[5]。

表1 one-hot編碼定義
其中,initial_pulse:復位和應答脈沖狀態,用于DS18B20的初始化,以及主從器件通信的開始;程序中首先發送480μ s的低電平,而后釋放總線90μ s,然后再釋放總線400μ s,檢測器件的應答脈沖。
skip_ROM:跳過ROM狀態。當主機檢測到應答脈沖后,發出ROM命令,本系統只連接單個DS18B20,故發出跳過 ROM(skip ROM)命令CCh。
write_byte:寫字節狀態。由于DS18B20功能命令均為一個字節長度,故用于其他寫指令狀態的調用。
write_0:寫 0時隙狀態,用于主機向DS18B20寫低電平;程序中寫時隙15μ s,拉低總線;而后FPGA 發送60μ s的低電平;再經過10μ s的恢復時間,這就完成了寫數據0。
write_1:寫 1時隙狀態,用于主機向DS18B20寫高電平;程序中寫時隙15μ s,拉低總線;而后FPGA 發送60μ s的高電平;再經過10μ s的恢復時間,這就完成了寫數據1。
convert_Temp:溫度轉換狀態;FPGA發送命令數據44h,用于主機啟動溫度轉換。
wait_750ms:等待器件溫度轉換狀態;主機發出溫度轉換命令后,進入wait_750ms狀態,等待傳感器溫度轉換,以及數據存儲。
read_scratchpad:讀暫存器(scratchpad)狀態;FPGA發送命令數據BEh。
get_Temp:讀取溫度轉換數據狀態,主機命令DS18B20讀取溫度值。
read_bit:位讀取狀態;傳感器轉換后的數據存于暫存器,主機通過單總線一位一位的讀出,存于寄存器中;程序中先2μ s讀時隙,而后延時10μ s;再經過3μ s的讀數據時間,而后延時 55μ s,這樣就完成了一位數據的讀出[6]。
嵌入式邏輯分析儀Signal TapⅡ主要用于分析數字系統的檢測和故障診斷問題,是數據域測試中一種非常有效的測試方式。它在對系統硬件模塊進行監測時,是將測得的樣本數據暫存于目標器件的RAM中,然后通過器件的JTAG端口和USB BlasterⅡ下載線一起將樣本數據信息傳出并送入計算機進行數據分析。通過實踐證明,在 FPGA上用這種方法抓取數字信號更便捷,更準確,易實現更高的精度。
其調試的基本步驟如下[8]:
1)打開Signal TapⅡ編輯窗;
2)調入待測信號;
3)相關參數設置。首先設置采樣時鐘;其次設置采樣深度;最后設置觸發條件;
4)下載、啟動并查看數據。
當測試程序下載到FPGA并運行后,用Signal TapⅡ抓取DS18B20的輸入輸出端口以及讀取溫度數據信號如圖6所示。

圖6 Signal TapⅡ調試圖
文中分析了DS18B20的工作原理,并采用有限狀態機設計其控制邏輯,相比單片機控制,更具有實時性,實現了溫度采集接口,該接口可以作為一個獨立模塊嵌入到其他電路組成的應用系統中。
有限狀態機作為數字邏輯理論的一個重要組成部分,不僅是重要的軟件基礎理論,而且在硬件設計中也發揮著重要的作用,特別是在利用EDA技術進行可編程ASIC設計時。
[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總線數字溫度傳感器DS18B20原理及應用[J].現代電子技術,2005,28(21):77~79
[3]周岳斌.基于FPGA的數字溫度傳感器接口設計[J].現代電子技術,2007,12:51~52
[4]何文龍,房建東.基于FPGA的數字溫度傳感器控制方法[J].電子測量技術,2008,11:178~181
[5]劉小平,何云斌,董懷國.基于VerilogHDL的有限狀態機設計與描述[J].計算機工程與設計,2008,29(4):958~960
[6]王凌,宋揚等.基于有限狀態機的飛行器自毀系統時序控制設計[J].現代電子技術,2009,8
[7]胡文軍,李英輝.嵌入式邏輯分析儀在FPGA設計中的應用[J].微計算機信息,2007,23:211~212,203
[8]袁火平,盧艷娥,等.基于SignaltapⅡ的高速數據采集系統[J].微計算機信息,2008,24:9