基于Verilog的SMBus總線(xiàn)控制器的設計與實(shí)現
SMBus是Intel公司于1995年發(fā)布的一種雙向兩線(xiàn)串行通訊總線(xiàn)標準,具有接口線(xiàn)少、通訊效率高等特點(diǎn)[1]。應用于多μC(microcontroller)通訊系統中,可以滿(mǎn)足絕大多數情況下對傳輸速率、信號穩定性等性能的要求,且相對于并行總線(xiàn)節省了大量的硬件資源。因此多μC通訊系統采用SMBus總線(xiàn)來(lái)實(shí)現是一種很好的解決方案。
本文提出一種基于Verilog的SMBus總線(xiàn)控制器的設計方法。該方法將總線(xiàn)控制器用有限狀態(tài)機來(lái)實(shí)現,并將其應用于基于PCI-Express技術(shù)的橋接芯片中。通過(guò)仿真測試,證明該方法是穩定有效的。
1 SMBus規范分析
1.1 SMBus總線(xiàn)結構
SMBus由兩根總線(xiàn)即串行數據線(xiàn)(SDA)和串行時(shí)鐘線(xiàn)(SCL)構成。主要應用于主從系統。主器件控制總線(xiàn)操作,包括開(kāi)始/結束傳輸、發(fā)送信息并產(chǎn)生SMBus總線(xiàn)系統時(shí)鐘等。在整個(gè)傳輸過(guò)程中,所有的傳送都通過(guò)主控的SCL來(lái)同步。為使總線(xiàn)有“線(xiàn)與”功能,所有器件的SMBus接口都必須是漏極開(kāi)路或集電極開(kāi)路的,并且通過(guò)上拉電阻使總線(xiàn)在空閑狀態(tài)下為高電平狀態(tài)。這種結構能使不同速度的器件同步運行。圖1是典型的SMBus總線(xiàn)結構圖。
1.2 SMBus通訊時(shí)序
總線(xiàn)上的所有器件都有一個(gè)唯一的地址,且都可以工作在傳送或接收方式。因此,有四種工作模式,即主發(fā)送、主接收、從發(fā)送和從接收。SMBus總線(xiàn)還具有總線(xiàn)仲裁功能,保證在同一時(shí)間只有一個(gè)主器件在控制總線(xiàn)。
圖2是讀/寫(xiě)一個(gè)字節的時(shí)序格式。圖中白色塊是主器件控制SDA線(xiàn),灰色塊是從器件控制SDA線(xiàn),SCL線(xiàn)一直都由主器件控制。由圖可見(jiàn),傳輸由一個(gè)開(kāi)始條件發(fā)起,并由一個(gè)結束條件中止。SDA上的數據在SCL高電平時(shí)必須保持穩定,不允許有電平跳變;SDA電平只有在SCL低電平時(shí)才可以改變。開(kāi)始條件和結束條件是特殊的,可以在SCL高電平時(shí)改變SDA的電平,在SCL高電平時(shí),開(kāi)始條件是把SDA從高電平拉到低電平,而結束條件則把SDA從低電平拉到高電平。開(kāi)始條件和結束條件的這種定義方法可以避免電平與傳輸的數據相混淆。
SMBus協(xié)議定義了十二種傳輸命令格式,其中以讀/寫(xiě)一個(gè)字節命令格式最為重要。本文所設計的控制器主要用這兩種命令格式,所以本文主要分析這兩種格式,其它的與之類(lèi)似,可以很容易地加以擴展,在此略過(guò)。
下面分析圖2的時(shí)序:
(1)總線(xiàn)空閑時(shí),SCL和SDA保證為高電平,等待開(kāi)始條件。
(2)主控產(chǎn)生開(kāi)始條件,表明要發(fā)起傳輸。
(3)主控傳送一個(gè)7位地址和一個(gè)寫(xiě)位,指定目標器件和寫(xiě)方式。
(4)目標器件應答。
(5)主控傳送一個(gè)8位Command Code,指定本次操作類(lèi)型。
(6)目標器件應答。
(7)如果是write byte,主控直接傳送1byte數據;如果是read byte,則要產(chǎn)生restart條件,后跟目標地址和一個(gè)讀位,然后開(kāi)始接收目標數據。
(8)由接收方應答。
(9)主控發(fā)出結束條件,結束整個(gè)傳輸。
在SMBus上傳輸的每一個(gè)數據包包括8個(gè)數據位和一個(gè)確認位,所以需要9個(gè)SCL時(shí)鐘。主控確認位時(shí)釋放總線(xiàn),由從器件來(lái)驅動(dòng)SDA。
1.3 SMBus的總線(xiàn)仲裁
一個(gè)主控開(kāi)始一個(gè)傳輸時(shí)并不知道是否還有其它主控也想進(jìn)行傳輸。當CLK為高電平時(shí)將在SDA線(xiàn)上進(jìn)行仲裁。當一個(gè)主控發(fā)送高電平而有其它的主控發(fā)送低電平時(shí),這個(gè)主控將失去總線(xiàn)控制權。
如果一個(gè)主控同時(shí)具有檢測目標器件的功能,那當它失去總線(xiàn)控制權時(shí),它仍將檢測總線(xiàn)上實(shí)際傳送的地址,以確定掌握總線(xiàn)控制的主控進(jìn)行操作的目標。
2 SMBus控制器設計
本文將SMBus控制器分為兩個(gè)模塊:與SMBus的接口模塊和與μC的接口模塊。與SMBus的接口模塊輸出SDA和SCL兩個(gè)信號;與μC的接口模塊輸出ADDR[7:0]、DATA[7:0]及若干控制信號。
為了便于μC對控制器的操作,與μC的接口模塊中定義了四個(gè)8位寄存器,分別是數據寄存器(DR)、地址寄存器(AR)、狀態(tài)寄存器(SR)和控制寄存器(CR)。DR存放傳送或接收的數據;AR存放控制器的本地地址;SR存放當前控制器的狀態(tài);CR存放控制器配置和操作命令。SR是只讀的,其它寄存器都可以被μC進(jìn)行讀寫(xiě)。
與SMBus的接口模塊又分成下列幾個(gè)分模塊:SCL看門(mén)狗、開(kāi)始/結束信號檢測、仲裁檢測、開(kāi)始/結束信號生成、SCL生成狀態(tài)機和主狀態(tài)機等模塊。
看門(mén)狗模塊用來(lái)處理SMBus協(xié)議規定的正常SCL和SDA不可以出現的兩種情況:
(1)SCL低電平超過(guò)25ms。一旦超過(guò),所有器件必須重置。在本設計中,一旦檢測到SCL下降沿就開(kāi)始計時(shí),25ms內出現上升沿則計數器清零。在計數超過(guò)時(shí)限則把控制寄存器中的RESET位置位。
(2)SCL和SDA高電平超過(guò)50ms。一旦超過(guò),所有器件都認為總線(xiàn)處于空閑狀態(tài)。這時(shí)會(huì )將狀態(tài)寄存器中的BB(Bus Busy)位清零。
SCL生成狀態(tài)機模塊用來(lái)控制SCL線(xiàn)。當SMBus處于主控模式時(shí),它就要在傳輸期間一直控制SCL線(xiàn)。SCL的頻率可以從10kHz到100kHz不等,可以通過(guò)對系統時(shí)鐘進(jìn)行分頻得到。程序中定義了一些常量,如HIGH_COUNT、LOW_COUNT、HOLD等,用來(lái)設定計數器的上界,這樣不僅使信號頻率滿(mǎn)足要求,而且也滿(mǎn)足了SMBus對信號的一些電氣要求,比如數據維持時(shí)間、開(kāi)始結束信號維持時(shí)間等。有了這些量,修改總線(xiàn)頻率也非常方便。
從對圖2時(shí)序的分析可以看出,控制器只在有限的幾個(gè)狀態(tài)之間控制轉換,所以在與SMBus接口的模塊中采用有限狀態(tài)機進(jìn)行設計是合適的[2]。圖3為SMBus控制器的狀態(tài)機圖示及狀態(tài)之間轉換的條件。本示意圖是讀/寫(xiě)一個(gè)字節的狀態(tài)機,是整個(gè)狀態(tài)機的主體框架,其它命令格式只需在這個(gè)狀態(tài)機上進(jìn)行簡(jiǎn)單的修改即可。
下面以從器件為例分析一下主狀態(tài)機。處于空閑狀態(tài)時(shí),若檢測到開(kāi)始信號,則進(jìn)入接收地址狀態(tài)。收完8位后,前7位和內部地址寄存器前7位進(jìn)行比較,若相同則確認(拉低SDA),不同則不響應,因為主控找的不是自己。地址相同確認后開(kāi)始接收命令,收完8位后確認。然后對命令解碼,根據命令進(jìn)入相應狀態(tài)。當數據傳送結束時(shí),確認或被確認轉到結束狀態(tài),一個(gè)時(shí)鐘后返回空閑狀態(tài)[3]。
其它模塊處理一些簡(jiǎn)單的事件,在此從略。
3 仿真
(1)從器件地址為1110010,主器件寫(xiě)11001101,寫(xiě)一個(gè)字節,命令為00000110。
(2)從器件地址為1110010,內部數據為10001100,主器件讀一個(gè)字節,命令為00000111。
用modelsim6.0進(jìn)行前仿真,波形圖如圖4所示。
從仿真結果上看,總線(xiàn)波形滿(mǎn)足SMBus總線(xiàn)的時(shí)序要求(符合圖2的格式)。
用Altera公司的quartus II 4.0綜合后,下載到Altera ep1k30 FPGA芯片上進(jìn)行測試,測試結果一切功能正常。
4 實(shí)際應用
本文設計的SMBus總線(xiàn)控制器應用于PCI-EXPRESS橋接芯片中,框圖如圖5所示。
在芯片初使化階段,外圍器件需要向橋接芯片的配置表內寫(xiě)入關(guān)于外圍器件的一些屬性(attribute),這樣橋接芯片才能正常工作。因為這些信息比較特殊,所以用SMBus總線(xiàn)傳輸比較合適,而這正是在該芯片中應用SMBus控制器的原因。
5 注意事項
(1)SDA和SCL都定義為雙向口,既要接收數據也要發(fā)送數據。在雙向口的使用上,要注意讀數據時(shí)要將雙向口置為高阻態(tài)。
(2)狀態(tài)機采用兩個(gè)always塊設計,一個(gè)時(shí)序always塊和一個(gè)組合always塊。這樣寫(xiě)不但易于綜合,而且清楚明了,便于實(shí)現。
本文采用有限狀態(tài)機的方法,將SMBus控制器分為與SMBus接口的模塊和與μC接口的模塊兩個(gè)模塊,從而實(shí)現SMBus總線(xiàn)控制器的設計。并將其應用于PCIPCI-EXPRESS橋接芯片中,通過(guò)軟件及在altera公司的 ep1k-30 FPGA芯片上進(jìn)行仿真測試,結果表明該方法是穩定有效的。
評論