HDLBits个人刷题详解合集12-Circuits-Sequential Logic-Shift Registers-HDBits题目分析

本文详细介绍了使用Verilog语言设计几种不同的移位寄存器,包括4位右移寄存器、100位旋转器、64位算术移位寄存器和线性反馈移位寄存器(LFSR)。每个设计都包含了关键功能,如异步复位、同步加载、使能控制以及不同的移位模式。此外,还提到了32位伽罗瓦LFSR的实现以及如何使用移位寄存器实现3输入查找表(LUT)的电路设计。
摘要由CSDN通过智能技术生成

Shift4

构建 4 位移位寄存器(右移),具有异步复位、同步加载和使能功能。

areset:将移位寄存器重置为零。

Load:加载带有数据[3:0]的移位寄存器,而不是移位。

ena:右移(q[3] 变为零,q[0] 移出并消失)。

如果load和ena输入都断位(1),则负载输入具有更高的优先级。

代码如下:

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]};
        else q <= q;
    end
endmodule

 

Rotate100

构建一个 100 位左/右旋转器,具有同步加载和左/右启用。旋转器从寄存器的另一端移入移出位,这与丢弃移出位并以零位移位的移位不同。如果启用,旋转器将旋转钻头,并且不会修改/丢弃它们。

load: Loads shift register with data[99:0] instead of rotating.

ena[1:0]: Chooses whether and which direction to rotate.

2'b01 rotates right by one bit

2'b10 rotates left by one bit

2'b00 and 2'b11 do not rotate.

q: The contents of the rotator.

代码如下:

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

            q <= q;

    end

endmodule

Shift18

构建具有同步负载的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);

    always @(posedge clk)begin

        if(load)

            q <= data;

        else if(ena)

            case (amount)

                2'b00: q <= {q[62:0],1'b0};//q << 1;

                2'b01: q <= {q[55:0],8'b0};//q << 8;

                2'b10: q <= {q[63],q[63:1]};//q >> 1;

                2'b11: q <= {{8{q[63]}},q[63:8]};//q >> 8,补码转为源码,按位取反再加1;

                default: q <= q;

            endcase

        else

            q <= q;

    end

endmodule


Lfsr5

线性反馈移位寄存器是一个移位寄存器,通常具有几个异或门,以产生移位寄存器的下一个状态。伽罗瓦LFSR是一种特殊的排列方式,其中带有“抽头”的位位置与输出位进行异或运算以产生其下一个值,而没有抽头偏移的位位置。如果仔细选择抽头位置,LFSR可以设置为“最大长度”。n 位的最大长度 LFSR 循环到 2n重复之前 -1 个状态(永远不会达到全零状态)。

下图显示了一个 5 位最大长度伽罗瓦 LFSR,抽头位于位位置 5 和 3。(抽头位置通常从 1 开始编号)。请注意,为了保持一致性,我在位置 5 绘制了 XOR 门,但其中一个 XOR 门输入为 0。构建此 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

            q <= {q[0]^1'b0,q[4],q[3]^q[0],q[2],q[1]};

    end

endmodule

Mt2015 lfsr

为此顺序电路编写 Verilog 代码(子模块可以,但顶层必须命名为 top_module)。假设您将在 DE1-SoC 板上实现该电路。将 R 输入连接到 SW 开关,将时钟连接到 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


    MUXDFF MUXDFF_0(

        .clk(KEY[0]),

        .L(KEY[1]),

        .r_in(SW[0]),

        .q_in(LEDR[2]),

        .Q(LEDR[0])

    );

    MUXDFF MUXDFF_1(

        .clk(KEY[0]),

        .L(KEY[1]),

        .r_in(SW[1]),

        .q_in(LEDR[0]),

        .Q(LEDR[1])

    );

    MUXDFF MUXDFF_2(

        .clk(KEY[0]),

        .L(KEY[1]),

        .r_in(SW[2]),

        .q_in(LEDR[1]^LEDR[2]),

        .Q(LEDR[2])

    );

endmodule

module MUXDFF(

    input clk,

    input L,

    input r_in,

    input q_in,

    output reg Q);

    always @(posedge clk)begin

        Q <= L ? r_in : q_in;

    end

endmodule

Lfsr32

构建一个 32 位伽罗瓦 LFSR,在位位置 32、22、2 和 1 处使用抽头。

代码如下:

module top_module(

    input clk,

    input reset,    // Active-high synchronous reset to 32'h1

    output [31:0] q

);

wire q32,q22,q2,q1;

    

    assign q32 = q[0] ^ 1'b0;

    assign q22 = q[0] ^ q[22];

    assign q2 = q[0] ^ q[2];

    assign q1 = q[0] ^ q[1];

    

    always@(posedge clk)begin

        if(reset)

            q <= 32'h1;

        else

            q <= {q32,q[31:23],q22,q[21:3],q2,q1};

    end

endmodule

Exams/m2014 q4k

代码如下:

module top_module (

    input clk,

    input resetn,   // synchronous reset低电平同步复位

    input in,

    output out);

    reg [3:0]q;//创建位宽为4的移位寄存器

    always@(posedge clk)begin

        if(!resetn)

         q <= 4'b0;

        else begin

            q <= {q[2:0],in};

        end

    end

    assign out = q[3];

endmodule

Exams/2014 q4b

为移位寄存器编写一个顶级 Verilog 模块(名为 top_module),假设 n = 4。实例化四个 顶级模块中的 MUXDFF 子电路的副本。假设您要在 DE2 板上实现电路。

 

代码如下:

module top_module (

    input [3:0] SW,

    input [3:0] KEY,

    output [3:0] LEDR

); //

    MUXDFF MUXDFF_0(KEY[0],LEDR[1],SW[0],KEY[1],KEY[2],LEDR[0]);//实例化模块

    MUXDFF MUXDFF_1(KEY[0],LEDR[2],SW[1],KEY[1],KEY[2],LEDR[1]);

    MUXDFF MUXDFF_2(KEY[0],LEDR[3],SW[2],KEY[1],KEY[2],LEDR[2]);

    MUXDFF MUXDFF_3(KEY[0],KEY[3],SW[3],KEY[1],KEY[2],LEDR[3]);

endmodule

module MUXDFF (

    input clk,

    input w, R, E, L,

    output Q

);

    always@(posedge clk)

        Q <= L ? R : (E ? w : Q);

endmodule

Exams/ece241 2013 q12

在本问题中,您将为 8x1 存储器设计一个电路,其中写入存储器是通过移入位完成的,读取是“随机访问”,就像在典型的 RAM 中一样。然后,您将使用该电路实现3输入逻辑功能。

首先,创建一个具有 8 个 D 型触发器的 8 位移位寄存器。标记来自 Q[0] 的触发器输出...问[7]。移位寄存器输入应称为S,它为Q[0]的输入馈送(MSB首先移位)。启用输入控制是否移位。然后,扩展电路以具有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 );

    //8位移位寄存器和多路选择器

    reg [7:0]Q;

    //8-bits shift register

    always@(posedge clk)

        if(enable)

            Q <= {Q[6:0],S};

     else

            Q <= Q;

    //MUX8

    assign Z = Q[{A,B,C}];//数据流的方式,把输入信号的片选作为位选

endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值