官术网_书友最值得收藏!

3.5 WISHBONE總線周期

一個總線周期由多個不可分的時鐘周期構成,完成單次讀/寫操作或塊讀/寫操作。總線周期也分為單次讀/寫周期和塊讀/寫周期。一次塊讀/寫總線周期完成多次數據讀/寫操作。一般情況下,一次操作由主設備和從設備控制信號間的一次握手,以及同時進行的地址和數據總線的一次傳輸,塊操作表示整個操作需要完成多次數據傳送。在總線周期中主設備和從設備預先設定好的共同遵守控制信號握手規則、地址和數據總線的傳輸規則稱作協議。

3.5.1 通用操作

通用操作包括復位操作、操作發起和基本握手。

1.復位操作

復位是數字系統最基本的操作。復位后,系統進入預定的狀態。當RST_I信號有效,系統開始復位。由于WISHBONE規范規定的復位是同步復位,因此在復位信號有效后接下來的時鐘上升沿,所有信號和寄存器進入預定狀態。因此,WISHBONE規范要求RST_I信號有效時間至少要一個時鐘周期。在數字系統中,實際上更多采用的是異步復位,而且復位信號的長度一般大于系統電平穩定時間和系統時鐘頻率穩定時間。如果在WISHBONE接口中使用的是異步復位,需要在文檔中說明,因為WISHBONE接口默認的是同步復位。

在圖3-5中,只給出了STB_O和CYC_O這兩個信號,而沒有給出其他信號。這兩個信號無效時,所有其他信號沒有意義。

圖3-5 復位操作

2.操作發起

操作總是由主設備發起,主設備發起的操作可以是單次讀寫、塊讀寫或RMW操作。當主設備將CYC_O置為高時,一次傳輸操作開始。當主設備將CYC_O置為低時,主設備的所有其他信號沒有意義。從設備只在CYC_I為高時才會對主設備發起的操作進行響應。CYC_O和STB_O可以同時從無效變為有效表示操作開始,CYC_O持續有效直到操作結束,CYC_O和STB_O可以同時從有效變為無效表示操作結束。

因此,在只有一個主設備時,可以將CYC_O和STB_O合并為一個信號,比如在OpenRISC1200的源代碼中就廣泛地使用了這種方式,信號的名字稱作CYCSTB_O。

當存在多個主設備時,一個主設備完成操作后必須及時地將CYC_O信號置為低,以讓出總線給其他主設備。

3.基本握手

由于在整個操作周期,CYC_O必須始終保持有效,因此,后文將在給出的圖示中忽略該信號,只在必要的時候給出。

握手發生在主設備和從設備之間。握手協議是主設備和從設備在握手時所遵守的共同規則。如圖3-6所示,當主設備準備好傳輸數據,它將STB_O信號置高。STB_O信號一直為高,直到從設備通過置高ACK_O、ERR_O、RTY_O對本次操作發起響應。在圖3-6中以主設備的ACK_I信號作為示例,后文也如此。通過握手主設備和從設備不僅可以完成通信,而且可以控制它們之間的通信速率。

圖3-6 基本握手協議

如果從設備保證能夠在主設備發起操作時及時作出操作成功的響應,其ACK_O信號可以設計為STB_I和CYC_I信號的邏輯與,而ERR_O和RTY_O信號也可以不使用。因此ERR_O和RTY_O信號是可選的,而ACK_O信號是必須的。在點對點連接中,甚至可以將ACK_I信號直接置高。當存在ERR_O和RTY_O信號,主設備當發現ERR_O和RTY_O信號之一有效時如何進行響應取決于主設備的設計。

對于從設備,只有STB_I和CYC_I同時為高時,才能發起對主設備的響應。

實際上,對于主設備,其最小配置為只有ACK_I、CLK_I、CYC_O、RST_I和STB_O;而對于從設備,其最小配置為只有ACK_O、CLK_I、CYC_I、RST_I和STB_I,這里CYC和STB信號可以合并到一起成為一個信號。

