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