HDLBits刷题合集—13 Shift Registers

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。

HDLBits刷题合集—13 Shift Registers_第1张图片
构建此LFSR,应将LFSR重置为1。
代码如下:

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。

HDLBits刷题合集—13 Shift Registers_第2张图片
代码如下:

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
实现以下电路:

HDLBits刷题合集—13 Shift Registers_第3张图片
代码如下:

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位移位寄存器电路:

HDLBits刷题合集—13 Shift Registers_第4张图片
为移位寄存器编写一个顶层Verilog模块(命名为top_module),假设n = 4。在顶层模块中实例化MUXDFF子电路四次。假设要在DE2板上实现这个电路。

  • 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].

重用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
新手一枚,主要分享博客,记录学习过程,后期参考大佬代码或思想会一一列出。欢迎大家批评指正!

你可能感兴趣的:(HDLBits)