移位暫存器
在數字電路中,移位寄存器(英語:shift register)是一種在若干相同時間脈衝下[1]工作的以觸發器級聯為基礎[2]的器件,每個觸發器的輸出接在觸發器鏈的下一級觸發器的「數據」輸入端,使得電路在每個時間脈衝內依次向左或右移動一個比特,[1]在輸出端進行輸出。這種移位寄存器是一維的,事實上還有多維的移位寄存器,即輸入、輸出的數據本身就是一些列位。實現這種多維移位寄存器的方法可以是將幾個具有相同位數的移位寄存器並聯起來。
移位寄存器的輸入、輸出都可以是並行或串行的。它們經常被配置成串入並出(serial-in, parallel-out, SIPO)的形式或併入串出(parallel-in, serial-out, PISO),這樣就可以實現並行數據和串行數據的轉換。當然,也有輸入、輸出同時為串行或並行的情況。[1]此外,還有一些移位寄存器為雙向的,也就是說它允許數據來回傳輸,輸入端同時可以作為輸出端,輸出端同時也可以作為輸入端。如果把移位寄存器的串行輸入端,和並行輸出端的最後一位連接起來,還可以構成循環移位寄存器(circular shift register),用來實現循環計數功能。[3]
串入串出
[編輯]破壞性讀出
[編輯]0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
0 | 1 | 1 | 0 |
0 | 0 | 1 | 1 |
0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 |
這是最簡單的移位寄存器類型。出現在「數據輸入」的數據串每次「數據移位」都會向右移動升高一級。每次移位過程中,最左邊的一位(即「數據輸入」)移入第一個觸發器的輸出中。最右邊的一位(即「數據輸出」)會移出並丟失。
數據存儲在每個觸發器後的「Q」輸出中,所以在這種排列下有四個可以使用的「儲存槽」,因此為4位寄存器。要對移位模式有所了解,可以想象寄存器內數據為 0000(則所有儲存槽都為空)。隨着「數據輸入」出現 1,0,1,1,0,0,0,0,對於寄存器(按照這個順序,每次「數據移位」都有一個脈衝,稱作選通),這就是結果。左邊的列對應於最左邊的觸發器的輸出引腳,後面同理。
所以整個寄存器的串行輸出為 10110000。可以看出如果數據輸入是連續的,就會得到完整的輸入,只是偏移了四個「數據移位」周期。這種排列是隊列的硬件等價形式。同時,在任何時候,整個寄存器可以通過復位引腳設置為高電平來置零(R)。
這種排列展現出「破壞性讀出」——所有數據在被移位到最右面的位之後就會丟失。
串入並出
[編輯]串入並出形式的移位寄存器接法,可以將輸入的串行數據以並行格式輸出。串行通信要求的幾位數據完成輸入之後,就可以在輸出端的各位同時讀出並行數據。
在這種設置中,每個觸發器都是邊沿觸發的。第一個觸發器工作在給定的時鐘頻率下。其餘後級觸發器將前級的頻率折半,也就是占空比變為二倍。因此,它需要兩倍長的上升/下降沿來觸發後續的每一個觸發器;這就錯開了時域中的串行輸入,從而導致並行輸出。
併入串出
[編輯]併入串出形式的移位寄存器接法,通過下圖所示D1-D4並行輸入段接收4位外部並行數據,而Q為串行輸出的引腳。為了將數據寫入到寄存器中,寫/移位控制線必須保持低電平。寫入完成,需要移位時,寫/移位控制線則必須處於高電平,而且必須給予時間脈衝,每提供一個時間脈衝,向左(或向右)移動一位。
下圖展示了寫/移位序列的變化情況,並顯示了移位寄存器內部的情況。
應用
[編輯]移位寄存器一個最普遍的應用,是數據傳輸過程中,串行接口和並行接口的轉換。這在許多並行傳輸一組位元數據的電路中很有用,因為它們常常也使用了在結構上更為簡單的串行接口。移位寄存器可以被用作一個簡單的延遲電路。許多雙向移位寄存器可以在並行傳輸中作為堆棧的硬件實現方式。
串入並出形式的移位寄存器經常與微處理器連接,這樣做的原因主要是需要的引腳數多於微處理器能夠提供的數量。通過使用移位寄存器,可以只依靠兩三個引腳,而被控制設備的控制位分別連接在移位寄存器的並行輸出端。由此,微處理器可以以串行的方式一次寫入這些設備的各個控制位。類似的,併入串出接法的移位寄存器在多個外部設備向微處理器傳輸數據時較為常用,外部設備以並行的方式將數據輸入到移位寄存器里,然後移位寄存器以串行的方式將數據一位一位地輸出給微處理器,這樣,外部設備的大量信息可以通過少數幾條線到達微處理器。
在早期的計算機中,移位寄存器被用來進行數據處理:兩個相加的數被存儲在兩個移位寄存器里,然後它們按照時間脈衝被輸出到算術邏輯單元,結果中多出的一位以反饋的形式重新被輸入到其中一個移位寄存器(累加器)。注意兩個一位二進制數相加的結果只可能是一位(如0+0=0,0+1=1)或者兩位(1+1=10)。
一些計算機語言內置了移位指令,這類指令可以讓二進制數據在寄存器中進行左移或右移操作。左移或右移一位,相當於乘以2或除以2。
一些1970年代早期的設備曾以類似延遲線存儲器的方式用過非常大規模的串入串出移位寄存器,其規模達到上千位。這類存儲器有時被稱為循環存儲器(circulating memory)。例如,DataPoint 3300將其25列、72行的字符顯示數據存儲在54個200位的移位寄存器里,以6個堆棧、每個堆棧9個包的形式排列,提供了1800個6位字符的存儲能力。[4]
參考文獻
[編輯]相關條目
[編輯]外部連結
[編輯]- Shift Registers (頁面存檔備份,存於網際網路檔案館) at AllAboutCircuits.com