日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDLBITS笔记29:移位寄存器(包括4位移位寄存器,创建100位左/右旋转器,算术偏移,线性反馈移位寄存器等)

發布時間:2024/3/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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個組合。全零組合不在此序列中出現。
分析:通過編寫子模塊、并在頂層模塊中調用的方式來實現。
代碼編寫如下:

module top_module (input [2:0] SW, // Rinput [1:0] KEY, // L and clkoutput [2:0] LEDR); // Qlsfr u1(.clk(KEY[0]),.r(SW),.L(KEY[1]),.q(LEDR)); endmodule module lsfr(L,clk,r,q);input L,clk;input [2:0] r;output q;reg [2:0] q;always @(posedge clk)beginif(L)q <=r;elsebeginq[0] <= q[2];q[1] <= q[0];q[2] <= q[1]^q[2];endend endmodule

使用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);
代碼實現如下:

module top_module (input clk,input resetn, // synchronous resetinput in,output out);reg [3:0] q;always @(posedge clk)beginif(~resetn)q <= 4'b0;elsebeginq <= {q[2:0], in};endendassign out = q[3]; endmodule

題目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位左/右旋转器,算术偏移,线性反馈移位寄存器等)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。