HDLBits答案(12)_Verilog移位暫存器
源自於https://blog.csdn.net/qq_42334072/article/details/109452144
題目描述1:
構建一個4bit的移位暫存器(右移),含非同步重定、同步載入和使能
areset:讓寄存器復位為0
load:載入4bit數據到移位暫存器中,不移位
ena:使能右移
q:移位暫存器中的內容
Solution1:
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);
always @(posedge clk or posedge areset)begin
if(areset)begin
q <= 4'b0;
end
else if(load) begin
q <= data;
end
else if(ena)begin
q <= {1'b0,q[3:1]};
end
else begin
q <= q;
end
end
endmodule
題目描述2:
構建一個100位的左右旋轉器,同步load,左右旋轉需使能。旋轉器從另一端輸入移位的位元,不像移位器那樣丟棄移位的位元而以零位移位。如果啟用,旋轉器就會旋轉這些位,而不會修改或丟棄它們。
load:載入100位元的移位暫存器數據
ena[1:0]:2’b01
右轉1bit;
2’b10 左轉1bit;其他情況不轉
q:旋轉器內容
Solution2:
module top_module(
input clk,
input load,
input [1:0] ena,
input [99:0] data,
output reg [99:0] q);
always @(posedge clk) begin
if(load) begin
q <= data;
end
else begin
case (ena)
2'b01:q <=
{q[0],q[99:1]};
2'b10:q <= {q[98:0],q[99]};
default:q <= q;
endcase
end
end
endmodule
題目描述3:
建立一個64位算術移位暫存器,同步載入。移位器可以左右移位,並按數量選擇1位或8位的移位。
load:載入數據
ena:決定是否移位
amount:決定移位方向與數量:2’b00:左移1位;2’b01:左移8位;2’b10:右移1位;2’b11:右移8位
q:寄存器內容(輸出)
Solution3:
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)begin
if(load)begin
q <= data;
end
else begin
if(ena)begin
case(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
end
else begin
q <= q;
end
end
end
endmodule
題目描述4:
構造線性移位暫存器,reset應當使LFSR歸1。
Solution4:
module top_module(
input clk,
input reset, // Active-high synchronous reset to 5'h1
output [4:0] q
);
always @(posedge clk)begin
if(reset)begin
q <= 5'h1;
end
else begin
q[4] <= 1'b0 ^ q[0];
q[3] <= q[4];
q[2] <= q[3] ^ q[0];
q[1] <= q[2];
q[0] <= q[1];
end
end
endmodule
題目描述5:
為這個序列電路編寫Verilog代碼。假設你要在DE1-SoC板上實現這個電路。將R輸入連接到SW開關,將時鐘連接到金鑰[0],將L連接到金鑰[1],將Q輸出連接到紅燈LEDR上。
Solution5:
module top_module (
input [2:0] SW, // R
input [1:0] KEY, // L and clk
output [2:0] LEDR); // Q
wire clk;
assign clk = KEY[0];
always @(posedge clk)begin
if(KEY[1])begin
LEDR[0] <= SW[0];
LEDR[1] <= SW[1];
LEDR[2] <= SW[2];
end
else begin
LEDR[0] <= LEDR[2];
LEDR[1] <= LEDR[0];
LEDR[2] <= LEDR[2] ^ LEDR[1];
end
end
endmodule
題目描述5:
構建一個32位的Galois LFSR,其taps位置為32、22、2和1。
Solution5:
module top_module(
input clk,
input reset, // Active-high synchronous reset to
32'h1
output [31:0] q
);
integer i;
always @(posedge clk)begin
if(reset)begin
q <= 32'h1;
end
else begin
for(i=0;i<32;i++)begin
if((i==21)||(i==1)||(i==0))begin
q[i]
<= q[i+1] ^ q[0];
end
else if(i==31)begin
q[31]
<= 1'b0 ^ q[0];
end
else begin
q[i]
<= q[i+1];
end
end
end
end
endmodule
**題目描述6:**實現如下電路圖
Solution6:
module top_module (
input clk,
input resetn, // synchronous reset
input in,
output out);
reg [3:0] tmp;
assign out = tmp[3];
always @(posedge clk)begin
if(!resetn)begin
tmp <= 4'h0;
end
else begin
tmp <= {tmp[3:1],in};
end
end
endmodule
**題目描述7:**實現如下電路圖
Connect the R inputs to the SW switches,
clk to KEY[0],
E to KEY[1],
L to KEY[2], and
w to KEY[3].
Connect the outputs to the red lights LEDR[3:0].
Solution7:
module top_module (
input [3:0] SW,
input [3:0] KEY,
output [3:0] LEDR
);
MUXDFF u1(.clk(KEY[0]),
.w(KEY[3]),
.R(SW[3]),
.E(KEY[1]),
.L(KEY[2]),
.Q(LEDR[3]));
MUXDFF u2(.clk(KEY[0]),
.w(LEDR[3]),
.R(SW[2]),
.E(KEY[1]),
.L(KEY[2]),
.Q(LEDR[2]));
MUXDFF u3(.clk(KEY[0]),
.w(LEDR[2]),
.R(SW[1]),
.E(KEY[1]),
.L(KEY[2]),
.Q(LEDR[1]));
MUXDFF u4(.clk(KEY[0]),
.w(LEDR[1]),
.R(SW[0]),
.E(KEY[1]),
.L(KEY[2]),
.Q(LEDR[0]));
endmodule
module MUXDFF (
input clk,
input w,R,E,L,
output Q
);
wire tmp;
assign tmp = E ? w : Q;
always @(posedge clk)begin
Q <= L? R : tmp;
end
endmodule
題目描述8:
在這個問題中,你將為一個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))。
Solution8:
module top_module (
input clk,
input enable,
input S,
input A, B, C,
output Z );
reg [7:0] Q;
always @(posedge clk)begin
if(enable)begin
Q <= {Q[6:0],S};
end
else begin
Q <= Q;
end
end
assign Z = Q[{A,B,C}];
endmodule
沒有留言:
張貼留言