在圖3-6中,從STB_O到ACK_I存在一個長組合邏輯路徑,在實際系統中很可能成為關鍵路徑。因此,在設計中應盡量保證STB_O是觸發器的直接輸出。如果從STB_O到ACK_I存在一個長組合邏輯路徑延遲不能滿足設計的時序要求,可將從設備的ACK_O經過觸發器寄存后再輸出,從而將長組合邏輯打破,但系統的吞吐量也將因此減小。關于如何既打破長組合邏輯又不影響系統的吞吐量,后文將進行詳細討論。

3.5.2 單次讀/寫周期

單次讀/寫操作每次操作只完成一次讀或寫,是最基本的總線操作方式。但是,WISHBONE主設備或從設備也可以不支持單次讀寫操作,甚至沒有地址和數據總線。

單次讀操作如圖3-7所示。在時鐘上升沿0,主設備將地址信號ADR_O()、TGA_O()放到總線上,將WE_O置為低表示讀操作,將適當的SEL_O()信號置高通知從設備將數據放在數據總線的適當位置,將CYC_O和TGC_O置高表示操作正在進行,將STB_O置高表示操作開始。

圖3-7 單次讀操作

在時鐘上升沿1到達之前,從設備檢測到主設備發起的操作,將適當的數據放到主設備的DAT_I()和TGD_I(),將主設備的ACK_I置高作為對主設備STB_O的響應。

在時鐘上升沿1,主設備發現ACK_I信號為高,將DAT_I()和TGD_I()采樣,并將STB_O和CYC_O置為低表示操作完成。從設備發現STB_O置低后,也將主設備的ACK_I置低。

在圖3-7中,從設備可以在上升沿0和上升沿1之間插入任意多個等待周期。

單次寫操作如圖3-8所示。在時鐘上升沿0,主設備將地址信號ADR_O()、TGA_O()放到總線上,將數據信號DAT_O()、TGD_O()放到總線上,將WE_O置為高表示寫操作,將適當的SEL_O()信號置高通知從設備將數據總線上哪些信號是有效的,將CYC_O和TGC_O置高表示操作正在進行,將STB_O置高表示操作開始。

圖3-8 單次寫操作

在時鐘上升沿1到達之前,從設備檢測到主設備發起的操作,將主設備的ACK_I置高作為對主設備STB_O的響應。

在時鐘上升沿1,從設備將DAT_I()和TGD_I()采樣;主設備發現ACK_I信號為高,將STB_O和CYC_O置為低表示操作完成;從設備發現STB_O置低后,也將主設備的ACK_I置低。

在圖3-8中,從設備也可以在上升沿0和上升沿1之間插入任意多個等待周期。

3.5.3 塊讀周期

塊讀/寫操作每次讀或寫多個數據。塊讀/寫操作實際上是由順序的多個單次讀/寫操作有機地組合而成的。但同時存在多個主設備時,塊讀/寫操作非常有用,一個塊讀寫一般是不能打斷的,比如一次DMA。主設備進行一次DMA連續傳輸4個或8個總線寬度的數據,然后主動釋放總線,其后又試圖占用總線重新進行DMA,直到所有的數據都傳輸完畢。這樣做的好處是允許其他優先級更高的主設備在兩次DMA之間插入操作以完成更加緊急的任務。

塊讀操作如圖3-9所示。塊操作能夠在每個時鐘周期進行一次,而圖3-9中所示的是在一次塊操作中,主設備和從設備都可以通過插入等待周期控制塊操作的速度。一次塊操作包括多次子操作。每一次子操作都是塊操作的一個階段,完成一次數據讀或寫。圖3-9中的塊操作由5次讀操作完成,其過程如下:

圖3-9 塊讀操作

