HDLBits刷题合集—13 Shift Registers
HDLBits-106 Shift4
Problem Statement
构建一个4位移位寄存器(右移位),具有异步置位、同步置数和使能。
areset:将移位寄存器置零。
load:用data[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);
always @(posedge clk or posedge areset)
begin
if (areset)
q <= 4'b0;
else if (load)
q <= data;
else if (ena)
q <= {1'b0, q[3:1]};
end
endmodule
HDLBits-107 Rotate100
Problem Statement
构建一个具有同步置数和左/右使能功能的100位左/右旋转器。旋转器从寄存器的一端移入另一端移出的位,这与移位器丢弃移出的位并移入零不同。 如果使能端有效,旋转器将旋转这些位,并且不会修改/丢弃这些位。
load:向移位寄存器置入data[99:0],而不是旋转。
ena[1: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);
always @(posedge clk)
begin
if (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]};
else if (ena == 2'b00 || ena == 2'b11)
q <= q;
end
endmodule
HDLBits-108 Shift18
Problem Statement
建立一个具有同步置数的64位算术移位寄存器。 移位器可以向左和向右移位1或8位的位置(按不同的数字进行选择)。
算术右移是将移位寄存器中数字(q[63])的符号位移位,而不是逻辑右移所做的零。另一种考虑算术右移的方法是,它假设移动的数是有符号的,并且保留了符号,所以算术右移将有符号的数除以2的幂。
逻辑左移和算术左移之间没有区别。
load:data[63:0]置入移位寄存器而不是移位。
ena:选择是否移位。
amount:选择移位方向和移位改变多少:
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);
always @(posedge clk)
begin
if (load)
q <= data;
else 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
end
endmodule
HDLBits-109 Lfsr5
Problem Statement
线性反馈移位寄存器是通常带有几个XOR门,用于产生移位寄存器的下一个状态。 Galois LFSR是一种特殊的操作,其中将带有“tap”的位与输出位进行异或运算以产生其下一个值,而没有移动“tap”位位置。 如果仔细选择“tap”位置,则可以将LFSR设为“最大长度”。 n位的最大长度LFSR在重复之前循环经过2n-1个状态(永远不会达到全零状态)。
下图显示了一个5位最大长度的Galois LFSR,在位置5和3处有“tap”(“tap”位置通常从1开始编号)。 请注意,为保持一致性,我在位置5处绘制了XOR门,但该XOR门有一个输入为0。
module top_module(
input clk,
input reset, // Active-high synchronous reset to 5'h1
output [4:0] q
);
always @(posedge clk)
begin
if (reset)
q <= 5'h1;
else
begin
q[4] <= q[0] ^ 1'b0;
q[3] <= q[4];
q[2] <= q[0] ^ q[3];
q[1] <= q[2];
q[0] <= q[1];
end
end
endmodule
HDLBits-110 Mt2015 lfsr
Problem Statement
请参阅此问题的第一部分: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
wire clk = KEY[0];
wire L = KEY[1];
wire [2:0] Q = L ? SW : {LEDR[1] ^ LEDR[2], LEDR[0], LEDR[2]};
always @(posedge clk)
begin
LEDR <= Q;
end
endmodule
HDLBits-111 Lfsr32
Problem Statement
构建一个32位的Galois LFSR,其“tap”位置为32、22、2和1。
代码如下:
module top_module(
input clk,
input reset, // Active-high synchronous reset to 32'h1
output [31:0] q
);
always @(posedge clk)
begin
if (reset)
q <= 32'h1;
else
q <= {0^q[0], q[31:23], q[0]^q[22], q[21:3], q[0]^q[2], q[0]^q[1]};
end
endmodule
HDLBits-112 Exams/m2014 q4k
Problem Statement
实现以下电路:
module top_module (
input clk,
input resetn, // synchronous reset
input in,
output out);
reg [3:0] q;
always @(posedge clk)
begin
if (!resetn)
q <= 4'b0;
else
q <= {q[2:0], in};
end
assign out = q[3];
endmodule
HDLBits-113 Exams/2014 q4b
Problem Statement
考虑如下所示的n位移位寄存器电路:
为移位寄存器编写一个顶层Verilog模块(命名为top_module),假设n = 4。在顶层模块中实例化MUXDFF子电路四次。假设要在DE2板上实现这个电路。
重用exams/2014_q4a中的MUXDFF。
代码如下:
module top_module (
input [3:0] SW,
input [3:0] KEY,
output [3:0] LEDR
); //
MUXDFF ins0(SW[3], KEY[0], KEY[1], KEY[2], KEY[3], LEDR[3]);
MUXDFF ins1(SW[2], KEY[0], KEY[1], KEY[2], LEDR[3], LEDR[2]);
MUXDFF ins2(SW[1], KEY[0], KEY[1], KEY[2], LEDR[2], LEDR[1]);
MUXDFF ins3(SW[0], KEY[0], KEY[1], KEY[2], LEDR[1], LEDR[0]);
endmodule
module MUXDFF (
input R,
input clk,
input E,
input L,
input w,
output out
);
wire [1:0] mid;
assign mid[0] = E ? w : out;
assign mid[1] = L ? R : mid[0];
always @(posedge clk) begin
out <= mid[1];
end
endmodule
HDLBits-114 Exams/ece241 2013 q12
Problem Statement
在这个问题中,你将设计一个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 );
reg [7:0] Q;
always @(posedge clk)
begin
if (enable)
Q <= {Q[6:0], S};
end
assign Z = Q[{A, B, C}];
endmodule
Note
新手一枚,主要分享博客,记录学习过程,后期参考大佬代码或思想会一一列出。欢迎大家批评指正!