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