在時鐘上升沿0,主設備將地址信號ADR_O()、TGA_O()放到總線上,將WE_O置為低表示讀操作,將適當的SEL_O()信號置高通知從設備將數據放在數據總線的適當位置,將CYC_O和TGC_O()置高表示操作正在進行,將STB_O置高表示一次子操作開始。CYC_O和TGC_O()可以發生在上升沿0以前的任何時刻。

在時鐘上升沿1到達之前,從設備檢測到主設備發起的操作,將適當的數據放到主設備的DAT_I()和TGD_I(),將主設備的ACK_I置高作為對主設備STB_O的響應。

在時鐘上升沿1,主設備發現ACK_I信號為高,將DAT_I()和TGD_I()采樣,完成第一次子操作。主設備將新地址信號ADR_O()、新TGA_O()放到總線上,將新的SEL_O()信號置高通知從設備將數據放在數據總線的適當位置。

在時鐘上升沿2到達之前,從設備檢測到主設備發起的第二次操作,將適當的數據放到主設備的DAT_I()和TGD_I(),繼續將主設備的ACK_I置高。

在時鐘上升沿2,主設備發現ACK_I信號為高,將DAT_I()和TGD_I()采樣,完成第二次子操作。主設備將STB_O信號置低表示插入等待周期。

在時鐘上升沿3到達之前,從設備檢測到STB_O信號為低,將ACK_I置低。

在時鐘上升沿3,主設備發起第三次操作,將新的地址信號ADR_O()、新TGA_O()放到總線上,將WE_O置為低表示讀操作,將適當的SEL_O()信號置高通知從設備將數據放在數據總線的適當位置,將STB_O置高表示第三次子操作開始。

在時鐘上升沿4到達之前,從設備檢測到主設備發起的第三次子操作,將適當的數據放到主設備的DAT_I()和TGD_I(),將主設備的ACK_I置高作為對主設備STB_O的響應。

在時鐘上升沿4,主設備發現ACK_I信號為高,將DAT_I()和TGD_I()采樣,完成第三次子操作。主設備同時發起第5次子操作,將新地址信號ADR_O()、新TGA_O()放到總線上,將新的SEL_O()信號置高通知從設備將數據放在數據總線的適當位置。

在時鐘上升沿5到達之前,從設備檢測到主設備發起的第5次子操作,將適當的數據放到主設備的DAT_I()和TGD_I(),將主設備的ACK_I置高作為對主設備STB_O的響應。

在時鐘上升沿5,主設備發現ACK_I信號為高,將DAT_I()和TGD_I()采樣,完成第5次子操作。主設備同時發起第6次子操作,將新地址信號ADR_O()、新TGA_O()放到總線上,將新的SEL_O()信號置高通知從設備將數據放在數據總線的適當位置。

在時鐘上升沿5過后,從設備檢測到主設備發起的第6次子操作,但是由于數據沒有準備好,它在新上升沿到達之前將ACK_I信號置低表示插入等待周期。

上升沿5和6之間被插入了多個等待周期。當從設備準備好數據,在時鐘上升沿6到達之前,將適當的數據放到主設備的DAT_I()和TGD_I(),將主設備的ACK_I置高作為對主設備STB_O的響應。

在時鐘上升沿6,主設備發現ACK_I信號為高,將DAT_I()和TGD_I()采樣,并將STB_O和CYC_O置為低表示整個塊讀操作完成。從設備發現STB_O置低后,也將主設備的ACK_I置低。

3.5.4 塊寫周期

塊寫操作的例子如圖3-10所示。圖3-10中的一次塊寫操作由5個次寫操作完成,具體過程如下:在時鐘上升沿0,主設備將地址信號ADR_O()、TGA_O()放到總線上,將數據信號DAT_O()、TGD_O()放到總線上,將WE_O置為高表示寫操作,將適當的SEL_O()信號置高通知從設備將數據總線上哪些信號是有效的,將CYC_O和TGC_O置高表示操作正在進行,將STB_O置高表示第一次寫操作開始。

