在應(yīng)用中要如何實現(xiàn)移位寄存器的設(shè)計?
移位寄存器有不同的版本,可用于各種各樣的應(yīng)用程序。本文將向您介紹移位寄存器并說明它們的工作原理。此外,它還將解釋如何將它們用于將多條并行數(shù)據(jù)線轉(zhuǎn)換為單個串行連接。
什么是移位寄存器?
移位寄存器是存儲單個數(shù)據(jù)字的同步器件,可以對這些位執(zhí)行邏輯移位操作。邏輯移位將字的每個位向左或向右移動。空格通常用零填充:
上圖顯示了向左的邏輯移位。右移以類似的方式工作。
移位寄存器由幾個單位鎖存器組成它們以串行菊花鏈方式連接,以便一個鎖存器的輸出連接到下一個輸入:
有些變速器允許您選擇這些位將被移動。
移位寄存器的類型
通常,有四種不同類型的移位寄存器可用數(shù)據(jù)輸入和輸出設(shè)備的方式不同:
串行輸入,串行輸出
串行輸入,并行輸出
并行輸入,串行輸出
并行輸入,并行輸出
串行和并行類型通常同步運行,因此您需要時鐘信號處理數(shù)據(jù)。
支持串行和并行輸入的寄存器,如以及串行和并行輸出,被稱為通用移位寄存器。
基本操作
我們假設(shè)我們有以下理論4位移位寄存器同時具有串行輸入和輸出以及并行輸出:
如您所見,每個位從右側(cè)的串行輸入加載到移位寄存器的D鎖存器中。
第一個時鐘周期將其加載到鎖存器A中。然后鎖存器的輸出具有加載到寄存器中的值。 。下一個時鐘周期設(shè)置第二個鎖存器值并將一個新位加載到第一個鎖存器中,從而將位從右向左移位。這與所有寄存器同時發(fā)生。最后一個鎖存器輸出是移位寄存器的串行輸出。
因此,串行移位器可以用作緩沖器。上面的移位器也可用于將串行信號轉(zhuǎn)換為四條并行數(shù)據(jù)線。
與串行轉(zhuǎn)換并行
此技術(shù)可用于減少從并行總線讀取值所需的輸入數(shù)量。例如,您可以利用它將來自計算機鍵盤的信號轉(zhuǎn)換為USB控制器可以理解的單個串行信號。在本例中,我使用DIP開關(guān)來模擬8位數(shù)據(jù)總線,并使用Arduino Uno上的單個GPIO引腳讀取8個值:
請注意,橙色和黃色總線實際上可能無法連接成一條線。我決定以這種方式代表他們以使圖像更容易理解:
Arduino控制移位寄存器,產(chǎn)生時鐘信號,并讀取8位。然后輸出值:
結(jié)論
移位寄存器是一個由幾個D鎖存器組成的同步器件,它實現(xiàn)了數(shù)字電路中的邏輯移位功能。這些IC可用于各種應(yīng)用。然而,它們通常用于將串行數(shù)據(jù)線轉(zhuǎn)換為并行總線,反之亦然。使用它們時,您必須記住,有不同類型可用于不同目的。
移位寄存器(左移、右移、雙向)的Verilog實現(xiàn)
移位寄存器的功能和電路形式較多,按移位方向分有左移、右移、和雙向移位寄存器;按接收數(shù)據(jù)方式分為串行輸入和并行輸入;按輸出方向分為串行輸出和并行輸出。
如果將若干個觸發(fā)器級聯(lián)成如下圖所示電路,則構(gòu)成基本的移位寄存器。圖中是一個4位移位寄存器,串行二進制數(shù)據(jù)從輸入端Dsi輸入,左邊觸發(fā)器的輸出作為右鄰觸發(fā)器的數(shù)據(jù)輸入。若將串行數(shù)碼D3D2D1D0從高位(D3)至低位(D0)按時鐘脈沖間隔依次送到Dsi端,經(jīng)過第一個時鐘脈沖后,Q0=D3。由于跟隨D3后面的是D2,因此經(jīng)過第二個時鐘脈沖后,觸發(fā)器FF0的狀態(tài)移入觸發(fā)器FF1而FF0轉(zhuǎn)變?yōu)樾碌臓顟B(tài),即Q1=D3,Q0=D2。以此類推,輸入數(shù)碼依次由左側(cè)觸發(fā)器移到右側(cè)觸發(fā)器。經(jīng)過4個時鐘脈沖后,4個觸發(fā)器的輸出狀態(tài)Q3Q2Q1Q0與輸入數(shù)碼D3D2D1D0相對應(yīng)。這樣,就將串行輸人數(shù)據(jù)轉(zhuǎn)換為并行輸出數(shù)據(jù)Dpo。
一般來說,N位移位寄存器要由N個觸發(fā)器構(gòu)成,需要N·Tcp來完成串行到并行的數(shù)據(jù)轉(zhuǎn)換,同樣也需要N?Tcp來實現(xiàn)并行到串行的數(shù)據(jù)輸出。這里,Tcp為時鐘周期。從上述操作可以看出,移位寄存器只能用脈沖邊沿敏感的觸發(fā)器,而不能用電平敏感的鎖存器來構(gòu)成,因為在時鐘脈沖高電平期間,鎖存器輸出跟隨輸入變化的特性將使移位操作失去控制。顯然,移位寄存器屬于同步時序電路。
1.基本移位
首先說明“由于國家標(biāo)準(zhǔn)規(guī)定,邏輯圖中最低有效位(LSB)到最高有效位(MSB)的電路排列順序應(yīng)從上到下,從左到右。因此定義移位寄存器中的數(shù)據(jù)從低位觸發(fā)器移向高位為右移,反之則為左移。這一點與通常計算機程序中規(guī)定相反,后者從自然二進制數(shù)的排列考慮,將數(shù)據(jù)移向高位定義為左移,反之為右移。”此內(nèi)容摘自《電子技術(shù)基礎(chǔ)-數(shù)字部分》康華光主編教材。
module shifter( din, clk, rst, dout,done);
input din, clk, rst;
output [7:0] dout;
output reg done; //完成移位
reg [7:0] dout;
reg [3:0] cnt;
always @(posedge clk)
begin
if(rst) //清零
dout <= 8’b0;
else if(cnt<=4’d7)
begin
dout<=dout>>1; //左移
dout[7]<=din;
/*dout <= dout<<1;
dout[0] <= din; */ //右移
end
else
dout<=dout;
end
always@(posedge clk)
begin
if(rst)
begin
cnt<=4'd0;
done<=1'b0;
end
else if(cnt==4'd7)
begin
cnt<=4'd0;
done<=1'b1;
end
else begin
cnt<=cnt+1'b1;
done<=1'b0;
end
end
endmodule
2.雙向移位
雙向移位實現(xiàn)數(shù)據(jù)保持、右移、左移、并行置數(shù)、并行輸出。
module two_way(
input clk,
input rst,
input s0,s1, //選擇輸入端口
input din1,din2, //串行數(shù)據(jù)輸入
input [3:0] d, //并行數(shù)據(jù)輸入
output reg [3:0] q //輸出端口
);
always@(posedge clk or negedge rst)
begin
if(!rst)
q<=4'd0;
else begin
case({s1,s0})
2'b00: q<=q; //輸出保持不變
2'b01: q<={q[2:0],din1}; //右移
2'b10: q<={din2,q[3:1]}; //左移
2'b11: q<=d; //并行置數(shù)
endcase
end
end
endmodule
在數(shù)字電路中,移位寄存器(Shift Register)是時鐘的脈沖(上升沿)觸發(fā)之下工作的一種以觸發(fā)器為基礎(chǔ)的電路器件,在每個時鐘上升沿的觸發(fā)之下,數(shù)據(jù)會依次向左或右移動一個比特(Bit),最后在輸出端進行輸出,這里,數(shù)據(jù)可以以并行或者以串行的方式輸入到該移位寄存器的電路器件中。
移位寄存器也是類似一種存儲器,可以存儲數(shù)據(jù),而存在里邊的數(shù)據(jù)可以從低位向高位移動或從高位向低位移動。例如一個4位的移位寄存器,存在其中的數(shù)據(jù)為“1100”,如果向左(即高位MSB)移動一次,就變成“100X”,原來的最高位的“1”移出,最低位的“X”可以是新移入的數(shù)據(jù),也可以是0(我們本次設(shè)計用的是隨機數(shù)據(jù),即隨機輸入“0”或者是“1”)。
就是因為移位寄存器中的數(shù)據(jù)可以在移位脈沖作用下依次逐位右移或者依次逐位左移,而數(shù)據(jù)既可以并行輸入、并行輸出、串行輸入以及串行輸出,也可以并行輸入、串行輸出、串行輸入以及并行輸出,因此,正是因為移位寄存器如此靈活,才使得它用途廣泛,可以應(yīng)用于許許多多的數(shù)字電路設(shè)計模塊之中,從而實現(xiàn)多種多樣的功能。
那么,現(xiàn)在先來我們的代碼,下面是主程序和測試程序(TestBench):
當(dāng)時鐘信號上升沿到來的時候(前提是復(fù)位信號無效的時候),輸出的8位數(shù)據(jù)先移位后輸出,低位賦值一個隨機數(shù),依次移位。
clk:時鐘信號
rst_n:復(fù)位信號,在這里也稱為置零信號,它使得輸出數(shù)據(jù)為零,后綴“_n”表示低電平的時候有效;
data_out:數(shù)據(jù)輸出,這里為8位數(shù)據(jù)輸出,然后先是數(shù)據(jù)進行移位,從低位讓高位移動,比如仿真中的“11110110”(f6),在下一個時鐘觸發(fā)信號到來之后,就進行左移,由原先的“11110110”往左移一位,變?yōu)椤?110110X”,然后X隨機帶入,這里代入的是“1”,所以下一個輸出為“11101101”(ed),依次類推。
該程序?qū)崿F(xiàn)的移位寄存器功能一目了然。
對于移位寄存器,這里我們比較常見的芯片有74194芯片(考試也最??嫉?,它是一種四位雙向移位存器。我們根據(jù)移位方向,常把它分成左移寄存器、右移寄存器和雙向移位寄存器三種。根據(jù)移位數(shù)據(jù)的輸入和輸出方式,又可將它分為串行輸入-串行輸出、串行輸入-并行輸出、并行輸入-串行輸出和并行輸入-并行輸出四種電路結(jié)構(gòu)。大家如果感興趣的話可以去百度搜索這款移位寄存器的芯片手冊閱讀一下,對于自己的學(xué)習(xí)還是非常有幫助的!