本章詳細(xì)介紹了Wishbone標(biāo)準(zhǔn),主要參考了Wishbone標(biāo)準(zhǔn)B.3版本的核心內(nèi)容,,感興趣的讀者可去www.下載英文原文,。
片上總線技術(shù)綜述隨著超大規(guī)模集成電路的迅速發(fā)展,半導(dǎo)體工業(yè)進(jìn)入深亞微米時(shí)代,,器件特征尺寸越來越小,,芯片規(guī)模越來越大,可以在單芯片上集成上百萬到數(shù)億只晶體管,。如此密集的集成度使我們現(xiàn)在能夠在一小塊芯片上把以前由CPU和外設(shè)等數(shù)塊芯片實(shí)現(xiàn)的功能集成起來,,由單片集成電路構(gòu)成功能強(qiáng)大的、完整的系統(tǒng),,這就是我們通常所說的片上系統(tǒng),。 IP復(fù)用是片上系統(tǒng)時(shí)代的核心技術(shù)之一,。由于IP核的設(shè)計(jì)千差萬別,,它們要能夠直接連接,就要遵守相同的接口標(biāo)準(zhǔn),。在片上系統(tǒng)中,,處理器核和所有外設(shè)通過共享總線互通互聯(lián),因此這些IP核必須遵守相同的總線規(guī)范,??偩€規(guī)范定義的是IP核之間的通用接口,因此它定義了一套標(biāo)準(zhǔn)的信號(hào)和總線周期,,以連接不同的模塊,,而不是試圖去規(guī)范IP核的功能和接口如何實(shí)現(xiàn)。一個(gè)片上總線規(guī)范一般需要定義各個(gè)模塊之間初始化,、仲裁,、請求傳輸、響應(yīng)、發(fā)送接收等過程中驅(qū)動(dòng),、時(shí)序,、策略等關(guān)系。 芯片與電路板的資源和環(huán)境的不同,,導(dǎo)致片上總線與板上總線存在若干明顯差異,,包括: ①片上總線多采用單向信號(hào)線,而板上總線多采用三態(tài)信號(hào),。片上三態(tài)總線無論在功耗,、速度、可測性上都存在很大缺陷,,而且一旦出現(xiàn)多驅(qū)動(dòng)情況便會(huì)損毀芯片(比如若應(yīng)該輸出"Z"的信號(hào)實(shí)際輸出為"1",,而另有一個(gè)信號(hào)輸出為"0",就形成一個(gè)低電阻通路,,導(dǎo)致局部電流過大,,熱量難以及時(shí)釋放,從而增加芯片功耗和大大降低芯片壽命),。由于片上布線資源較為豐富,,因此片上總線多采用單向信號(hào)線。由于電路板上布線資源較為昂貴,,因此板上總線多采用三態(tài)總線,,但是由于三態(tài)總線的功耗問題和速度限制,目前板上總線也在向串行和非三態(tài)方向發(fā)展,,如USB和PCI Express,。 ②片上總線比板上總線更加簡單靈活。首先片上總線結(jié)構(gòu)要簡單,,這樣可以占用較少的邏輯單元,;其次時(shí)序要簡單,以利于提高總線的速度,;第三接口要簡單,,如此可減少與IP核連接的復(fù)雜度。片上系統(tǒng)應(yīng)用廣泛,,不同的應(yīng)用對總線的要求各異,,因此片上總線具有較大的靈活性。其一,,多數(shù)片上總線的數(shù)據(jù)和地址寬度都可變,,其二,部分片上總線的互連結(jié)構(gòu)可變,,如Wishbone總線支持點(diǎn)到點(diǎn),、數(shù)據(jù)流,、共享總線和交叉開關(guān)四種互連方式;其三,,部分片上總線的仲裁機(jī)制靈活可變,,如Wishbone總線的仲裁機(jī)制可以完全由用戶定制。而板上總線則較為死板,,時(shí)序也更加苛刻,。 目前比較常見的片上總線規(guī)范有ARM公司的AMBA、Silicore的Wishbone,、IBM公司的CoreConnect和Altera公司的Avalon,。三種總線各有特點(diǎn),其適用范圍也不同,。AMBA 總線規(guī)范因ARM處理器的廣泛使用而擁有眾多第三方支持,,被ARM公司90%以上的合作伙伴采用,已成為廣泛支持的現(xiàn)有互連標(biāo)準(zhǔn)之一,。IBM公司的CoreConnect因?yàn)镮BM的業(yè)界地位也有廣泛的應(yīng)用,。Avalon主要用于Altera公司系列PLD中,最大的優(yōu)點(diǎn)在于其配置的簡單性,,可由EDA工具快速生成,。這三種片上總線雖然都是公開標(biāo)準(zhǔn),但都不是免費(fèi)的,。而Wishbone則是一個(gè)真正開放和免費(fèi)的規(guī)范,。它最先是由Silicore公司提出的,目前由OpenCores組織維護(hù),。由于其開放性,,因此OpenCores上的免費(fèi)的IP核,大多數(shù)都采用Wishbone標(biāo)準(zhǔn),。Wishbone的優(yōu)勢除開放,、免費(fèi)、擁有眾多免費(fèi)IP核外,,還有簡單,、靈活,、輕量的特點(diǎn),,特別適合大型IP內(nèi)部的小型IP之間的互聯(lián)。在本書介紹的OpenRISC處理器設(shè)計(jì)中,,各個(gè)模塊間的互聯(lián)接口中大量的采用了Wishbone總線規(guī)范,。 需要指出,任何一個(gè)總線規(guī)范,,首先至少支持點(diǎn)對點(diǎn)互聯(lián),,所以嚴(yán)格意義上講,,國內(nèi)學(xué)術(shù)界普遍講的"總線規(guī)范"實(shí)際上指的是片上系統(tǒng)互聯(lián)規(guī)范,只不過多個(gè)IP通過共享總線互聯(lián)是人們最關(guān)心的,,也是最廣泛使用的,,所以常籠統(tǒng)的將片上系統(tǒng)互聯(lián)規(guī)范講為總線規(guī)范,。 Wishbone片上總線的基本特點(diǎn)一般總線規(guī)范的共同特點(diǎn)為同時(shí)適用于于軟核,、固核和硬核設(shè)計(jì);對開發(fā)工具和目標(biāo)硬件沒有特殊要求,,并且?guī)缀跫嫒菀延械乃芯C合工具,;可以用多種硬件描述語言來實(shí)現(xiàn);支持結(jié)構(gòu)化設(shè)計(jì)方法學(xué),,以提高大團(tuán)隊(duì)的設(shè)計(jì)效率,;靈活的數(shù)據(jù)和地址總線寬度,支持大端和小端操作,;支持主從設(shè)備接口,,支持多主設(shè)備,這是片上共享總線通信所必須的,,多個(gè)主設(shè)備同時(shí)需要進(jìn)行總線操作時(shí),,由仲裁器決定當(dāng)前哪個(gè)主設(shè)備可以使用總線,仲裁邏輯用戶可以自行定義,。此外,,在作者看來,Wishbone總線規(guī)范的特點(diǎn)還包括: 1. 支持點(diǎn)到點(diǎn),、共享總線,、十字交叉(Crossbar)和基于交換結(jié)構(gòu)(Switch fabric)的互聯(lián)。Wishbone總線規(guī)范是"輕量級(jí)(Lightweight)"規(guī)范,,它實(shí)際上更加側(cè)重于點(diǎn)對點(diǎn)互聯(lián)以及復(fù)雜度不高的共享總線片上系統(tǒng)互聯(lián),。因此,與其他總線規(guī)范相比,,Wishbone的接口更加簡單緊湊,,接口需要的互聯(lián)邏輯非常少(見本章后續(xù)的例子),這是Wishbone的一個(gè)重要優(yōu)勢,。熟悉AMBA總線的讀者在讀完本章后就能夠理Wishbone比AMBA總線簡單的多,,但是兩者各有個(gè)的優(yōu)勢。AMBA將所有的外設(shè)分為高速設(shè)備和低速設(shè)備,,高速設(shè)備連接到系統(tǒng)總線,,通常通信的數(shù)據(jù)量也較大,如SDRAM控制器,、NAND Flash控制器,、LCD控制器,,低速設(shè)備連接外設(shè)總線,通常通信數(shù)據(jù)量小,,如通用串口,、計(jì)時(shí)器等。外設(shè)總線與系統(tǒng)總線通過總線橋接器相連,。在實(shí)際系統(tǒng)中,,處理器、系統(tǒng)總線,、外設(shè)總線間的時(shí)鐘頻率的典型比值之一是4:2:1,,因此整個(gè)系統(tǒng)的功耗被有效降低。另外一個(gè)好處是通過在總線橋接器中添加DMA引擎,,系統(tǒng)總線和外設(shè)總線可以實(shí)現(xiàn)速率解耦,。而依照Wishbone規(guī)范,Wishbone總線上所有設(shè)備都要連接到同一總線,,無論是高速設(shè)備還是低速設(shè)備,。與Wishbone總線相比,AMBA的缺點(diǎn)是設(shè)計(jì)較為復(fù)雜,。但是實(shí)際上,,Wishbone總線也設(shè)計(jì)為類似AMBA總線的架構(gòu),但此時(shí)系統(tǒng)為雙Wishbone總線架構(gòu),。 2. 支持典型的數(shù)據(jù)操作,,包括:單次讀/寫操作、塊讀/寫操作,,讀改寫(RMW,,Read-Modify- Write,細(xì)節(jié)見后文)操作,。最快情況下一個(gè)時(shí)鐘周期可完成一次操作,,操作的結(jié)束方式包括:成功、錯(cuò)誤和重試(Retry),。一個(gè)總線周期完成一次操作,,一次操作可以是單次讀/寫操作、塊讀/寫操作或者讀改寫操作,。操作總是在某一總線周期內(nèi)完成的,,因此操作結(jié)束方式也稱為總線周期結(jié)束方式,兩者說法在后文將視情況使用,。成功是操作的正常結(jié)束方式,,錯(cuò)誤表示操作失敗,,造成失敗的原因可能是地址或者數(shù)據(jù)校驗(yàn)錯(cuò)誤,,寫操作或者讀操作不支持等,。重試表示從設(shè)備當(dāng)前忙,不能及時(shí)處理該操作,,該操作可以稍后重新發(fā)起,。接收到操作失敗或者重試后,主設(shè)備如何響應(yīng)取決于主設(shè)備的設(shè)計(jì)者,。 3. 允許從設(shè)備進(jìn)行部分地址解碼,,有利于減少了冗余地址譯碼邏輯,提高地址譯碼速度,。這一點(diǎn)本書將通過實(shí)例說明,。 4. 支持用戶定義的標(biāo)簽。這些標(biāo)簽可以用于為地址,、數(shù)據(jù)總線提供額外的信息如奇偶校驗(yàn),,為總線周期提供額外的信息如中斷向量、緩存控制操作的類型等,。Wishbone規(guī)范只定義標(biāo)簽的時(shí)序,,而標(biāo)簽的具體含義用戶可自行定義。支持用戶定義的標(biāo)簽是Wishbone規(guī)范區(qū)別與其他片上總線規(guī)范的重要特征之一,。 5. 全同步化設(shè)計(jì),,包括復(fù)位方式。但是實(shí)際上復(fù)位方式采用同步還是異步并不影響IP的互聯(lián)互通,,因此兼容Wishbone規(guī)范的IP完全可以采用異步方式,,http://www.上面的很多兼容Wishbone規(guī)范的開源IP采用的就是異步復(fù)位。 總結(jié)以上內(nèi)容,,Wishbone總線規(guī)范區(qū)別于其他總線規(guī)范的兩個(gè)核心特點(diǎn)是:(1)是輕量級(jí)規(guī)范,,因此接口更加簡單緊湊;(2)支持支持用戶定義的標(biāo)簽,。 接口信號(hào)定義所有的Wishbone接口信號(hào)都是高電平有效,,設(shè)計(jì)成高電平有效的主要原因是由于低電平有效信號(hào)的書寫問題,不同的設(shè)計(jì)者表達(dá)低電平有效信號(hào)的方式不同,,拿最常見的低電平有效的復(fù)位信號(hào)來說,,其表示方法就有_RST_I、N_RST_I,、#RST_I和/RST_I,,而高電平有效的信號(hào)其表達(dá)方式通常只有一種。 所有的Wishbone接口信號(hào)都以_I或者_(dá)O結(jié)束,。_I表示輸入,,_O表示輸出。()表示該信號(hào)為總線信號(hào),,總線的寬度可以為1,,也可以為大于1的任何值,。 在圖1中,主設(shè)備具有遵守Wishbone規(guī)范的主設(shè)備接口,,從設(shè)備具有遵守Wishbone規(guī)范的從設(shè)備接口,,INTERCON模塊將主設(shè)備和從設(shè)備的對應(yīng)數(shù)據(jù)、地址和控制線連接起來,,SYSCON模塊提供時(shí)鐘和復(fù)位信號(hào),,這兩個(gè)信號(hào)被送入主設(shè)備和從設(shè)備。圖1給出了Wishbone接口的常見信號(hào),,這些信號(hào)有些是必須的,,有些是可選的。這些信號(hào)的基本功能描述如下: CLK_O/CLK_I:時(shí)鐘信號(hào),。時(shí)鐘信號(hào)由SYSCON模塊產(chǎn)生,,并送入各個(gè)主設(shè)備和從設(shè)備。SYSCON通常內(nèi)部存在一個(gè)鎖相環(huán),,將來源于芯片外的晶體振蕩器或者時(shí)鐘輸入信號(hào)整形,、分頻或者倍頻為芯片內(nèi)所需要的時(shí)鐘信號(hào)。所有Wishbone信號(hào)都同步到時(shí)鐘信號(hào)上,,包括復(fù)位信號(hào),。 RST_O/RST_I:同步復(fù)位信號(hào),高電平有效,。復(fù)位信號(hào)由SYSCON模塊產(chǎn)生,,并送入各主設(shè)備及從設(shè)備。 DAT_O()/DAT_I():主設(shè)備和從設(shè)備的之間的數(shù)據(jù)信號(hào),,數(shù)據(jù)可以由主設(shè)備傳送給從設(shè)備,,也可以由從設(shè)備傳送給主設(shè)備。一對主設(shè)備和從設(shè)備之間最多存在兩條數(shù)據(jù)總線,,一條用于主設(shè)備向從設(shè)備傳輸數(shù)據(jù),,另外一條用于從設(shè)備向主設(shè)備傳輸數(shù)據(jù)。Wishbone規(guī)定數(shù)據(jù)總線的最大寬度為64位,,這一規(guī)定實(shí)際上是考慮到目前商用處理器的最大位數(shù)為64,,實(shí)際上數(shù)據(jù)總線的寬度可以是任意值。就筆者看來,,在64位處理器以后,,處理器將向多核方向發(fā)展,總線將向高速串行方向發(fā)展,。 ADR_O(n…m)/ADR_I(n…m):地址信號(hào),,主設(shè)備輸出地址到從設(shè)備。n取決于IP核的地址寬度,m取決于數(shù)據(jù)總線DAT_O()/DAT_I()的寬度和粒度,。數(shù)據(jù)總線的粒度指的是數(shù)據(jù)總線能夠一次傳送的最小比特?cái)?shù),,很多處理器如ARM的數(shù)據(jù)總線的粒度為1個(gè)字節(jié),但是也有一些處理器如CEVA TeakLite DSP的數(shù)據(jù)總線粒度為2個(gè)字節(jié),。一個(gè)位寬為32比特,、粒度為1個(gè)字節(jié)的數(shù)據(jù)總線的地址信號(hào)應(yīng)定義為ADR_O(n…2)/ADR_I(n…2),。在傳送數(shù)據(jù)時(shí),,具體哪些字節(jié)有效通過SEL_O()/SEL_I()信號(hào)(見下文)控制。 TGD_O/TGD_I(),、TGA_O()/TGA_I():TGD_O/TGD_I()為數(shù)據(jù)標(biāo)簽,,具體講是附加于在數(shù)據(jù)總線DAT_O()/DAT_I()的標(biāo)簽,該標(biāo)簽可以用于傳送關(guān)于數(shù)據(jù)總線的額外信息如奇偶校驗(yàn)信息,、時(shí)間戳信息等,。TGA_O/TGA_I()為地址標(biāo)簽,具體講是附加于在地址總線ADR_O()/ADR_I()的標(biāo)簽,,該標(biāo)簽可以用于傳送關(guān)于地址總線的額外信息如地址總線奇偶校驗(yàn)信息,、存儲(chǔ)器保護(hù)信息等。Wishbone只規(guī)定了TGD_O/TGD_I和TGA_O()/TGA_I()的接口時(shí)序,,用戶可以定義TGD_O/TGD_I的具體含義,。 TGC_O/TGC_I():TGC_O/TGC_I()為總線周期標(biāo)簽,該標(biāo)簽可以用于傳送關(guān)于當(dāng)前總線周期所進(jìn)行操作的描述如操作類型(包括單次操作,、塊操作,、RMW操作)、中斷應(yīng)答類型,、緩存操作類型等,。類似的,Wishbone只規(guī)定了TGC_O/TGC_I()的接口時(shí)序,,用戶可以定義TGD_O/TGD_I的具體含義,。 ACK_O/ACK_I、ERR_O/ERR_I,、RTY_O/RTY_I:主從設(shè)備間的操作結(jié)束方式信號(hào),。ACK表示成功,ERR表示錯(cuò)誤,,RTY表示重試(Retry),。操作總是在某一總線周期內(nèi)完成的,因此操作結(jié)束方式也稱為總線周期結(jié)束方式,。成功是操作的正常結(jié)束方式,,錯(cuò)誤表示操作失敗,造成失敗的原因可能是地址或者數(shù)據(jù)校驗(yàn)錯(cuò)誤,寫操作或者讀操作不支持等,。重試表示從設(shè)備當(dāng)前忙,,不能及時(shí)處理該操作,該操作可以稍后重新發(fā)起,。接收到操作失敗或者重試后,,主設(shè)備如何響應(yīng)取決于主設(shè)備的設(shè)計(jì)者。 SEL_O()/SEL_I():有效數(shù)據(jù)總線選擇信號(hào),,標(biāo)識(shí)當(dāng)前操作中數(shù)據(jù)總線上哪些比特是有效的,,以總線粒度為單位。SEL_O()/SEL_I()的寬度為數(shù)據(jù)總線寬度除以數(shù)據(jù)總線粒度,。比如一個(gè)具有32位寬,、粒度為1個(gè)字節(jié)的數(shù)據(jù)總線的選擇信號(hào)應(yīng)定義為SEL_O(3:0)/ SEL_I(3:0),SEL(4’b1001)代表當(dāng)前操作中數(shù)據(jù)總線的最高和最低字節(jié)有效,。 CYC_O/CYC_I,、LOCK_O/LOCK_I、GNT_O()/GNT_I:總線周期信號(hào)CYC_O/CYC_I有效代表一個(gè)主設(shè)備請求總線使用權(quán)或者正在占有總線,,但是不一定正在進(jìn)行總線操作(是否正在進(jìn)行總線操作取決于選通信號(hào)STB_O/STB_I是否有效),。只有該信號(hào)有效,Wishbone主設(shè)備和從設(shè)備接口的其它信號(hào)才有意義,。CYC_O/CYC_I信號(hào)在一次總線操作過程中必須持續(xù)有效,,比如一次塊讀操作可能需要多個(gè)時(shí)鐘周期,CYC_O/CYC_I信號(hào)必須保持持續(xù)有效,。實(shí)際上,,該信號(hào)的實(shí)際作用等同于其他總線標(biāo)準(zhǔn)中的仲裁申請信號(hào)。當(dāng)存在多個(gè)主設(shè)備時(shí),,它們可能希望同時(shí)進(jìn)行總線操作,,主設(shè)備通過仲裁申請信號(hào)向仲裁器申請總線占有權(quán),仲裁器通過一定的仲裁優(yōu)先級(jí)邏輯向其中一個(gè)選定的主設(shè)備發(fā)送總線允許信號(hào)GNT_O()/GNT_I,,表示該主設(shè)備可以占用總線,。GNT_O()是仲裁器輸出的允許信號(hào),一般有多個(gè),;而對于一個(gè)主設(shè)備,,其允許信號(hào)輸入GNT_I卻只有一個(gè)。一次總線操作可能需要多個(gè)時(shí)鐘周期,,比如一次塊操作,。在操作過程中,仲裁器可能會(huì)提前將總線占用權(quán)收回并分配給其他主設(shè)備從而打斷當(dāng)前主設(shè)備的操作,,LOCK_O/LOCK_I有效代表本次總線操作是不可打斷的,。仲裁器收到LOCK_I信號(hào),就不會(huì)提前收回總線使用權(quán)。圖1中只有一個(gè)主設(shè)備和一個(gè)從設(shè)備,,因此沒畫出仲裁器模塊,,該模塊可以視為是INTERCON的一部分,見本章最后給出的例子,。 STB_O/STB_I:選通信號(hào),。選通有效代表主設(shè)備發(fā)起一次總線操作。只有選通信號(hào)有效(此時(shí)CYC_O/CYC_I也必須為高),,ADR_O/ADR_I()、DAT_O()/DAT_I(),、SEL_O()/SEL_I()才有意義,。在Wishbone總線規(guī)范中,CYC_O/CYC_I是最高層的控制信號(hào),,只有該信號(hào)有效,STB_O/STB_I信號(hào)才有意義。一個(gè)信號(hào)有意義是指該信號(hào)的當(dāng)前值是需要主設(shè)備或者從設(shè)備解釋的,,0為無效,,1為有效,,而一個(gè)信號(hào)沒有意義是指該信號(hào)的當(dāng)前值主設(shè)備和從設(shè)備不必關(guān)心,是0還是1都無效,。 WE_O/WE_I:寫使能信號(hào),,代表當(dāng)前周期中進(jìn)行的操作是寫操作還是讀操作。1代表寫,,0代表讀,。 Wishbone支持的互聯(lián)類型Wishbone規(guī)范支持的互聯(lián)類型有四種:點(diǎn)到點(diǎn)、共享總線,、十字交叉(Crossbar)和基于交換結(jié)構(gòu) (Switch fabric)的互聯(lián),。這四種互聯(lián)方式在Wishbone規(guī)范中有明確的定義。如圖1(第4頁),,點(diǎn)到點(diǎn)互聯(lián)是最簡單的互聯(lián)方式,,它允許一個(gè)主設(shè)備和一個(gè)從設(shè)備相互通信。比如,,主設(shè)備可能是一個(gè)處理器IP核,從設(shè)備可能是一個(gè)串行I/O端口或者存儲(chǔ)器,。 點(diǎn)對點(diǎn)互聯(lián)的一個(gè)特殊應(yīng)用就是當(dāng)數(shù)據(jù)需要多個(gè)步驟順序進(jìn)行處理時(shí),,多個(gè)同時(shí)具有主設(shè)備接口和從設(shè)備接口的模塊串接在一起,如圖2所示,。這種連接方式也稱作數(shù)據(jù)流連接,。模塊A處理完數(shù)據(jù)后將處理結(jié)果送給模塊B,模塊B處理完模塊A送來的數(shù)據(jù)后再將處理結(jié)果送給模塊C處理,。數(shù)據(jù)從一個(gè)模塊送往另一個(gè)模塊,,常常將這種處理方式稱作流水線。流水線在處理器設(shè)計(jì)中非常重要,,其好處是多個(gè)數(shù)據(jù)可以并行處理,,從而提高系統(tǒng)的整體數(shù)據(jù)處理能力,。 共享總線互聯(lián)方式如圖3所示。共享總線互聯(lián)方式適合于系統(tǒng)中有兩個(gè)或者多個(gè)主設(shè)備需要與一個(gè)或者多個(gè)從設(shè)備通信的場合,,它們通過共享的總線進(jìn)行通信,,其好處是結(jié)構(gòu)緊湊,節(jié)省布線資源,,缺點(diǎn)是主設(shè)備希望與特定從設(shè)備通信時(shí)可能需要等待,。主設(shè)備在需要與一個(gè)從設(shè)備通信時(shí),需要先向仲裁器(圖中沒有給出)申請總線占有權(quán),,獲得允許后開始占用總線并與目標(biāo)從設(shè)備開始通信,,通信結(jié)束后釋放總線。當(dāng)多個(gè)主設(shè)備同時(shí)希望占有總線時(shí),,仲裁器通過一定的優(yōu)先級(jí)邏輯分配總線使用機(jī)會(huì),。 共享總線互聯(lián)方式在片上系統(tǒng)中得到了廣泛的使用,幾乎成了片上系統(tǒng)的標(biāo)志技術(shù)之一,。共享總線技術(shù)在板級(jí)系統(tǒng)如PCI總線中也得到了應(yīng)用,。 十字交叉互聯(lián)方式較共享總線互聯(lián)方式略復(fù)雜。共享總線互聯(lián)方式在任一時(shí)刻只允許最多有一對主設(shè)備和從設(shè)備通過共享總線進(jìn)行通信,,而十字交叉互聯(lián)方式最多同時(shí)允許超過一對的主設(shè)備和從設(shè)備對同時(shí)進(jìn)行通信,,如圖4所示。當(dāng)然,,在十字交叉互聯(lián)方式中,,一個(gè)從設(shè)備在任一時(shí)刻只能與一個(gè)主設(shè)備進(jìn)行通信,兩個(gè)主設(shè)備不能同時(shí)訪問同一從設(shè)備,。 類似的,,基于交換結(jié)構(gòu)的互聯(lián)比十字交叉互聯(lián)方式的INTERCON模塊更復(fù)雜,一般的,,基于交換結(jié)構(gòu)的互聯(lián)比十字交叉互聯(lián)允許同時(shí)通信的主從設(shè)備對更多,。 隨著技術(shù)的發(fā)展,已經(jīng)出現(xiàn)了比片上總線更復(fù)雜的片上網(wǎng)絡(luò)技術(shù)(Network on chip),?;谄暇W(wǎng)絡(luò)技術(shù),已經(jīng)出現(xiàn)了內(nèi)含幾十個(gè)32位處理器的芯片,,已應(yīng)用于CISCO的高端路由器中,。 Wishbone總線周期一個(gè)總線周期由多個(gè)不可分的時(shí)鐘周期構(gòu)成,完成單次讀/寫操作,、塊讀/寫操作或者讀改寫操作,。總線周期也分為單次讀/寫周期,、塊讀/寫周期和讀改寫周期,。一次塊讀/寫總線周期完成多次數(shù)據(jù)讀/寫操作,。一般情況下,一次操作由主設(shè)備和從設(shè)備控制信號(hào)間的一次握手,,以及同時(shí)進(jìn)行的地址和數(shù)據(jù)總線的一次傳輸構(gòu)成,。塊操作表示整個(gè)操作需要完成多次數(shù)據(jù)傳送。在總線周期中主設(shè)備和從設(shè)備預(yù)先設(shè)定好的共同遵守控制信號(hào)握手規(guī)則,,以及地址和數(shù)據(jù)總線的傳輸規(guī)則稱作總線協(xié)議,。 在下文所給圖例中給出的信號(hào)均為主設(shè)備的輸入輸出信號(hào)。因此,,對操作的描述也從主設(shè)備信號(hào)的角度展開,,以便于讀者對照正文理解圖例。比如"在時(shí)鐘上升沿1到達(dá)之前,,從設(shè)備檢測到主設(shè)備發(fā)起的操作,,將適當(dāng)?shù)臄?shù)據(jù)放到主設(shè)備的輸入信號(hào)DAT_I()和TGD_I(),將主設(shè)備的ACK_I置高作為對主設(shè)備STB_O的響應(yīng),。"的等價(jià)描述為:"在時(shí)鐘上升沿1到達(dá)之前,,從設(shè)備檢測到主設(shè)備發(fā)起的操作,將適當(dāng)?shù)臄?shù)據(jù)放到其輸出信號(hào)DAT_O()和TGD_O(),,將輸出信號(hào)ACK_O置高作為對主設(shè)備STB_O的響應(yīng),。" 一般操作復(fù)位操作復(fù)位是數(shù)字系統(tǒng)最基本的操作。復(fù)位后,,系統(tǒng)進(jìn)入預(yù)定的狀態(tài),。在遵守Wishbone總線規(guī)范的系統(tǒng)中,當(dāng)RST_I信號(hào)有效,,系統(tǒng)開始復(fù)位,。由于Wishbone規(guī)范規(guī)定的復(fù)位是同步復(fù)位,因此在復(fù)位信號(hào)有效后接下來的時(shí)鐘上升沿,,所有信號(hào)和寄存器進(jìn)入預(yù)定狀態(tài),。因此,Wishbone規(guī)范要求RST_I信號(hào)有效時(shí)間至少要一個(gè)時(shí)鐘周期,。在數(shù)字系統(tǒng)中,,實(shí)際上更多的采用的是異步復(fù)位,而且復(fù)位信號(hào)的長度一般大于系統(tǒng)電平穩(wěn)定時(shí)間和系統(tǒng)時(shí)鐘頻率穩(wěn)定時(shí)間,。如果在Wishbone接口中使用的是異步復(fù)位,需要在文檔中說明,,因?yàn)閃ishbone接口默認(rèn)的是同步復(fù)位。 在圖5中,我們只給出了STB_O和CYC_O這兩個(gè)信號(hào),,而沒有給出其它信號(hào)。當(dāng)這兩個(gè)信號(hào)無效時(shí),,所有其他信號(hào)沒有意義。 操作發(fā)起一個(gè)總線周期由至少一次總線操作構(gòu)成,。操作總是由主設(shè)備發(fā)起,,主設(shè)備發(fā)起的操作可以是單次讀/寫、塊讀/寫或者RMW操作,。當(dāng)主設(shè)備將CYC_O置為高時(shí),,一個(gè)總線周期開始??偩€周期開始后,,當(dāng)主設(shè)備將STB_O置為高時(shí),一次總線操作開始,。當(dāng)主設(shè)備將CYC_O置為低時(shí),,主設(shè)備的所有其他信號(hào)沒有意義。從設(shè)備只在CYC_I為高時(shí)才會(huì)對主設(shè)備發(fā)起的操作進(jìn)行響應(yīng),。 CYC_O和STB_O可以同時(shí)從無效變?yōu)橛行П硎静僮鏖_始,,CYC_O持續(xù)有效直到操作結(jié)束,CYC_O和STB_O可以同時(shí)從無效變有效表示同時(shí)發(fā)起一次總線周期的同時(shí),,也發(fā)起總線操作,,也可以同時(shí)從有效變?yōu)闊o效表示操作結(jié)束。因此,,在只有一個(gè)主設(shè)備時(shí),,可以將CYC_O和STB_O合并為一個(gè)信號(hào),比如在OpenRISC1200的源碼中就廣泛的使用了這種方式,,信號(hào)的名字稱作CYCSTB_O,。 當(dāng)存在多個(gè)主設(shè)備時(shí),一個(gè)主設(shè)備完成操作后必須及時(shí)將CYC_O信號(hào)置為低,,以讓出總線給其他主設(shè)備,。此時(shí),CYC_O信號(hào)等價(jià)于為總線占用請求信號(hào),。 基本握手協(xié)議由于在整個(gè)總線周期,,CYC_O必須始終保持有效,因此,,此后我們將在給出的圖中忽略該信號(hào),,只在必要的時(shí)候給出。 握手發(fā)生在主設(shè)備和從設(shè)備之間,。握手協(xié)議是主設(shè)備和從設(shè)備在握手時(shí)所遵守的共同規(guī)則,。如圖6,當(dāng)主設(shè)備準(zhǔn)備好,它將STB_O信號(hào)置高,。STB_O信號(hào)一直為高,,直到從設(shè)備通過置高ACK_O、ERR_O,、RTY_O對本次操作發(fā)起響應(yīng),。在圖7中我們以主設(shè)備的ACK_I信號(hào)作為示例,后文也如此,。通過握手,,主設(shè)備和從設(shè)備不僅可以完成通信,而且可以控制它們之間的通信速率,。 如果從設(shè)備保證能夠在主設(shè)備發(fā)起操作時(shí)及時(shí)作出操作成功的響應(yīng),,其ACK_O信號(hào)可以設(shè)計(jì)為STB_I和CYC_I信號(hào)的邏輯與,而ERR_O和RTY_O信號(hào)也可以不使用,。因此ERR_O和RTY_O信號(hào)是可選的,,而ACK_O信號(hào)是必須的。在點(diǎn)對點(diǎn)連接中,,甚至可以將ACK_I信號(hào)直接置高,。當(dāng)存在ERR_O和RTY_O信號(hào),主設(shè)備當(dāng)發(fā)現(xiàn)ERR_O和RTY_O信號(hào)之一有效時(shí)如何進(jìn)行響應(yīng)取決于主設(shè)備的設(shè)計(jì),。 對于從設(shè)備,,只有STB_I和CYC_I同時(shí)為高時(shí),才能發(fā)起對主設(shè)備的響應(yīng),。 實(shí)際上,,對于主設(shè)備,其最小配置為只有ACK_I,、CLK_I,、CYC_O、RST_I和STB_O,;而對于從設(shè)備,,其最小配置為只有ACK_O、CLK_I,、CYC_I,、RST_I和STB_I,這里CYC 和STB信號(hào)可以合并到一起成為一個(gè)信號(hào),,通常命名為CYCSTB_O/,。 在圖6中,從STB_O到ACK_I存在一個(gè)長組合邏輯路徑,,在實(shí)際系統(tǒng)中很可能成為關(guān)鍵路徑,。因此,,在設(shè)計(jì)中應(yīng)盡量保證STB_O是觸發(fā)器的直接輸出,。如果從STB_O到ACK_I存在一個(gè)長組合邏輯路徑延遲不能滿足設(shè)計(jì)的時(shí)序要求,,可將從設(shè)備的ACK_O經(jīng)過觸發(fā)器寄存后再輸出,從而將長組合邏輯打破,,但系統(tǒng)的吞吐量也將因此減小,。關(guān)于如何即打破長組合邏輯又不影響系統(tǒng)的吞吐量,后文將進(jìn)行詳細(xì)討論,。 單次讀/寫周期單次讀/寫操作每次操作只完成一次讀或者寫,,是最基本的總線操作方式。但是,,Wishbone主設(shè)備或者從設(shè)備也可以不支持單次讀/寫操作,,甚至沒有地址和數(shù)據(jù)總線。 單次讀操作如圖7,。在時(shí)鐘上升沿0,,主設(shè)備將地址信號(hào)ADR_O()、TGA_O()放到總線上,,將WE_O置為低表示讀操作,,將適當(dāng)?shù)腟EL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)放在數(shù)據(jù)總線的適當(dāng)位置,將CYC_O和TGC_O置高表示操作正在進(jìn)行,,將STB_O置高表示操作開始,。 在時(shí)鐘上升沿1到達(dá)之前,從設(shè)備檢測到主設(shè)備發(fā)起的操作,,將適當(dāng)?shù)臄?shù)據(jù)放到主設(shè)備的輸入信號(hào)DAT_I()和TGD_I(),,將主設(shè)備的ACK_I置高作為對主設(shè)備STB_O的響應(yīng)。 在時(shí)鐘上升沿1,,主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,,將DAT_I()和TGD_I()采樣,并將STB_O和CYC_O置為低表示操作完成,。從設(shè)備發(fā)現(xiàn)STB_O置低后,,也將主設(shè)備的輸入信號(hào)ACK_I置低。 在圖7中,,從設(shè)備可以上升沿0和上升沿1之間插入任意多個(gè)等待周期,。 單次寫操作如圖8所示。在時(shí)鐘上升沿0,,主設(shè)備將地址信號(hào)ADR_O(),、TGA_O()放到總線上,將數(shù)據(jù)信號(hào)DAT_O(),、TGD_O()放到總線上,,將WE_O置高表示寫操作,將適當(dāng)?shù)腟EL_O()信號(hào)置高通知從設(shè)備數(shù)據(jù)總線DAT_O()的哪些信號(hào)是有效的,將CYC_O和TGC_O置高表示操作正在進(jìn)行,,將STB_O置高表示操作開始,。 在時(shí)鐘上升沿1到達(dá)之前,從設(shè)備檢測到主設(shè)備發(fā)起的操作,,將主設(shè)備的ACK_I置高作為對主設(shè)備STB_O的響應(yīng),。 在時(shí)鐘上升沿1,從設(shè)備將DAT_I()和TGD_I()采樣,;主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,,將STB_O和CYC_O置為低表示操作完成;從設(shè)備發(fā)現(xiàn)STB_O置低后,,也將主設(shè)備的ACK_I置低,。 在圖8中,從設(shè)備可以在上升沿0和上升沿1之間插入任意多個(gè)等待周期,。 塊讀周期塊讀/寫操作每次讀/寫數(shù)據(jù)多次,。塊讀/寫操作實(shí)際上是由順序進(jìn)行的多個(gè)單次讀/寫操作組合而成的。在同時(shí)存在多個(gè)主設(shè)備時(shí),,塊讀/寫操作非常有用,,一個(gè)塊讀寫一般是不能打斷的,比如一次DMA,,如圖9所示,,在一次塊操作中,CRC_O信號(hào)必須保持為高,。同時(shí)為了保證整個(gè)塊操作不被打斷,,LOCK_O也可以置為高,但是LOCK_O不必須為高,。典型地,,主設(shè)備進(jìn)行一次DMA連續(xù)傳輸4個(gè)或者8個(gè)總線寬度單位的數(shù)據(jù),然后主動(dòng)釋放總線,,其后又試圖占用總線重新進(jìn)行DMA,,直到所有的數(shù)據(jù)都傳輸完畢。這樣做的好處是允許其他優(yōu)先級(jí)更高的主設(shè)備在兩次DMA之間插入操作以完成更加緊急的任務(wù),。 塊讀操作如圖10所示,。塊操作最多能夠在每個(gè)時(shí)鐘周期進(jìn)行一次數(shù)據(jù)讀或者寫,但是主設(shè)備和從設(shè)備都可以通過插入等待周期控制塊操作的速度,。一次塊操作包括多次子操作,。每一次子操作都是塊操作的一個(gè)階段,完成一次數(shù)據(jù)讀或者寫,。圖10的塊操作由五次讀操作完成,,其過程如下: 在時(shí)鐘上升沿0,,主設(shè)備將地址信號(hào)ADR_O()、TGA_O()放到總線上,,將WE_O置為低表示讀操作,,將適當(dāng)?shù)腟EL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)放在數(shù)據(jù)總線的適當(dāng)位置,將CYC_O和TGC_O()置高表示操作正在進(jìn)行,,將STB_O置高表示一次子操作開始,。CYC_O和TGC_O()從無效變?yōu)橛行Э梢园l(fā)生在上升沿0以前的任何時(shí)刻。 在時(shí)鐘上升沿1到達(dá)之前,,從設(shè)備檢測到主設(shè)備發(fā)起的操作,將適當(dāng)?shù)臄?shù)據(jù)放到主設(shè)備的DAT_I()和TGD_I(),,將主設(shè)備的ACK_I置高作為對主設(shè)備STB_O的響應(yīng),。 在時(shí)鐘上升沿1,主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,,將DAT_I()和TGD_I()采樣,,完成第一次子操作。主設(shè)備將新地址信號(hào)ADR_O(),、新TGA_O()放到總線上,,將新的SEL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)放在數(shù)據(jù)總線的適當(dāng)位置。 在時(shí)鐘上升沿2到達(dá)之前,,從設(shè)備檢測到主設(shè)備發(fā)起的第二次操作,,將適當(dāng)?shù)臄?shù)據(jù)放到主設(shè)備的DAT_I()和TGD_I(),繼續(xù)將主設(shè)備的ACK_I置高,。 在時(shí)鐘上升沿2,,主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,將DAT_I()和TGD_I()采樣,,完成第二次子操作,。主設(shè)備將STB_O信號(hào)置低表示插入等待周期。 在時(shí)鐘上升沿3到達(dá)之前,,從設(shè)備檢測到STB_O信號(hào)為低,,將ACK_I置低。 在時(shí)鐘上升沿3,,主設(shè)備發(fā)起第三次操作,,將新的地址信號(hào)ADR_O()、新的TGA_O()放到總線上,,將WE_O置為低表示讀操作,,將適當(dāng)?shù)腟EL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)放在數(shù)據(jù)總線的適當(dāng)位置,將STB_O置高表示第三次子操作開始,。 在時(shí)鐘上升沿4到達(dá)之前,,從設(shè)備檢測到主設(shè)備發(fā)起的第三次子操作,,將適當(dāng)?shù)臄?shù)據(jù)放到主設(shè)備的DAT_I()和TGD_I(),將主設(shè)備的ACK_I置高作為對主設(shè)備STB_O的響應(yīng),。 在時(shí)鐘上升沿4,,主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,將DAT_I()和TGD_I()采樣,,完成第三次子操作,。主設(shè)備同時(shí)發(fā)起第五次子操作,將新地址信號(hào)ADR_O(),、新TGA_O()放到總線上,,將新的SEL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)放在數(shù)據(jù)總線的適當(dāng)位置。 在時(shí)鐘上升沿5到達(dá)之前,,從設(shè)備檢測到主設(shè)備發(fā)起的第五次子操作,,將適當(dāng)?shù)臄?shù)據(jù)放到主設(shè)備的DAT_I()和TGD_I(),將主設(shè)備的ACK_I置高作為對主設(shè)備STB_O的響應(yīng),。 在時(shí)鐘上升沿5,,主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,將DAT_I()和TGD_I()采樣,,完成第五次子操作,。主設(shè)備同時(shí)發(fā)起第六次子操作,將新地址信號(hào)ADR_O(),、新TGA_O()放到總線上,,將新的SEL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)放在數(shù)據(jù)總線的適當(dāng)位置。 在時(shí)鐘上升沿5過后,,從設(shè)備檢測到主設(shè)備發(fā)起的第六次子操作,,但是由于數(shù)據(jù)沒有準(zhǔn)備好,它在新上升沿到達(dá)之前將ACK_I信號(hào)置低表示插入等待周期,。 在時(shí)鐘上升沿6,,主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,,將DAT_I()和TGD_I()采樣,并將STB_O和CYC_O置為低表示整個(gè)塊讀操作完成,。 從設(shè)備發(fā)現(xiàn)STB_O置低后,,也將主設(shè)備的ACK_I置低。 塊寫周期塊寫操作的例子如圖11所示,。圖11的一次塊寫操作由五個(gè)相互關(guān)聯(lián)的單次寫操作完成,。 在時(shí)鐘上升沿0,,主設(shè)備將地址信號(hào)ADR_O()、TGA_O()放到總線上,,將數(shù)據(jù)信號(hào)DAT_O(),、TGD_O()放到總線上,將WE_O置為高表示寫操作,,將適當(dāng)?shù)腟EL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)總線上哪些信號(hào)是有效的,,將CYC_O和TGC_O置高表示操作正在進(jìn)行,將STB_O置高表示第一次寫操作開始,。 在時(shí)鐘上升沿1到達(dá)之前,,從設(shè)備檢測到主設(shè)備發(fā)起的操作,將主設(shè)備的ACK_I置高作為對主設(shè)備STB_O的響應(yīng),。 在時(shí)鐘上升沿1,,從設(shè)備將DAT_I()和TGD_I()采樣;主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,,得知第一次寫操作完成,于是將新地址信號(hào)ADR_O(),、新TGA_O()放到總線上,,將新數(shù)據(jù)信號(hào)DAT_O()、新TGD_O()放到總線上,,將WE_O置為高表示寫操作,,將適當(dāng)?shù)腟EL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)總線上哪些信號(hào)是有效的,將CYC_O和TGC_O置高表示操作繼續(xù)在進(jìn)行,,將STB_O置高表示第二次寫操作開始,。 在時(shí)鐘上升沿2到達(dá)之前,從設(shè)備檢測到主設(shè)備發(fā)起的第二次寫操作,,將主設(shè)備的ACK_I置高作為對主設(shè)備STB_O的響應(yīng),。 在時(shí)鐘上升沿2,從設(shè)備將DAT_I()和TGD_I()采樣,;主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,,得知第二次寫操作完成,發(fā)現(xiàn)自己的數(shù)據(jù)還沒有準(zhǔn)備好,,于是將STB_O置低表示插入等待周期,。 在時(shí)鐘上升沿3到達(dá)之前,從設(shè)備檢測到STB_O為低,,也將ACK_I置低,。 在時(shí)鐘上升沿3,主設(shè)備發(fā)起第三次操作,,將新地址信號(hào)ADR_O(),、新TGA_O()放到總線上,,將新數(shù)據(jù)信號(hào)DAT_O()、新TGD_O()放到總線上,,將WE_O置為高表示寫操作,,將適當(dāng)?shù)腟EL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)總線上哪些信號(hào)是有效的,將CYC_O和TGC_O置高表示操作繼續(xù)進(jìn)行,,將STB_O置高表示第三次寫操作開始,。 在時(shí)鐘上升沿4到達(dá)之前,從設(shè)備檢測到主設(shè)備發(fā)起的第三次寫操作,,將主設(shè)備的ACK_I置高作為對主設(shè)備STB_O的響應(yīng),。 在時(shí)鐘上升沿4,從設(shè)備將DAT_I()和TGD_I()采樣,;主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,,得知第三次寫操作完成,于是將新地址信號(hào)ADR_O(),、新TGA_O()放到總線上,,將新數(shù)據(jù)信號(hào)DAT_O()、新TGD_O()放到總線上,,將適當(dāng)?shù)腟EL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)總線上哪些信號(hào)是有效的,,將STB_O繼續(xù)置高表示第四次寫操作開始。 在時(shí)鐘上升沿5到達(dá)之前,,從設(shè)備檢測到主設(shè)備發(fā)起的第四次寫操作,,將主設(shè)備的ACK_I置高作為對主設(shè)備STB_O的響應(yīng)。 在時(shí)鐘上升沿5,,從設(shè)備將DAT_I()和TGD_I()采樣,;主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,得知第四次寫操作完成,,于是發(fā)起第五次操作,,將新地址信號(hào)ADR_O()、新TGA_O()放到總線上,。 在時(shí)鐘上升沿5之后新的時(shí)鐘上升沿到達(dá)之前,,從設(shè)備發(fā)現(xiàn)因?yàn)槟承┰驎簳r(shí)無法繼續(xù)接收數(shù)據(jù),因此將ACK_I信號(hào)置低,,插入等待,。 當(dāng)從設(shè)備發(fā)現(xiàn)可以繼續(xù)接收數(shù)據(jù),于是在在最后一個(gè)等待周期結(jié)束且上升沿5到達(dá)之前,,將DAT_I()和TGD_I()采樣,;主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,得知第五次寫操作完成,。并將STB_O和CYC_O置低表示整個(gè)塊寫操作完成,。 RMW操作在操作系統(tǒng)中,,有一種重要的進(jìn)程間的同步機(jī)制稱作信號(hào)量機(jī)制。信號(hào)量即當(dāng)前可用資源的計(jì)數(shù),。信號(hào)量是一個(gè)用來實(shí)現(xiàn)同步的整型或記錄型(Record)變量,,除了初始化外,對它只能執(zhí)行等待和釋放這兩種原子操作,。一次對信號(hào)量的等待操作是獲得信號(hào)量的過程,,讀取當(dāng)前信號(hào)量的值,如果發(fā)現(xiàn)有可利用資源,,則將信號(hào)量減1,,否則進(jìn)入等待狀態(tài)。一次對信號(hào)量的釋放過程即將信號(hào)量加1,。一個(gè)進(jìn)程對信號(hào)的讀取,、計(jì)算新的信號(hào)量值、更新信號(hào)量的值這三個(gè)步驟是不允許被其他進(jìn)程打破的,,如果被打破,,則信號(hào)量的值將會(huì)發(fā)生錯(cuò)誤,RMW操作的最大用途在于信號(hào)量操作,。 一次RMW操作對于總線來說,,本質(zhì)上是兩次子操作,一次讀,,一次寫,只不過這兩次子操作必須由同一個(gè)主設(shè)備的完成,,且讀數(shù)據(jù)和寫數(shù)據(jù)的地址相同,。"改"是不發(fā)生在總線上的,它發(fā)生在主設(shè)備內(nèi)部,。一個(gè)RMW操作的例子如圖13所示,,其過程如下: 在時(shí)鐘上升沿0,主設(shè)備將地址信號(hào)ADR_O(),、TGA_O()放到總線上,,將WE_O置為低表示讀操作,將適當(dāng)?shù)腟EL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)放在數(shù)據(jù)總線的適當(dāng)位置,,將CYC_O和TGC_O()置高表示操作正在進(jìn)行,,將STB_O置高表示第一次子操作開始。CYC_O和TGC_O()可以發(fā)生在上升沿0以前的任何時(shí)刻,。 在時(shí)鐘上升沿1到達(dá)之前,,從設(shè)備檢測到主設(shè)備發(fā)起的操作,將適當(dāng)?shù)臄?shù)據(jù)放到主設(shè)備的DAT_I()和TGD_I(),,將主設(shè)備的ACK_I置高作為對主設(shè)備STB_O的響應(yīng),。 在時(shí)鐘上升沿1,,主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,將DAT_I()和TGD_I()采樣,,完成第一次子操作,。主設(shè)備將STB_O置低表示插入等待。 在時(shí)鐘上升沿1之后新的上升沿到達(dá)之前,,從設(shè)備檢測到主設(shè)備將STB_O置低,,于是將ACK_I置低。 經(jīng)過若干等待周期,,在上升沿2,,主設(shè)備將地址信號(hào)ADR_O()、TGA_O()放到總線上,,將數(shù)據(jù)信號(hào)DAT_O(),、TGD_O()放到總線上,將WE_O置為高表示寫操作,,將適當(dāng)?shù)腟EL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)總線上哪些信號(hào)是有效的,,將STB_O置高表示第二次子操作開始。 在時(shí)鐘上升沿3到達(dá)之前,,從設(shè)備檢測到主設(shè)備發(fā)起的操作,,將主設(shè)備的ACK_I置高作為對主設(shè)備STB_O的響應(yīng)。 在時(shí)鐘上升沿3,,從設(shè)備將DAT_I()和TGD_I()采樣,;主設(shè)備發(fā)現(xiàn)ACK_I信號(hào)為高,得知第二次子操作完成,,于是將STB_O和CYC_O置低表示整個(gè)RMW操作完成,。 在時(shí)鐘上升沿之后,從設(shè)備發(fā)現(xiàn)STB_O為低,,于是將ACK_I置低,。 數(shù)據(jù)組織數(shù)據(jù)組織是指數(shù)據(jù)的傳送順序。目前常見的32為處理器的數(shù)據(jù)總線粒度為1字節(jié),,在傳送時(shí),,一個(gè)32位數(shù)據(jù)的最高字節(jié)可以放在數(shù)據(jù)總線的最低8位傳送,也可以放在數(shù)據(jù)總線的最高8位傳送,,因此出現(xiàn)了大端和小端兩種數(shù)據(jù)組織方法,。大端是指一個(gè)數(shù)據(jù)的最高位放在數(shù)據(jù)總線的最低位傳送或者放在地址較小的存儲(chǔ)器位置存儲(chǔ);小端是指一個(gè)數(shù)據(jù)的最高位放在數(shù)據(jù)總線的最高位傳送或者放在地址較高的存儲(chǔ)器位置存儲(chǔ),。Wishbone同時(shí)支持大端和小端兩者數(shù)據(jù)組織方式,。當(dāng)數(shù)據(jù)總線的粒度和寬度相同時(shí),大端和小端是一樣的。 這兩者數(shù)據(jù)組織方式在一般文獻(xiàn)中都可以找到,??偩€標(biāo)準(zhǔn)只定義接口的通信協(xié)議,而數(shù)據(jù)的組織本質(zhì)上取決于主設(shè)備和從設(shè)備的設(shè)計(jì),。有時(shí)需要將大端和小端的接口互聯(lián)起來,,下圖給出了將數(shù)據(jù)組織為大端的IP A和數(shù)據(jù)組織為大端的IP B相連的情形。IP A和IP B的數(shù)據(jù)總線寬度都是32為,,粒度為8位,。 Wishbone寄存反饋總線周期周期的同步與異步結(jié)束方式之對比為了實(shí)現(xiàn)在給定時(shí)鐘頻率下的最大可能吞吐量,Wishbone采用了周期異步結(jié)束方式,。這樣做的結(jié)果是從主設(shè)備的STB_O到從設(shè)備的ACK_O/ERR_O/RTY_O再到主設(shè)備的ACK_I/ERR_I/RTY_I輸入形成了一個(gè)異步回路,,如圖15。在大型SoC設(shè)計(jì)中,,該回路往往成為整個(gè)設(shè)計(jì)的關(guān)鍵路徑,,限制系統(tǒng)時(shí)鐘頻率的進(jìn)一步提高。在深亞微米時(shí)代,,由于線延遲往往比門延遲更大,,這一異步回路更加可能成為系統(tǒng)性能的瓶頸。 這一問題的最簡單解決方法是插入寄存器將回路斷開,,但這樣做的缺點(diǎn)是在每一次總線操作中都需要插入一個(gè)等待周期,,從而制約了總線吞吐量。如圖16所示,,在上升沿1主設(shè)備發(fā)起了一次操作,,在上升沿2從設(shè)備發(fā)起響應(yīng)將ACK_O置高,在上升沿3主設(shè)備檢測到ACK_I為高完成第一次操作并發(fā)起第二次操作,,但是在上升沿3從設(shè)備并不知道主設(shè)備會(huì)發(fā)起第二次操作,,因此只能將ACK_O信號(hào)置低。在上升沿4從設(shè)備才能對第二次操作發(fā)起響應(yīng)將ACK_O置高,,在上升沿4主設(shè)備檢測到ACK_I為高完成第二次操作。 在圖16中,,每一次傳輸都需要兩個(gè)時(shí)鐘周期,,一半的帶寬被浪費(fèi)。如果從設(shè)備在上升沿3知道主設(shè)備將發(fā)起新的操作,,它將能夠在上升沿3就對主設(shè)備的操作發(fā)起響應(yīng),,從而節(jié)省時(shí)鐘周期提高了系統(tǒng)的吞吐量,利用該思想改進(jìn)后的同步時(shí)序如圖17所示,。 在圖17的上升沿1,,主設(shè)備發(fā)起操作,在上升沿2,從設(shè)備將ACK_O置高,,在上升沿3,,從設(shè)備知道主設(shè)備將發(fā)起新的操作,于是將ACK_O繼續(xù)置高,。因此,, 3個(gè)時(shí)鐘周期就完成了2次操作,而不是原來大的4個(gè)時(shí)鐘周期,,于是吞吐量提高了25%,。一般的,改進(jìn)后,,N次操作需要N+1個(gè)時(shí)鐘周期,,而不是2N個(gè)時(shí)鐘周期,吞吐量改善為(N-1)/N%,。 改進(jìn)后的同步周期結(jié)束方式具備異步周期結(jié)束方式的吞吐量優(yōu)勢,,同時(shí)具備傳統(tǒng)同步結(jié)束方式的延遲優(yōu)勢。改進(jìn)后的同步周期結(jié)束方式稱作Wishbone寄存反饋周期結(jié)束方式,。 Wishbone寄存反饋周期結(jié)束方式在Wishbone寄存反饋周期結(jié)束方式中,,主設(shè)備需要事先通知從設(shè)備操作下一時(shí)鐘周期是否將發(fā)起新的總線操作,這是通過周期類型識(shí)別地址標(biāo)簽CTI_O()/CTI_I()和突發(fā)類型擴(kuò)展地址標(biāo)簽BTE_O()/BTE_I()完成的,。主設(shè)備和從設(shè)備必須同時(shí)支持CTI_O()/CTI_I(),,Wishbone接口才能以寄存反饋周期結(jié)束方式工作,主設(shè)備和從設(shè)備如果支持地址增加突發(fā)模式,,它們必須同時(shí)支持BTE_O()/BTE_I(),。如果主設(shè)備或者從設(shè)備之一不支持這種周期結(jié)束方式,它們只能以傳統(tǒng)周期結(jié)束方式工作,。 周期類型識(shí)別地址標(biāo)簽CTI_O()/CTI_I()提供描述當(dāng)前操作突發(fā)模式的信息,,從設(shè)備可以根據(jù)該信息確定在下一時(shí)鐘周期如何進(jìn)行響應(yīng)。CTI_O()/CTI_I()的具體定義如表2,。
不支持CTI_O()的主設(shè)備必須將該信號(hào)置為3’b000或者3’b111,,這兩個(gè)是等價(jià)的。主設(shè)備和從設(shè)備可以支持這些突發(fā)模式中的一部分,,對于不支持的突發(fā)模式,,主設(shè)備必須將CTI_O()置為3’b000,從設(shè)備必須將CTI_I()理解為3’b000,。 為了減少在同步模式下的等待時(shí)間,,從設(shè)備必須對主設(shè)備的操作盡快的做出響應(yīng)。從設(shè)備可利用CTI_I()信號(hào)確定在下一周期對主設(shè)備的響應(yīng),,但是由于此時(shí)還不知道STB_I信號(hào)的狀態(tài),,因此從設(shè)備在確定在下一周期對主設(shè)備的響應(yīng)時(shí)只能忽略STB_I信號(hào),,因此即使在STB_I信號(hào)為低的情況下,從設(shè)備仍然可能將ACK_O/ERR_O/RTY_O置高,。因此,,主設(shè)備應(yīng)保證CTI_O()信息的有效性。 突發(fā)類型擴(kuò)展地址標(biāo)簽BTE_O()/BTE_I()是對CTI_O()/CTI_I()=3’b010情況下的突發(fā)類型信息的擴(kuò)展,,描述的是地址值是如何變化的,。其含義如表3所示。
突發(fā)結(jié)束突發(fā)結(jié)束(CTI_O=3’b111)表示當(dāng)前操作是當(dāng)前突發(fā)的最后一次操作,,主設(shè)備在當(dāng)前操作結(jié)束后緊接著的時(shí)鐘周期不再發(fā)起操作,。 圖18給出了CTI_O=3’b111的用法。圖中共有3次操作,。第一次操作和第二次操作是一個(gè)突發(fā)操作的一部分,。第一次操作發(fā)生在上升沿0,這是一次寄存反饋?zhàn)x操作,,第二次操作是該突發(fā)操作的最后一個(gè)操作,,主設(shè)備將CTI_O置為3’b111表示整個(gè)突發(fā)操作結(jié)束。第三次操作為單次寫操作,。 圖18的操作過程如下: 在時(shí)鐘上升沿0到達(dá)之前,,一個(gè)突發(fā)寄存反饋?zhàn)x操作正在進(jìn)行。從設(shè)備將數(shù)據(jù)放到數(shù)據(jù)總線DAT_I(),。 在時(shí)鐘上升沿0,,主設(shè)備將DAT_I()采樣,并更新地址總線ADR_O(),,同時(shí)將CTI_O()置為3’b111表示本次突發(fā)讀操作即將結(jié)束,。從設(shè)備根據(jù)時(shí)鐘上升沿0采樣到的CTI_O()的值(不等于3’b111)知道操作還在進(jìn)行,因此仍然將ACK_I置高,,并在數(shù)據(jù)總線DAT_I()放上新的數(shù)據(jù),。 在時(shí)鐘上升沿1,,主設(shè)備將DAT_I()采樣完成整個(gè)突發(fā)讀操作,同時(shí)主設(shè)備將新地址信號(hào)放到地址總線ADR_O()上,,將新數(shù)據(jù)信號(hào)放到數(shù)據(jù)總線DAT_O()上,,將WE_O置為高表示寫操作,,CTI_O()置為3’b111表示本次寫操作只進(jìn)行一次,。由于從設(shè)備根據(jù)CTI_O()為3’b111知道整個(gè)突發(fā)讀操作結(jié)束,,而不了解主設(shè)備將發(fā)起寫操作,因此將ACK_I置低,。 在時(shí)鐘上升沿2,從設(shè)備檢測到主設(shè)備的寫操作,,并將數(shù)據(jù)DAT_O()采樣,,同時(shí)將ACK_I置高。 在時(shí)鐘上升沿3,主設(shè)備將CYC_O和STB_O置低表示操作結(jié)束,,從設(shè)備將ACK_I置低,。 地址不變突發(fā)地址不變突發(fā)是一個(gè)總線周期,在這個(gè)總線周期中完成多次操作,,但是地址不變,。地址不變突發(fā)的典型應(yīng)用是以DMA方式讀/寫FIFO。主設(shè)備在時(shí)鐘的某一個(gè)上升沿將CTI()置為3’b001后,,下一個(gè)周期的操作必須與本周期,,包括SEL_O()信號(hào)也不能改變,即在地址不變突發(fā)中的每一次操作除傳輸?shù)臄?shù)據(jù)可能發(fā)生變化外其他都是相同的,。 圖19給出了一個(gè)地址不變突發(fā)寫總線周期示例,。圖中主設(shè)備和從設(shè)備一共進(jìn)行了4次操作。 在時(shí)鐘上升沿0,,主設(shè)備將地址信號(hào)ADR_O()放到總線上,,將數(shù)據(jù)信號(hào)DAT_O()、TGD_O()放到總線上,,將WE_O置為高表示寫操作,,將CTI_O()置為3’b001表示地址不變突發(fā)總線周期,將適當(dāng)?shù)腟EL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)總線上哪些信號(hào)是有效的,,將CYC_O和TGC_O置高表示操作正在進(jìn)行,,將STB_O置高表示第一次寫操作開始。 在時(shí)鐘上升沿1,,從設(shè)備檢測到主設(shè)備的寫操作,,將DAT_I()采樣,并置高ACK_O,。 在時(shí)鐘上升沿2,,主設(shè)備檢測到ACK_I為高,知道第一次傳輸順利完成,,由于數(shù)據(jù)沒有準(zhǔn)備好,,于是將STB_O置低表示插入等待周期。 在等待周期,,從設(shè)備知道地址不變突發(fā)寫操作仍然在進(jìn)行,,因此一直將ACK_O置高。但是此時(shí)主設(shè)備和從設(shè)備知道沒有真正的傳輸發(fā)生,。 在時(shí)鐘上升沿3,,主設(shè)備已經(jīng)將新的數(shù)據(jù)準(zhǔn)備好,于是將STB_O置高表示第二次寫操作開始,,并更新DAT_O(),。 在時(shí)鐘上升沿4,,從設(shè)備檢測到主設(shè)備的寫操作,將DAT_I()采樣,。同時(shí)從設(shè)備發(fā)現(xiàn)沒有足夠的空間存儲(chǔ)數(shù)據(jù)或者由于其他原因不能及時(shí)接收新的數(shù)據(jù),,于是將ACK_O置低插入等待周期。主設(shè)備檢測到ACK_I為高,,于是發(fā)起第三次操作,,更新DAT_O()。 在時(shí)鐘上升沿5,,從設(shè)備發(fā)現(xiàn)可以繼續(xù)接收數(shù)據(jù),,于是將DAT_I()采樣并將ACK_O置高。 在時(shí)鐘上升沿6,,主設(shè)備檢測到ACK_I為高,,于是發(fā)起第四次操作,更新DAT_O(),,同時(shí)將CTI_O置為3’b111表示本次操作為最后一次操作,。 在時(shí)鐘上升沿7,從設(shè)備將DAT_I()采樣,,并根據(jù)CTI_O為3’b111知道本次地址不變突發(fā)寫操作完成,,于是將ACK_O置低。 地址增加突發(fā)地址不變突發(fā)是一個(gè)總線周期,,在這個(gè)總線周期中完成多次操作,,但是地址遞增的。地址的單位增加值取決于數(shù)據(jù)總線的寬度和粒度,。對于粒度為8比特的數(shù)據(jù)總線,,當(dāng)數(shù)據(jù)總線寬度為8,地址每次增加1,;當(dāng)數(shù)據(jù)總線寬度為16,,地址每次增加2;當(dāng)數(shù)據(jù)總線寬度為32,,地址每次增加4,。地址增加的方式又分為線性增加和折疊增加。在線性增加中,,新的地址總是比舊的地址大一個(gè)單位增加值,。在折疊增加中,新的地址的獲得方式為:在舊的地址加一個(gè)單位增加值,,其后再將地址與折疊尺寸異或,。常見的折疊尺寸為4和8,因此Wishbone標(biāo)準(zhǔn)中明確定義了支持疊4和疊8操作,,示例如表4所示,。折疊操作常見于處理器緩存的讀寫,。典型的SDRAM都支持折疊操作。
主設(shè)備將CTI()置為3’b010表示地址增加突發(fā)操作,,若主設(shè)備在時(shí)鐘的某一個(gè)上升沿將CTI()置為3’b010,必須同時(shí)將BTE_O()置為合適的值,,以通知從設(shè)備地址的增加方式,,且下一個(gè)周期的傳輸必須與本周期相同,SEL_O()信號(hào)也不能改變,。 圖20給出了一個(gè)數(shù)據(jù)總線為32位粒度為8的疊4地址增加突發(fā)讀操作示例,。主設(shè)備和從設(shè)備之間一共進(jìn)行了4次傳輸。 在時(shí)鐘上升沿0,,主設(shè)備將地址信號(hào)ADR_O()放到總線上,,將WE_O置為低表示讀操作,將CTI()置為3’b010表示地址增加突發(fā)操作,,將BTE_O()置為2’b01表示疊4操作,,將適當(dāng)?shù)腟EL_O()信號(hào)置高通知從設(shè)備將數(shù)據(jù)放在數(shù)據(jù)總線的適當(dāng)位置,將CYC_O置高表示操作正在進(jìn)行,,將STB_O置高表示第一次傳輸開始,。從設(shè)備根據(jù)ADI_O()準(zhǔn)備所需數(shù)據(jù)。 在時(shí)鐘上升沿1,,從設(shè)備檢測到主設(shè)備的讀操作,,將數(shù)據(jù)放到DAT_O(),同時(shí)置高ACK_O,。從設(shè)備此時(shí)根據(jù)CTI()和BTE_O()知道下次主設(shè)備操作的地址,,并前根據(jù)該地址準(zhǔn)備第二次操作數(shù)據(jù)。 在時(shí)鐘上升沿2,,主設(shè)備檢測到ACK_I為高,,將DAT_I()采樣完成第一次操作,并發(fā)起第二次操作,。從設(shè)備獲得第二次操作的數(shù)據(jù)并將其放到DAT_O()并開始準(zhǔn)備第三次操作的數(shù)據(jù),。 在時(shí)鐘上升沿3,主設(shè)備檢測到ACK_I為高,,將DAT_I()采樣完成第二次操作,,并發(fā)起第三次操作。從設(shè)備獲得第三次操作的數(shù)據(jù)并將其放到DAT_O()并開始準(zhǔn)備第四次操作的數(shù)據(jù),。 在時(shí)鐘上升沿4,,主設(shè)備檢測到ACK_I為高,將DAT_I()采樣完成第三次操作,,并發(fā)起第四次操作,,并將CTI()置為3’b111表示本次地址增加突發(fā)操作即將結(jié)束,。從設(shè)備獲得第四次操作的數(shù)據(jù)并將其放到DAT_O()并開始準(zhǔn)備第五次操作的數(shù)據(jù)。 在時(shí)鐘上升沿5,,主設(shè)備檢測到ACK_I為高,,將DAT_I()采樣完成第四次操作。從設(shè)備檢測到CTI()為3’b111,,剛剛獲取的為第五次操作準(zhǔn)備的數(shù)據(jù)被拋棄,。 Wishbone規(guī)范對IP文檔的要求為了簡化設(shè)計(jì)復(fù)用,Wishbone規(guī)范要求遵守Wishbone規(guī)范的IP必須同時(shí)給出Wishbone規(guī)范要求的文檔,。文檔的作用是幫助用戶理解該IP的操作以及如何將該IP核與其他IP互聯(lián),。 遵守Wishbone規(guī)范的IP的文檔中必須寫明:
Wishbone從設(shè)備接口示例一個(gè)8比特從設(shè)備前文曾經(jīng)指出,Wishbone總線規(guī)范是"輕量級(jí)(Lightweight)"規(guī)范,,它實(shí)現(xiàn)起來非常簡單緊湊,,接口需要的互聯(lián)邏輯非常少。這里給出一個(gè)Wishbone從設(shè)備的一個(gè)例子,如圖21所示,。該從設(shè)備由一個(gè)與門和8個(gè)D觸發(fā)器構(gòu)成,。在寫周期,當(dāng)STB_I和WE_I同時(shí)有效,,數(shù)據(jù)DAT_I[7:0]在時(shí)鐘CLK_I的上升沿被寫到觸發(fā)器中,。 該從設(shè)備的RTL代碼如下: module slave8bit(input CLK_I, //這里使用了Verilog 2001語法 input RST_I, input [7:0] DAT_I, input STB_I,input WE_I, output reg[7:0] DAT_O,output ACK_O); always @(posedge CLK_I or posedge RST_I ) begin if(RST_I) begin DAT_O<=8'h00; end else if(STB_I&WE_I)begin DAT_O<=DAT_I; end end assign ACK_O=STB_I; endmodule 該從設(shè)備的Wishbone文檔如表5。
一個(gè)32比特RTL級(jí)隨機(jī)數(shù)生成器從設(shè)備下面我們舉一個(gè)實(shí)用一點(diǎn)的例子,,一個(gè)隨機(jī)數(shù)生成器,。隨機(jī)數(shù)生成理論和隨機(jī)數(shù)生成器模塊的RTL代碼見附錄2。該模塊端口定義如下: module rng(clk,reset,loadseed_i,seed_i,number_o); number_o為隨機(jī)數(shù)輸出,,當(dāng)loadseed_I有效時(shí),種子seed_I被送入number_o成為隨機(jī)數(shù)的第一個(gè)值,。 我們的目的是將其包裝成WISHBONE兼容的從模塊,其Verilog RTL代碼如下: //Rng_wbc.v module Rng_wbc(input CLK_I, input RST_I, input [31:0] DAT_I, input STB_I,input WE_I, input [3:0] SEL_I, output [31:0] DAT_O,output ACK_O); assign ACK_O=STB_I; wire loadseed=WE_I&STB_I&(|SEL_I); wire [31:0] seed; assign seed[7:0] =SEL_I[0]?DAT_I[7:0] :8'h00; assign seed[15:8] =SEL_I[1]?DAT_I[15:8] :8'h00; assign seed[23:16]=SEL_I[2]?DAT_I[23:16]:8'h00; assign seed[31:24]=SEL_I[3]?DAT_I[31:24]:8'h00; wire [31:0] rand_number; assign DAT_O[7:0] =SEL_I[0]?rand_number[7:0] :8'h00; assign DAT_O[15:8] =SEL_I[1]?rand_number[15:8] :8'h00; assign DAT_O[23:16]=SEL_I[2]?rand_number[23:16]:8'h00; assign DAT_O[31:24]=SEL_I[3]?rand_number[31:24]:8'h00; //隨機(jī)數(shù)生成器的莉化 rng unit_rng(.clk(CLK_I),.reset(RST_I),.loadseed_i(loadseed),.seed_i(seed),.number_o(rand_number)); endmodule 該從設(shè)備的Wishbone文檔如表6,。
Wishbone對RAM/ROM的支持WISHBONE與RAM和ROM的互聯(lián)遵守Wishbone規(guī)范的IP可以與任何類型的RAM和ROM互聯(lián),,只是對于不同的RAM和ROM,,接口的復(fù)雜度不同,工作效率也不同,。Wishbone規(guī)范在設(shè)計(jì)時(shí)更多的考慮了對典型RAM和ROM的高效支持,,而這些RAM/ROM在FPGA和ASIC片內(nèi)是普遍使用的。 Wishbone主設(shè)備接口與RAM的連接示例如圖22,。典型的同步RAM具有一個(gè)時(shí)鐘輸入,,一個(gè)寫使能信號(hào)WE,地址信號(hào)以及數(shù)據(jù)輸入DIN,、數(shù)據(jù)輸出信號(hào)DOUT,,有時(shí)還包括片選信號(hào)CE。 圖22的左圖表示RAM寫操作,。在時(shí)鐘上升沿0,,主設(shè)備將ADR_O()、DAT_O()置為合適的值,,將WE_O置高表示寫操作,;在時(shí)鐘上升沿1,DAT_O()被寫到ADR_O()對應(yīng)的RAM位置,。圖22的右圖表示RAM讀操作,。在時(shí)鐘上升沿0,主設(shè)備將ADR_O()置為合適的值,,將WE_O置低表示讀操作,;在時(shí)鐘上升沿1,DAT_O()被主設(shè)備采樣,。
Wishbone主設(shè)備接口與ROM的連接和時(shí)序更加簡單,,只需要地址輸入ADR()和數(shù)據(jù)輸出DOUT(),,時(shí)鐘信號(hào)都不需要,如圖23所示,。 WISHBONE兼容的RAM和Flash仿真模型在Or1200的驗(yàn)證中我們將使用到WISHBONE兼容的RAM和Flash模型,,因此,我們在這里給出所使用的RAM和Flash的源碼,。 RAM的大小為2M字節(jié),,是實(shí)際FPGA或者ASIC RAM如idt71256sa15 SRAM的等效行為模型,其源碼如下: module sram_top ( wb_clk_i, wb_rst_i, wb_dat_i, wb_dat_o, wb_adr_i, wb_sel_i, wb_we_i, wb_cyc_i, wb_stb_i, wb_ack_o, wb_err_o, ); …… parameter aw = 19; …… reg [7:0] mem [2097151:0];//RAM為2MB,因此地址寬度aw = 19 //地址不能大于2M,。 assign wb_err_o = wb_cyc_i & wb_stb_i & (|wb_adr_i[23:21]); assign adr = {8'h00, wb_adr_i[23:2], 2'b00}; //SRAM讀邏輯 assign wb_dat_o[7:0] = mem[adr+3]; assign wb_dat_o[15:8] = mem[adr+2]; assign wb_dat_o[23:16] = mem[adr+1]; assign wb_dat_o[31:24] = mem[adr+0]; //寫邏輯 always @(posedge wb_rst_i or posedge wb_clk_i) if (wb_cyc_i & wb_stb_i & wb_we_i) begin if (wb_sel_i[0]) mem[adr+3] <= #1 wb_dat_i[7:0]; if (wb_sel_i[1]) mem[adr+2] <= #1 wb_dat_i[15:8]; if (wb_sel_i[2]) mem[adr+1] <= #1 wb_dat_i[23:16]; if (wb_sel_i[3]) mem[adr+0] <= #1 wb_dat_i[31:24]; end assign wb_ack_o = wb_cyc_i & wb_stb_i & ~wb_err_o; endmodule 所使用的Flash實(shí)際上是一個(gè)只讀的Flash,,模型仿真了典型的Nor Flash如INTEL 28f016s3 FLASH的讀時(shí)序,而忽略了寫時(shí)序,。主設(shè)備每讀32比特的數(shù)據(jù)需要4個(gè)時(shí)鐘周期,。其源代碼列出如下: module flash_top ( wb_clk_i, wb_rst_i, wb_dat_i, wb_dat_o, wb_adr_i, wb_sel_i, wb_we_i, wb_cyc_i, wb_stb_i, wb_ack_o, wb_err_o ); //內(nèi)部數(shù)據(jù)線和寄存器 reg [7:0] mem [2097151:0]; //2M字節(jié) wire [31:0] adr; reg wb_err_o; reg [31:0] prev_adr; reg [1:0] delay; wire wb_err; // assign adr = {8'h00, wb_adr_i[23:2], 2'b00}; //FLASH的初始化 initial $readmemh("../src/flash.in", mem, 0); //讀模型,數(shù)據(jù)被一次賦值 assign wb_dat_o[7:0] = wb_adr_i[23:0] < 65535 ? mem[adr+3] : 8'h00; assign wb_dat_o[15:8] = wb_adr_i[23:0] < 65535 ? mem[adr+2] : 8'h00; assign wb_dat_o[23:16] = wb_adr_i[23:0] < 65535 ? mem[adr+1] : 8'h00; assign wb_dat_o[31:24] = wb_adr_i[23:0] < 65535 ? mem[adr+0] : 8'h00; // delay邏輯,,該邏輯的目的是每次發(fā)生讀操作,,都在4個(gè)周期后產(chǎn)生應(yīng)答信號(hào)wb_ack_o always @(posedge wb_clk_i or posedge wb_rst_i) if (wb_rst_i) begin delay <= #1 2'd3; prev_adr <= #1 32'h0000_0000; end else if (delay && (wb_adr_i == prev_adr) && wb_cyc_i && wb_stb_i) delay <= #1 delay - 2'd1; else if (wb_ack_o || wb_err_o || (wb_adr_i != prev_adr) || ~wb_stb_i) begin delay <= #1 2'd0; // delay ... can range from 3 to 0 prev_adr <= #1 wb_adr_i; end assign wb_ack_o = wb_cyc_i & wb_stb_i & ~wb_err & (delay == 2'd0) & (wb_adr_i == prev_adr); //總線操作錯(cuò)誤信號(hào),錯(cuò)誤產(chǎn)生的原因是輸入地址值過大 assign wb_err = wb_cyc_i & wb_stb_i & (delay == 2'd0) & (|wb_adr_i[23:21]); always @(posedge wb_clk_i or posedge wb_rst_i) if (wb_rst_i) wb_err_o <= #1 1'b0; else wb_err_o <= #1 wb_err & !wb_err_o; endmodule Wishbone點(diǎn)到點(diǎn)連接示例Wishbone點(diǎn)到點(diǎn)連接在ASIC和FPGA設(shè)計(jì)中非常常見,。如圖24,,這是一個(gè)典型的點(diǎn)到點(diǎn)連接示意圖。在圖中,,數(shù)據(jù)的粒度是32比特,,每次操作中數(shù)據(jù)總是同時(shí)全部有效,因此可以省略SEL_O()信號(hào),。點(diǎn)到點(diǎn)連接中CYC_O信號(hào)也是沒有用的,,因?yàn)樵撔盘?hào)用于多主設(shè)備的仲裁請求。 Wishbone共享總線連接示例Wishbone共享總線連接與點(diǎn)到點(diǎn)連接同樣重要,。在本例中,,兩個(gè)主設(shè)備和兩個(gè)從設(shè)備通過SYSCON實(shí)現(xiàn)了共享總線連接,在后續(xù)章節(jié)中,,我們將使用該例子對Or1200進(jìn)行基本RTL驗(yàn)證,。系統(tǒng)復(fù)位后,一個(gè)或者多個(gè)主設(shè)備通過置高CYC_O請求使用總線,,仲裁器(后文將討論)選擇其中一個(gè)主設(shè)備#X(X在0和N之間),,只將該主設(shè)備對應(yīng)的GNTX信號(hào)置高,而將其它GNT信號(hào)置低以通知INTERCON哪一個(gè)主設(shè)備可以使用總線,。 一旦主設(shè)備選定,,其輸出信號(hào)將通過選擇器送到共享總線進(jìn)而送到各個(gè)從設(shè)備。例如,如果主設(shè)備#0被中可以使用總線,,則器ADR(),、DAT_O()、SEL_O(),、WE_O和STB_O信號(hào)將被送到各個(gè)從設(shè)備,。與此同時(shí)請求使用總線的其他設(shè)備,將永遠(yuǎn)接收不到總線周期結(jié)束信號(hào)ACK_I/ERR_I/RTY_I,。 從設(shè)備是如何被選擇的呢 '若系統(tǒng)中有M個(gè)從設(shè)備,,則地址線被地址譯碼器分為M個(gè)部分,別代表每一個(gè)從設(shè)備的地址空間,。從設(shè)備#Y對應(yīng)的譯碼輸出信號(hào)與共享總線上的STB_I信號(hào)相與,,如果STB_I信號(hào)和從設(shè)備#Y對應(yīng)的譯碼輸出信號(hào)同時(shí)為高,從設(shè)備#Y才發(fā)起對主設(shè)備操作的響應(yīng),。 各個(gè)從設(shè)備輸出的總線周期結(jié)束ACK_O/ERR_O/RTY_O被通過或門送到各個(gè)主設(shè)備的ACK_I/ERR_I/RTY_I,。而從設(shè)備的DAT_O()輸出則通過選擇器送到各個(gè)主設(shè)備的輸入端,這個(gè)選擇器的輸入為共享地址總線,。 intercon模塊的源碼如下: module intercon2M2S(clk_i, rst_i, wb0s_data_i, wb0s_data_o, wb0_addr_i, wb0_sel_i, wb0_we_i, wb0_cyc_i, wb0_stb_i, wb0_ack_o, wb0_err_o, wb0_rty_o, wb0m_data_i, wb0m_data_o, wb0_addr_o, wb0_sel_o, wb0_we_o, wb0_cyc_o, wb0_stb_o, wb0_ack_i, wb0_err_i, wb0_rty_i, wb1s_data_i, wb1s_data_o, wb1_addr_i, wb1_sel_i, wb1_we_i, wb1_cyc_i, wb1_stb_i, wb1_ack_o, wb1_err_o, wb1_rty_o, wb1m_data_i, wb1m_data_o, wb1_addr_o, wb1_sel_o, wb1_we_o, wb1_cyc_o, wb1_stb_o, wb1_ack_i, wb1_err_i, wb1_rty_i ); ……//這里忽略了端口定義 //仲裁器,兩個(gè)主設(shè)備,,兩個(gè)從設(shè)備 wire GNT0,GNT1,CYC; arbiter2M2S arbiter2M2S(.CLK(clk_i),.RST(rst_i),.CYC0(wb0_cyc_i),.CYC1(wb1_cyc_i), .GNT0(GNT0),.GNT1(GNT1),.CYC(CYC)); //地址譯碼器 wire ACMP0,ACMP1; wire [31:0] shared_address; address_decoder2S address_decoder2S(.addr_i(shared_address),.ACMP0(ACMP0),.ACMP1(ACMP1)); //共享總線周期有效信號(hào)CYC,,從各主設(shè)備到各從設(shè)備 assign wb0_cyc_o=CYC; assign wb1_cyc_o=CYC; //共享地址信號(hào) assign shared_address=GNT1?wb1_addr_i:wb0_addr_i; assign wb0_addr_o=shared_address; assign wb1_addr_o=shared_address; //從各主設(shè)備到各從設(shè)備的共享數(shù)據(jù)總線 wire [31:0] shared_data_m2s=GNT1?wb1m_data_i:wb0m_data_i; assign wb0s_data_o=shared_data_m2s; assign wb1s_data_o=shared_data_m2s; //從各從設(shè)備到各主設(shè)備的共享數(shù)據(jù)總線 wire [31:0] shared_data_s2m=ACMP1?wb1s_data_i:wb0s_data_i; assign wb0m_data_o=shared_data_s2m; assign wb1m_data_o=shared_data_s2m; //從各主設(shè)備到各從設(shè)備的共享選擇信號(hào) wire [3:0] shared_sel=GNT1?wb1_sel_i:wb0_sel_i; assign wb0_sel_o=shared_sel; assign wb1_sel_o=shared_sel; //從各主設(shè)備到各從設(shè)備的共享寫使能信號(hào) wire shared_we=GNT1?wb1_we_i:wb0_we_i; assign wb0_we_o=shared_we; assign wb1_we_o=shared_we; //從各主設(shè)備到各從設(shè)備的共享選通信號(hào) wire shared_stb=GNT1?wb1_stb_i:wb0_stb_i; assign wb0_stb_o=ACMP0?shared_stb:1'b0; assign wb1_stb_o=ACMP1?shared_stb:1'b1; //從各從設(shè)備到各主設(shè)備的應(yīng)答信號(hào) wire shared_ack=ACMP0?wb0_ack_i:wb1_ack_i; assign wb0_ack_o=shared_ack; assign wb1_ack_o=shared_ack; wire shared_err=ACMP0?wb0_err_i:wb1_err_i; assign wb0_err_o=shared_err; assign wb1_err_o=shared_err; wire shared_rty=ACMP0?wb0_rty_i:wb1_rty_i; assign wb0_rty_o=shared_rty; assign wb1_rty_o=shared_rty; 地址譯碼在很多總線標(biāo)準(zhǔn)中,從設(shè)備必須譯碼所有的地址,,這稱為全地址譯碼,。比如在PCI總線中,每一個(gè)從設(shè)備都必須具有32位的地址輸入,,并對這32位的地址進(jìn)行譯碼以確定如何響應(yīng)主設(shè)備的請求,。 片上總線規(guī)范比如Wishbone規(guī)范支持部分地址譯碼。在部分地址譯碼總線規(guī)范中,,從設(shè)備只需要譯碼自己所使用的地址空間,。比如如果一個(gè)從設(shè)備只有4個(gè)地址,它就只需譯碼2比特地址而不是32位地址,。這樣做的好處是:地址譯碼速度快,,地址譯碼邏輯少,從設(shè)備可自由定義地址總線寬度,。 Wishbone部分地址譯碼的實(shí)現(xiàn)如圖26所示,。對于圖中所示IP核,我們假設(shè)其只有4個(gè)地址,,對應(yīng)4組寄存器,。地址譯碼器首先譯碼出其地址并給出選擇信號(hào),該選擇信號(hào)與共享總線的STB_O相與輸入到IP核的STB_I。而地址總線的最低2位被直接連接到IP核,,IP核再根據(jù)這兩位譯碼出當(dāng)前操作選中的是具體哪個(gè)寄存器,。 Wishbone共享總線示例中的仲裁器可以設(shè)計(jì)如下: //the ACMP0 is for slave0: Flash //the ACMP1 is for slave1: SRAM module address_decoder2S(addr_i,ACMP0,ACMP1); input [31:0]addr_i; output ACMP0,ACMP1; parameter ADDR_LOW_S0=32'b0; parameter ADDR_HIGH_S0=32'h1FFFFF;//2M space for Slave 0; //the rest of the space for Slave 1,so we do not need a dummuy slave; assign ACMP0=addr_i<=ADDR_HIGH_S0; assign ACMP1=~ACMP0; endmodule 仲裁器的設(shè)計(jì)在存在多個(gè)主設(shè)備的共享總線片上系統(tǒng)中,仲裁器是必不可少的,。它決定哪個(gè)主設(shè)備可以使用總線,。所有的主設(shè)備通過置高CYC_O信號(hào)向仲裁器請求使用總線,仲裁器則根據(jù)用戶自定義的優(yōu)先級(jí)算法確定哪個(gè)主設(shè)備可以使用總線,。仲裁器的輸出信號(hào)GNT0~GNTN(或者同時(shí)輸出更加簡潔的GNT()信號(hào)作為選擇器的輸入,,如圖24中的例子)對應(yīng)N個(gè)不同的主設(shè)備。GNT[N-1…0]用于選擇器的選擇輸入端,,以選擇各主設(shè)備和從設(shè)備對應(yīng)的輸入信號(hào),。需要指出,二輸入與門是最簡單的選擇器,,它或者選擇一個(gè)信號(hào),,或者一個(gè)信號(hào)也不選。 優(yōu)先級(jí)算法最常用的是循環(huán)優(yōu)先級(jí)(Round robin)和固定優(yōu)先級(jí)相結(jié)合,。所謂循環(huán)優(yōu)先級(jí)是指各個(gè)主設(shè)備的優(yōu)先級(jí)安排按照FIFO的方式組織,,排到隊(duì)頭的主設(shè)備先使用總線,使用完總線后該主設(shè)備被插入到FIFO的隊(duì)尾,。 常見的片上系統(tǒng)的主設(shè)備包括一個(gè)處理器,,一個(gè)液晶顯示屏控制器,若干DMA引擎,。一般地,,液晶顯示屏控制器的優(yōu)先級(jí)固定是最高的,DMA引擎的優(yōu)先級(jí)次之,,而處理器的優(yōu)先級(jí)最低,。與此同時(shí),處理器是缺省的主設(shè)備,,也就是說,,當(dāng)沒有其他主設(shè)備申請使用總線時(shí),總線的使用權(quán)歸處理器,。DMA引擎存在多個(gè),,它們之間采用循環(huán)優(yōu)先級(jí),表示它們在系統(tǒng)中具有同等的地位,。高優(yōu)先級(jí)的主設(shè)備使用一次總線只完成一次單次操作或者塊操作,,然后釋放總線,并試圖再次獲得總線,。這樣做的目的是讓出總線給其他主設(shè)備插入更加重要的操作,。一次塊操作的子操作次數(shù)的典型值為4或者8,,只在特殊情況下才使用16或者更大。 因而,,圖25中的Wishbone共享總線示例中的仲裁器可以設(shè)計(jì)如下: //CYC0 is the default master, but it has lower priority. module arbiter2M2S(input CLK,input RST, input CYC0,input CYC1, output reg GNT0,output reg GNT1,output CYC); always @(posedge CLK or posedge RST) begin if(RST) {GNT0,GNT1}<=2'b10; if(CYC1 & !CYC0) {GNT0,GNT1}<=2'b01; else if(!CYC1) {GNT0,GNT1}<=2'b10; end assign CYC=GNT1?CYC1:CYC0; endmodule 本章小節(jié)本章詳細(xì)講述了Wishbone總線標(biāo)準(zhǔn),。該標(biāo)準(zhǔn)為"輕量級(jí)"片上總線標(biāo)準(zhǔn),既適合做復(fù)雜的片上總線,,又適合做IP內(nèi)部的模塊互聯(lián),。與ARM公司的AMBA總線規(guī)范的AHB總線相比,一個(gè)明顯的區(qū)別是寫操作時(shí)Wishbone總線同時(shí)給出地址和數(shù)據(jù),,而AHB則是在連續(xù)的兩個(gè)周期內(nèi)前一個(gè)周期給出地址,,下一個(gè)周期給出數(shù)據(jù),因此寫操作需要至少兩個(gè)周期完成,。對于讀操作,,兩者的區(qū)別是Wishbone總線可以在一個(gè)周期內(nèi)完成讀操作,而AHB則最快允許在地址周期的下一周期給出應(yīng)答和數(shù)據(jù),。但實(shí)際上,,AHB支持流水線操作,而Wishbone總線在支持寄存反饋總線周期以前則不能,,從這個(gè)角度,,對于隨機(jī)的總線讀寫,兩個(gè)總線的效率是一樣的,。AHB總線是完全的同步時(shí)序,,更加復(fù)雜,在突發(fā)操作時(shí)效率與Wishbone寄存反饋總線周期一樣,。AHB總線更加嚴(yán)謹(jǐn)且功能豐富,Wishbone則更加靈活,,更加簡單,,滿足了開源處理器所定義的應(yīng)用的需求。 目前,,主流的IP都采用AMBA總線標(biāo)準(zhǔn),,但是實(shí)際上,ARM公司從未聲明該標(biāo)準(zhǔn)是免費(fèi)的,,而Wishbone總線標(biāo)準(zhǔn)則是真正的免費(fèi)標(biāo)準(zhǔn),。 |
|