HDLBits答案(12)_Verilog移位寄存器「建议收藏」

HDLBits答案(12)_Verilog移位寄存器「建议收藏」Verilog移位寄存器HDLBits链接前言今天更新一节寄存器相关内容,其中涉及CRC校验的内容是用线性反馈移位寄存器搭建而成的。题库题目描述1:构建一个4bit的移位寄存器(右移),含异步复位、同步加载和使能areset:让寄存器复位为0load:加载4bit数据到移位寄存器中,不移位ena:使能右移q:移位寄存器中的内容Solution1:moduletop_module(inputclk,inputareset,//asyncacti

大家好,又见面了,我是你们的朋友全栈君。

Verilog移位寄存器

HDLBits链接


前言

今天更新一节寄存器相关内容,其中涉及CRC校验的内容是用线性反馈移位寄存器搭建而成的。


题库

题目描述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。

1.png

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上。

2.png

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:**实现如下电路图

3.png

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:**实现如下电路图

4.png

  • 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:

在这个问题中,你将为一个8×1存储器设计一个电路,在这个电路中,写入到存储器是通过移位来完成的,而读取是“随机访问”,就像在一个典型的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

小结

今天更新了部分移位寄存器部分的答案,注意最后一题用了一些技巧来简化代码书写,但实现时电路并无差异,体现了HDL中Describe的特性。之后一段时间还要忙比赛,有空再继续更,希望队伍比赛顺利。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160249.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 腾讯云域名如何绑定ip地址

    腾讯云域名如何绑定ip地址域名解析的前提是首先要拥有一个域名 如何把你的域名绑定你的公网 ip 这就需要域名解析 云服务有提供云解析的功能 本文是通过腾讯云操作讲解如何绑定域名 官网域名绑定教程 腾讯云如何绑定域名 腾讯云域名如何绑定 ip 进入控制台 gt 总览 gt 云解析 2 这里需要做进一步的设置 比如 在更多选项卡中 开启 CNAME 加速 开启搜索引擎推送等 3 接着点击解析选项 进入添加记录的控

    2025年12月16日
    2
  • vc6.0不能添加文件到工程_mdk工程添加另一个工程

    vc6.0不能添加文件到工程_mdk工程添加另一个工程曾经我有一个同学说它的VC软件只要选择添加文件到工程,软件就会崩溃,即停止运行,当时我就笑了,怎么可能会出现这个问题,只要你正常安装的话就不会出现这个问题了       结果之后我就遇到这个问题了,不知道什么时候我的软件也是不能选择添加文件到工程,只要选择这个,首先出来个对话框:      Windows正在收集解决方法什么的。。。。      对此,我把我的软件全部卸载,

    2022年8月12日
    4
  • 原来Pycharm中有这么多好用的插件[通俗易懂]

    原来Pycharm中有这么多好用的插件[通俗易懂]pycharm是一款强大的python集成开发环境,带有一整套python开发工具,今天就给大家介绍几款非常好用的插件。首先插件的下载方法进入File->Settings-&…

    2022年8月29日
    6
  • 联想开天 N7 评测

    联想开天 N7 评测开天N7系列笔记本电脑基于兆芯开先KX-6640MA处理器平台,搭配16GB双通道内存和512GBNVMe高速SSD,辅以国产BIOS、OS定制调优;1.29kg超轻单机重量,14.6mm极致纤薄全金属机身;14英寸2.2k16:10显示屏,91%屏占比;支持单手极限180度开盖;率先在国产笔记本引入WiFi6和蓝牙5.0;搭配联想专用芯片的创新智能控制方案,具备光感自动化、开盖即开机、快速充电、充电宝模式等多重独有功能;双风扇双热管散热系统,搭配61Wh

    2022年5月10日
    65
  • fatal: unable to access https:// Failed to connect to: Connection refused|git clone问题(完美解决)

    fatal: unable to access https:// Failed to connect to: Connection refused|git clone问题(完美解决)fatal:unabletoaccess‘https://github.com/xxxx/’:Failedtoconnecttox.x.x.xportxxxxx:Connectionrefused|gitclone问题(完美解决)系统:ubuntu14.04问题描述执行以下命令克隆目标源码到本地时,会出现错误。gitclonehttps://gith…

    2022年6月21日
    63
  • 博途scl编程实例_博途plc编程流程

    博途scl编程实例_博途plc编程流程SCL:StructuredContorlLanguage,结构化控制语言。在TIA博途软件中,默认支持SCL语言,在建立程序块时可以直接选择SCL语言。SCL语言类似计算机高级语言,如果你有C、Java、C++、Python这种高级语言的学习经历,再学习SCL就会容易很多。在用SCL语言编程时,主要用IF…THEN/FOR/WHILE语句去构造条件、循环、判断这样的结构,在这些结构中再次添加指令,去实现逻辑判断。所有程序的编写都是在纯文本的环境下编辑,不像梯形图那么直观。能把

    2022年10月7日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号