HDLBITS笔记29:移位寄存器(包括4位移位寄存器,创建100位左/右旋转器,算术偏移,线性反馈移位寄存器等)
題目1:4位移位寄存器(4-bit shift register)
構建一個具有異步復位、同步加載和使能功能的 4 位移位寄存器(右移位)。
reset:將移位寄存器重置為零。
load: 加載數據[3:0]的移位寄存器,而不是移位。
ena:向右移(q[3] 變為零,q[0] 移出并消失)。
q:移位寄存器的內容。
如果同時load和 ena 輸入 (1),則load輸入具有更高的優先級。
模塊聲明
module top_module(
input clk,
input areset, // async active-high reset to zero
input load,
input ena,
input [3:0] data,
output reg [3:0] q);
**分析:題意要求實現的是右移功能的寄存器,即q[3]傳給q[2],q[2]傳給q[1],q[1]傳給q[0]。
代碼實現如下:
module top_module(input clk,input areset, // async active-high reset to zeroinput load,input ena,input [3:0] data,output reg [3:0] q); always @(posedge clk or posedge areset)beginif(areset)q <= 4'b0;else if(load)beginq <= data;endelse if(ena)beginq[3] <= 0;q[2:0] <= q[3:1];endend endmodule仿真結果如下:
使用quartus ii畫出邏輯圖如下:
題目2:構建100位的左/右旋轉器(Left/right rotator)
構建一個 100 位左/右旋轉器,具有同步負載和左/右使能。旋轉器從寄存器的另一端移入移出位,這與丟棄移出位并在零中移位的移位不同。如果啟用,旋轉器將旋轉位,并且不會修改/丟棄它們。
- load: 加載帶有數據[99:0]的移位寄存器,而不是旋轉。
- ena[1:0]:選擇是否旋轉以及旋轉方向。
- 2’b01 向右旋轉一位
2’b10 向左旋轉一位
2’b00 和 2’b11 不旋轉
q:旋轉器的內容
模塊聲明
module top_module(
input clk,
input load,
input [1:0] ena,
input [99:0] data,
output reg [99:0] q);
分析:這相當于一個100位的環形計數器。其中右移寄存器丟棄的是低位,即q[0];左移寄存器丟棄的是高位,即q[99]。環形計數器通過首尾相連,不會丟棄任何位。
代碼實現 :
module top_module(input clk,input load,input [1:0] ena,input [99:0] data,output reg [99:0] q); always @(posedge clk )beginif(load)q <= data;else if(ena == 2'b01)q <= {q[0],q[99:1]};//右移else if(ena == 2'b10)q <= {q[98:0],q[99]};//左移end endmodule其中: q <= {q[0],q[99:1]};//右移 說明了右移操作,即在時鐘上升沿的作用下,將q[0]的數據直接傳給q[99],觸發器由原來的數據向右移動一位,q[99:1]傳給q[98:1],即q[99]傳給q[98],q[98]傳給q[97],直到q[1]傳給q[0]。左移則與上述相反。
題目3:左/右移算術偏移1或8(Left/right arithmetic shift by 1 or 8)
構建一個具有同步負載的64位算術移位寄存器。移位器可以左右移動,也可以移動 1 位或 8 位位置(按量選擇)。
算術右移位在移位寄存器(在本例中為q[63])中數字的符號位中移動,而不是像邏輯右移那樣為零。另一種思考算術右移位的方法是,它假設被移位的數字是有符號的并保留符號,因此算術右移將有符號數除以2的冪。
邏輯左移和算術左移之間沒有區別。
- load: 加載帶有數據[63:0]的移位寄存器,而不是移位。
- ena:選擇是否轉移。
- amount:選擇要移位的方向和頻次。
2’b00:向左偏移 1 位。 2’b01:向左偏移 8 位。 2’b10:向右移動 1 位。 2’b11:向右移動 8 位。
q:移位器的內容。
模塊聲明
module top_module(
input clk,
input load,
input ena,
input [1:0] amount,
input [63:0] data,
output reg [63:0] q);
**提示:**5 位數字 11000 算術右移 1 是 11100,而邏輯右移將產生 01100。
同樣,5 位數字 01000 算術右移 1 是 00100,邏輯右移將產生相同的結果,因為原始數字是非負數。
代碼實現如下:
module top_module(input clk,input load,input ena,input [1:0] amount,input [63:0] data,output reg [63:0] q); always @(posedge clk)beginif(load)q <= data;else if(ena)begincase(amount)2'b00: q <= {q[62:0],1'b0};2'b01: q <= {q[55:0],8'b0};2'b10: q <= {q[63],q[63:1]};2'b11: q <= {{8{q[63]}},q[63:8]};endcase endend endmodule仿真結果如下:
題目4:5位LFSR(線性反饋移位寄存器)
線性反饋移位寄存器是一個移位寄存器,通常具有幾個XOR門,以產生移位寄存器的下一個狀態。 Galois LFSR是一種特殊的排列方式,其中帶有“抽頭”的位位置與輸出位進行XORed以產生其下一個值,而沒有抽頭的位位置移位。如果仔細選擇抽頭位置,則可以將LFSR設置為“最大長度”。n 位的最大長度 LFSR 循環通過 2n-1 個狀態在重復之前(永遠不會達到全零狀態)。
下圖顯示了一個 5 位最大長度 Galois LFSR,在位位置 5 和 3 處有抽頭。(抽頭位置通常從 1 開始編號)。請注意,為了保持一致性,我在位置 5 處繪制了異或門,但其中一個異或門輸入為 0。
構建此 LFSR。重置應將 LFSR 重置為 1。
模塊聲明
module top_module(
input clk,
input reset, // Active-high synchronous reset to 5’h1
output [4:0] q
);
分析:按照所給的圖寫代碼出來就好。
module top_module(input clk,input reset, // Active-high synchronous reset to 5'h1output [4:0] q ); always @(posedge clk)beginif(reset)q <= 5'b1;elsebeginq[4] <= q[0]^1'b0;q[3] <= q[4];q[2] <= q[3]^q[0];q[1] <= q[2];q[0] <= q[1];endend endmodule仿真結果如下:
題目5:3位LSFR
摘自2015年中期問題5。另請參閱此問題的第一部分:mt2015_muxdff
為此順序電路編寫Verilog代碼(子模塊是可以的,但頂層必須命名為top_module)。假設您將在 DE1-SoC 板上實現該電路。將R輸入連接到SW 開關,將Clock 連接到KEY[0],L連接到KEY[1]。將 Q 輸出連接到紅燈 LEDR。
模塊聲明
module top_module (
input [2:0] SW, // R
input [1:0] KEY, // L and clk
output [2:0] LEDR); // Q
提示:
該電路是線性反饋移位寄存器(LFSR)的一個例子。最大周期 LFSR 可用于生成偽隨機數,因為它循環通過 2n重復前-1個組合。全零組合不在此序列中出現。
分析:通過編寫子模塊、并在頂層模塊中調用的方式來實現。
代碼編寫如下:
使用quartus ii畫出邏輯圖:
頂層模塊:
子模塊:
題目6:32位LFSR
有關說明,請參閱 Lfsr5。
構建一個 32 位 Galois LFSR,在位位置 32、22、2 和 1 處使用抽頭。
模塊聲明
module top_module(
input clk,
input reset, // Active-high synchronous reset to 32’h1
output [31:0] q
);
**參考題目4。**使用抽頭即增加了異或門。
module top_module(input clk,input reset, // Active-high synchronous reset to 32'h1output [31:0] q ); always @(posedge clk)beginif(reset)q <= 32'h1;elsebeginq[31] <= q[0]^32'h0;q[30:22] <= q[31:23];q[21] <= q[22]^q[0];q[20:2] <= q[21:3];q[1] <= q[2]^q[0];q[0] <= q[1]^q[0];endend endmodule題目7:移位寄存器(Exams/m2014 q4k)
實現以下電路:
模塊聲明
module top_module (
input clk,
input resetn, // synchronous reset
input in,
output out);
代碼實現如下:
題目8:移位寄存器(Exams/2014 q4b)
考慮下面所示的n位移位寄存器電路:
為移位寄存器編寫一個頂級 Verilog 模塊(名為 top_module),假設 n = 4。在頂級模塊中實例化 MUXDFF 子循環的四個副本。假設您將在 DE2 板上實現該電路。
- 將 R 輸入連接到SW ,
- clk to KEY[0],
- E 到 KEY[1],
- L 到 KEY[2],以及w 到 KEY[3]。
- 將輸出連接到紅燈 LEDR[3:0]。
從考試/2014_q4a中重復使用您的 MUXDFF。鏈接:題目6:n位移位寄存器:Exams/2014 q4a
**法一,采用題目6:n位移位寄存器:Exams/2014 q4a:的編寫方法:
module top_module (input [3:0] SW,input [3:0] KEY,output [3:0] LEDR ); //MUXDFF u1(.clk(KEY[0]),.e(KEY[1]),.r(SW[0]),.l(KEY[2]),.w(LEDR[1]),.q(LEDR[0]));MUXDFF u2(.clk(KEY[0]),.e(KEY[1]),.r(SW[1]),.l(KEY[2]),.w(LEDR[2]),.q(LEDR[1]));MUXDFF u3(.clk(KEY[0]),.e(KEY[1]),.r(SW[2]),.l(KEY[2]),.w(LEDR[3]),.q(LEDR[2]));MUXDFF u4(.clk(KEY[0]),.e(KEY[1]),.r(SW[3]),.l(KEY[2]),.w(KEY[3]),.q(LEDR[3])); endmodulemodule MUXDFF (clk,w,e,l,r,q);input clk,w,e,l,r;output [3:0] q;always @(posedge clk)beginif(l==1)q <= r;elsebeginif(e == 1)q <= w;elseq <= q;endend endmodule**法2:另一種子模塊的編寫方法:
module top_module (input [3:0] SW,input [3:0] KEY,output [3:0] LEDR ); //MUXDFF u1(.clk(KEY[0]),.e(KEY[1]),.r(SW[0]),.l(KEY[2]),.w(LEDR[1]),.q(LEDR[0]));MUXDFF u2(.clk(KEY[0]),.e(KEY[1]),.r(SW[1]),.l(KEY[2]),.w(LEDR[2]),.q(LEDR[1]));MUXDFF u3(.clk(KEY[0]),.e(KEY[1]),.r(SW[2]),.l(KEY[2]),.w(LEDR[3]),.q(LEDR[2]));MUXDFF u4(.clk(KEY[0]),.e(KEY[1]),.r(SW[3]),.l(KEY[2]),.w(KEY[3]),.q(LEDR[3])); endmodulemodule MUXDFF (clk,w,e,l,r,q);input clk,w,e,l,r;output [3:0] q;always @(posedge clk)beginif(~l)beginif(~e)q <= q;elseq <= w; endelseq <= r;end endmodule題目8:為8x1存儲器設計一個電路(Exams/ece241 2013 q12)-3-input LUT
在本課程中,您將為8x1存儲器設計一個電路,其中寫入存儲器是通過移入位完成的,讀取是“隨機訪問”,就像在典型的RAM中一樣。然后,您將使用電路實現3輸入邏輯功能。
首先,創建一個具有8個D型觸發器的8位移位寄存器。標記的觸發器輸出 Q[0]…Q[7].。移位寄存器輸入應稱為S,它為Q[0]的輸入供電(MSB首先移位)。enable輸入控制是否移位。然后,擴展電路以具有3個額外的輸入A,B,C和一個輸出Z。電路的行為應如下所示:當 ABC 為 000 時,Z=Q[0],當 ABC 為 001 時,Z=Q[1],依此類推。您的電路應僅包含8位移位寄存器和多路復用器。(題外話:該電路稱為3輸入查找表(LUT)
模塊聲明
module top_module (
input clk,
input enable,
input S,
input A, B, C,
output Z );
分析:多讀幾次 題目要求即可。代碼實現如下:
module top_module (input clk,input enable,input S,input A, B, C,output Z ); reg [7:0] q;always @(posedge clk)beginif(enable)q <= {q[6:0],S};// q <= {q[7:0],S};//左移操作endassign Z = q[{A,B,C}];endmodule使用q <= {q[7:0],S};或者q <= {q[6:0],S};均可實現,q[6:0]默認丟棄q[7],q[7:0]則保留,因此使用q <= {q[7:0],S};會出現警告。
仿真結果:
總結
以上是生活随笔為你收集整理的HDLBITS笔记29:移位寄存器(包括4位移位寄存器,创建100位左/右旋转器,算术偏移,线性反馈移位寄存器等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux群组与文件权限
- 下一篇: 6-tcp/ip协议栈发展史