圖3-10 塊寫操作

在時鐘上升沿1到達之前,從設備檢測到主設備發起的操作,將主設備的ACK_I置高作為對主設備STB_O的響應。

在時鐘上升沿1,從設備將DAT_I()和TGD_I()采樣;主設備發現ACK_I信號為高,得知第一次寫操作完成,于是將新地址信號ADR_O()、新TGA_O()放到總線上,將新數據信號DAT_O()、新TGD_O()放到總線上,將WE_O置為高表示寫操作,將適當的SEL_O()信號置高通知從設備將數據總線上哪些信號是有效的,將CYC_O和TGC_O置高表示操作繼續在進行,將STB_O置高表示第二次寫操作開始。

在時鐘上升沿2到達之前,從設備檢測到主設備發起的第二次寫操作,將主設備的ACK_I置高作為對主設備STB_O的響應。

在時鐘上升沿2,從設備將DAT_I()和TGD_I()采樣;主設備發現ACK_I信號為高,得知第二次寫操作完成,發現自己的數據還沒有準備好,于是將STB_O置低表示插入等待周期。

在時鐘上升沿3到達之前,從設備檢測到STB_O為低,也將ACK_I置低。

在時鐘上升沿3,主設備發起第三次操作,將新地址信號ADR_O()、新TGA_O()放到總線上,將新數據信號DAT_O()、新TGD_O()放到總線上,將WE_O置為高表示寫操作,將適當的SEL_O()信號置高通知從設備將數據總線上哪些信號是有效的,將CYC_O和TGC_O置高表示操作繼續進行,將STB_O置高表示第三次寫操作開始。

在時鐘上升沿4到達之前,從設備檢測到主設備發起的第三次寫操作,將主設備的ACK_I置高作為對主設備STB_O的響應。

在時鐘上升沿4,從設備將DAT_I()和TGD_I()采樣;主設備發現ACK_I信號為高,得知第三次寫操作完成,于是將新地址信號ADR_O()、新TGA_O()放到總線上,將新數據信號DAT_O()、新TGD_O()放到總線上,將適當的SEL_O()信號置高通知從設備將數據總線上哪些信號是有效的,將STB_O繼續置高表示第4次寫操作開始。

在時鐘上升沿5到達之前,從設備檢測到主設備發起的第4次寫操作,將主設備的ACK_I置高作為對主設備STB_O的響應。

在時鐘上升沿5,從設備將DAT_I()和TGD_I()采樣;主設備發現ACK_I信號為高,得知第4次寫操作完成,于是發起第5次操作,將新地址信號ADR_O()、新TGA_O()放到總線上。

在時鐘上升沿5之后新的時鐘上升沿到達之前,從設備發現因為某些原因暫時無法繼續接收數據,因此將ACK_I信號置低,插入等待。

當從設備發現可以繼續接收數據,于是在在最后一個等待周期結束且上升沿5到達之前,將DAT_I()和TGD_I()采樣;主設備發現ACK_I信號為高,得知第5次寫操作完成。并將STB_O和CYC_O置低表示整個塊寫操作完成。

3.5.5 RMW操作

在操作系統中,進程間有一種重要的同步機制稱作信號量機制。信號量即當前可用資源的計數。信號量是一個用來實現同步的整型或記錄型變量,除了初始化外,對它只能執行等待和釋放這兩種原子操作。一個進行對信號量的等待操作是獲得信號量的過程,讀取當前信號量的值,如果發現有可利用資源,則將信號量減1,否則進入等待狀態。一個進行對信號量的釋放過程即將信號量加1。一個進程對信號的讀取、計算新的信號量值、更新信號量的值這三個步驟是不允許被其他進程打破的,如果被打破,則信號量的值將會發生錯誤,RMW操作的最大用途在于信號量操作。

