在前幾天的ARM面試中,被問到總線架構,主要是AMBA那一套東西。對於AMBA之前上課學過一點,但很膚淺。爲了面試上網查了一下、也看了部分協議補充了一下,但是接觸的少,理解的不深入,被問到之前沒遇到的東西,就被難住了。問了我slave有哪兩種HREADY信號,每個都有什麼用,HREADY復位之後是高還是低。
slave的HREADY信號共有兩種輸入HREADY和輸出HREADY。
輸出HREADY
輸出HREADY比較好理解,它表示slave當前是否準備好接受或者發送數據,如果爲高(AHB協議中建議高表示準備好)表示slave準備好了,爲低表示沒準備好。
輸入HREADY
當slave沒有準備好進行數據傳輸,如下面這個寫數據操作:
在data phase,master採樣到slave的HREADY爲低,當前的data phase需要延遲到下一個週期。
但如果有兩個slave要進行數據傳輸,slave1傳輸完之後slave2佔用總線。slave1在寫最後一個數據的時候沒有準備好,輸出的HREADY爲低,那麼master會在下一個週期(slave1的第二個data cycle)繼續把剛纔沒寫過去的數據放在總線上,供slave1採樣。但是在下一個週期(slave1的第二個data cycle)本來是要與slave2進行傳輸的,並且假設此時slave2的HREADY是爲高的,slave2會認爲此時是在與自己傳輸數據。
但是master會在再下一個週期將傳給slave2的數據放在總線上供slave2採樣,但slave2發現這次讀寫的地址和上一次是一樣的,會發生協議錯誤問題。
所以slave2需要知道slave1最後一次傳輸的HREADY爲高才會採樣數據。一般採用的方法是將所有的slave的輸出HREADY做and(與)操作,與後的輸出作爲所有slave的輸入HREADY。
這樣的話,slave2在它的data cycle就知道上一個cycle,也就是slave1的data cycle是否成功傳輸了數據。
這樣的話,也就知道了在上電覆位之後,slave的輸出HREADY爲高,防止發生死鎖。
參考:
https://blog.csdn.net/fanyongwinner/article/details/51890908