一次RMW操作對于總線來說,本質上是兩次子操作,一次讀,一次寫,只不過這兩次子操作必須由同一個主設備的完成,且讀數據和寫數據的地址相同。“改”是不發生在總線上的,它發生在主設備內部。一個RMW操作的例子如圖3-11所示,其過程如下:

圖3-11 RMW操作

在時鐘上升沿0,主設備將地址信號ADR_O()、TGA_O()放到總線上,將WE_O置為低表示讀操作,將適當的SEL_O()信號置高通知從設備將數據放在數據總線的適當位置,將CYC_O和TGC_O()置高表示操作正在進行,將STB_O置高表示第一次子操作開始。CYC_O和TGC_O()可以發生在上升沿0以前的任何時刻。

在時鐘上升沿1到達之前,從設備檢測到主設備發起的操作,將適當的數據放到主設備的DAT_I()和TGD_I(),將主設備的ACK_I置高作為對主設備STB_O的響應。

在時鐘上升沿1,主設備發現ACK_I信號為高,將DAT_I()和TGD_I()采樣,完成第一次子操作。主設備將STB_O置低表示插入等待周期。

在時鐘上升沿1之后新的上升沿到達之前,從設備檢測到主設備將STB_O置低,于是將ACK_I置低。

經過若干等待周期,在上升沿2,主設備將地址信號ADR_O()、TGA_O()放到總線上,將數據信號DAT_O()、TGD_O()放到總線上,將WE_O置為高表示寫操作,將適當的SEL_O()信號置高通知從設備將數據總線上哪些信號是有效的,將STB_O置高表示第二次子操作開始。

在時鐘上升沿3到達之前,從設備檢測到主設備發起的操作,將主設備的ACK_I置高作為對主設備STB_O的響應。

在時鐘上升沿3,從設備將DAT_I()和TGD_I()采樣;主設備發現ACK_I信號為高,得知第二次子操作完成,于是將STB_O和CYC_O置低表示整個RMW操作完成。

在時鐘上升沿之后,從設備發現STB_O為低,于是將ACK_I置低。

3.5.6 數據組織

數據組織是指數據的傳送順序。目前常見的32位處理器的數據總線粒度為1字節,在傳送時,一個32位數據的最高字節可以放在數據總線的最低8位傳送,也可以放在數據總線的最高8位傳送,因此出現了大端和小端兩種數據組織方法。大端是指一個數據的最高位放在數據總線的最低位傳送或放在地址較小的存儲器位置存儲;小端是指一個數據的最高位放在數據總線的最高位傳送或放在地址較高的存儲器位置存儲。WISHBONE同時支持大端和小端兩種數據組織方式。當數據總線的粒度和寬度相同時,大端和小端是一樣的。

這兩種數據組織方式在一般文獻中都可以找到。總線標準只定義接口的通信協議,而數據的組織本質上取決于主設備和從設備的設計。因此,這里不再詳細講述大端和小端這兩種數據組織方式,請讀者參考其他文獻。

有時需要將大端和小端的接口互聯起來,實現起來并不復雜。如圖3-12所示,這里將數據組織為小端的IP A和數據組織為小端的IP B相連的情形。IP A和IP B的數據總線寬度都是32位,粒度為8位。

圖3-12 數據組織大端小端接口互聯

主站蜘蛛池模板: 苍梧县| 乃东县| 巴中市| 阳东县| 迭部县| 乐山市| 平阳县| 简阳市| 库伦旗| 额尔古纳市| 古田县| 晋中市| 姚安县| 武穴市| 长治市| 宜宾市| 根河市| 泰和县| 柳州市| 磐石市| 息烽县| 葫芦岛市| 周至县| 萍乡市| 兴仁县| 喀什市| 始兴县| 邳州市| 临桂县| 钟山县| 汨罗市| 宁乡县| 花垣县| 策勒县| 精河县| 碌曲县| 朔州市| 靖安县| 泰兴市| 吉安县| 普兰店市|