HDLBits刷题笔记9:Circuits.Sequential Logic.Counters + Shift Registers

news2024/11/25 11:37:16

Counters

Four-bit binary counter

module top_module (
    input clk,
    input reset,      // Synchronous active-high reset
    output reg [3:0] q);
    always @(posedge clk) begin
        if(reset)
            q <= 0;
        else
            q <= q + 1;
    end
endmodule

Decade counter

建立一个计数器,从0计数到9

module top_module (
    input clk,
    input reset,        // Synchronous active-high reset
    output reg [3:0] q);
    always @(posedge clk) begin
        if(reset)
            q <= 0;
        else if(q == 9)
            q <= 0;
        else
            q <= q + 1;
    end
endmodule

Decade counter again

建立一个计数器,从1计数到10

module top_module (
    input clk,
    input reset,
    output reg [3:0] q);
    always @(posedge clk) begin
        if(reset)
            q <= 1;
        else if(q == 10)
            q <= 1;
        else
            q <= q + 1; 
    end
endmodule

Slow decade counter

建立一个计数器,从0计数到9,带使能

module top_module (
    input clk,
    input slowena,
    input reset,
    output reg [3:0] q);
    always @(posedge clk) begin
        if(reset)
            q <= 0;
        else if(slowena) begin
            if(q == 9)
                q <= 0;
            else
                q <= q + 1;
        end
    end
endmodule

Counter 1-12

提供一个4bit的计数器,接口如下:

module count4(
    input clk,
    input enable,
    input load,
    input [3:0] d,
    output reg [3:0] Q
);

用这个模块实现一个计数器,从1计数到12,并输出上面模块的enable、load、d

module top_module (
    input clk,
    input reset,
    input enable,
    output [3:0] Q,
    output c_enable,
    output c_load,
    output [3:0] c_d
); //
    assign c_enable = enable;
    assign c_load = reset | (Q == 12 & enable);
    assign c_d = 4'h1;
    
    count4 the_counter (clk, c_enable, c_load, c_d, Q);
endmodule

Counter 1000

提供一个BCD计数器模块,接口如下

module bcdcount (
    input clk,
    input reset,
    input enable,
    output reg [3:0] Q
);

输入1000hz的时钟,使用该模块输出1hz信号,保证每秒该信号只有一个时钟周期高电平,并输出每个BCD计数器的使能

module top_module (
    input clk,
    input reset,
    output OneHertz,
    output [2:0] c_enable
); //
    wire [3:0] bcd0, bcd1, bcd2;
    assign c_enable[0] = 1'b1;
    assign c_enable[1] = bcd0 == 9;
    assign c_enable[2] = c_enable[1] & bcd1 == 9;
    
    bcdcount counter0 (clk, reset, c_enable[0], bcd0);
    bcdcount counter1 (clk, reset, c_enable[1], bcd1);
    bcdcount counter2 (clk, reset, c_enable[2], bcd2);
    
    assign OneHertz = c_enable[2] & bcd2 == 9;
endmodule

4-digit decimal counter

建立一个四位数的bcd计数器,并输出十位、百位、千位的使能

module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    output [3:1] ena,
    output [15:0] q);
    assign ena[1] = q[3:0] == 9;
    assign ena[2] = ena[1] & q[7:4] == 9;
    assign ena[3] = ena[2] & q[11:8] == 9;
    
    bcd_counter u0(clk, reset, 1'b1, q[3:0]);
    bcd_counter u1(clk, reset, ena[1], q[7:4]);
    bcd_counter u2(clk, reset, ena[2], q[11:8]);
    bcd_counter u3(clk, reset, ena[3], q[15:12]);
endmodule

module bcd_counter(
    input clk,
    input reset,
    input ena,
    output reg [3:0] q
);
    always @(posedge clk) begin
        if(reset)
            q <= 0;
        else if(ena) begin
            if(q == 9)
                q <= 0;
            else
                q <= q + 1;
        end
    end
endmodule

12-hour-clock

建立一个12小时制的时钟,带一个am/pm指示器,复位将时钟设定为12:00AM,指示器pm为0时,表示AM,为1时,表示PM。

注意:11点过后为12:00,而不是0:00

下面波形展示了从11:59:59AM翻转到12:00:00PM和复位的波形。

在这里插入图片描述

解题思路:

秒、分的计时范围为00-59,用bcd计数器实现,个位数计数范围为0-9,直接用bcd计数器即可,十位数计数范围0-5,需要在溢出时用reset清零

时钟的计时范围为01-12,不太好用bcd计数器实现,所以单独写always解决

pm只需在11点跳转到12点时翻转即可

module top_module(
    input clk,
    input reset,
    input ena,
    output reg pm,
    output [7:0] hh,
    output [7:0] mm,
    output [7:0] ss); 
    
    wire [1:0] h_ena, m_ena, s_ena;
    
    assign s_ena[0] = ena;
    assign s_ena[1] = s_ena[0] & ss[3:0] == 9;
    assign m_ena[0] = s_ena[1] & ss[7:4] == 5;
    assign m_ena[1] = m_ena[0] & mm[3:0] == 9;
    assign h_ena[0] = m_ena[1] & mm[7:4] == 5;
    assign h_ena[1] = h_ena[0] & (hh == 8'h09 || hh == 8'h12);
    
    bcd_counter s0(clk, reset, s_ena[0], ss[3:0]);
    bcd_counter s1(clk, reset | m_ena[0], s_ena[1], ss[7:4]);
    bcd_counter m0(clk, reset, m_ena[0], mm[3:0]);
    bcd_counter m1(clk, reset | h_ena[0], m_ena[1], mm[7:4]);
    
    // h0
    always @(posedge clk) begin
        if(reset)
            hh[3:0] <= 2;
        else if(h_ena[0]) begin
            if(hh == 8'h12)
                hh[3:0] <= 1;
            else if(hh == 8'h09)
                hh[3:0] <= 0;
            else
                hh[3:0] <= hh[3:0] + 1;
        end
    end
    
    // h1
    always @(posedge clk) begin
        if(reset)
            hh[4] <= 1;
        else if(h_ena[1])
            hh[4] <= ~hh[4];
    end
    
    // pm
    always @(posedge clk) begin
        if(reset)
            pm <= 0;
        else if(h_ena[0] && hh == 8'h11)
            pm <= ~pm;
    end
endmodule

module bcd_counter(
	input clk,
    input reset,
    input ena,
    output reg [3:0] q
);
    always @(posedge clk) begin
        if(reset)
            q <= 0;
        else if(ena) begin
            if(q == 9)
                q <= 0;
            else
                q <= q + 1;
        end
    end
endmodule

Shift Registers

4-bit shift register

建立一个4bit的移位寄存器,右移,带异步复位、load、ena

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, posedge areset) begin
        if(areset)
            q <= 0;
        else if(load)
            q <= data;
        else if(ena)
            q <= {1'b0, q[3:1]};
    end
endmodule

Left/right rotator

建立一个循环左移/右移寄存器,带load、移位使能,当ena为2'b01时右移,当ena为2'b10时左移,其他情况不移位

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) // right
            q <= {q[0], q[99:1]};
        else if(ena == 2'b10) // left
            q <= {q[98:0], q[99]};
    end
endmodule

Left/right arithmetic shift by 1 or 8

建立一个64bit的算数移位寄存器,带load,该移位寄存器可以左移、右移1bit或8bit,算数右移时,左侧填充的是符号位,而不是0。左移时和逻辑左移没有区别,移位方向、移位多少是有amount决定的:

  • 2’b00: 左移1bit
  • 2’b01: 左移8bit
  • 2’b10: 右移1bit
  • 2’b11: 右移8bit
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'h00};
                2'b10: q <= {q[63], q[63:1]};
                2'b11: q <= {{8{q[63]}}, q[63:8]};
            endcase
        end
    end
endmodule

5-bit LFSR

LFSR: (linear feedback shift register),线性反馈移位寄存器,通常有几个异或门来产生移位寄存器的下一个状态。实现如下图所示的5bit位宽LFSR,其在5和3位置处添加了taps(tap即表示该寄存器D端和q[0]进行异或,tap位置从1开始):

在这里插入图片描述

module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 5'h1
    output reg [4:0] q
); 
    always @(posedge clk) begin
        if(reset)
            q <= 5'h1;
        else
            q <= {q[0], q[4], q[3] ^ q[0], q[2:1]};
    end
endmodule

3-bit LFSR

实现如下电路:

在这里插入图片描述

module top_module (
	input [2:0] SW,      // R
	input [1:0] KEY,     // L and clk
    output reg [2:0] LEDR);  // Q
    always @(posedge KEY[0]) begin
        LEDR[0] <= KEY[1] ? SW[0] : LEDR[2];
        LEDR[1] <= KEY[1] ? SW[1] : LEDR[0];
        LEDR[2] <= KEY[1] ? SW[2] : (LEDR[1] ^ LEDR[2]);
    end
endmodule

32-bit LFSR

实现一个32bit的LFSR,在第32、22、2、1位置添加taps,参考5-bit LFSR题目

module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 32'h1
    output reg [31:0] q
); 
    always @(posedge clk) begin
        if(reset)
            q <= 32'h1;
        else
            q <= {q[0], q[31:23], q[0] ^ q[22], q[21:3], q[0] ^ q[2], q[0] ^ q[1]};
    end
endmodule

Shift register

实现如下电路:

在这里插入图片描述

module top_module (
    input clk,
    input resetn,   // synchronous reset
    input in,
    output out);
    reg [3:0] taps;
    always @(posedge clk) begin
        if(~resetn)
            taps <= 0;
        else
            taps <= {in, taps[3:1]};
    end
    assign out = taps[0];
endmodule

Shift register

如下为n-bit的Shift Register:

在这里插入图片描述

编写一个模块实现上述电路,假设n=4,编写MUXDFF模块,在顶层实例化4个MUXDFF子模块,假设你要在DE2开发板上实现,端口对应如下:

  • R to SW
  • clk to KEY[0]
  • E to KEY[1]
  • L to KEY[2] and
  • w to KEY[3]
  • Q to LEDR
module top_module (
    input [3:0] SW,
    input [3:0] KEY,
    output [3:0] LEDR
); //
    MUXDFF u0(KEY[0], KEY[1], SW[0], KEY[2], LEDR[1], LEDR[0]);
    MUXDFF u1(KEY[0], KEY[1], SW[1], KEY[2], LEDR[2], LEDR[1]);
    MUXDFF u2(KEY[0], KEY[1], SW[2], KEY[2], LEDR[3], LEDR[2]);
    MUXDFF u3(KEY[0], KEY[1], SW[3], KEY[2], KEY[3], LEDR[3]);
endmodule

module MUXDFF (
	input clk,
    input E,
    input R,
    input L,
    input W,
    output reg Q
);
    always @(posedge clk) begin
        Q <= L ? R : (E ? W : Q);
    end
endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二分类结局变量Logistic回归临床模型预测—— 外部数据集验证

1. 介绍 2. 基线特征 3. 单因素多因素logistic回归分析及三线表 4. 构建临床列线图模型 5. 模型评价 6. 外部数据集验证 7. 另一种发文章的办法,分训练集和测试集,分析上述3-6节的内容 外部数据集验证,就是找一个别的数据集,可以是别家医院的,也可是数据库的,但是…

机器视觉初步12:C#入门初步(有代码示例)

文章目录 基础部分概述1. 变量&#xff1a;2. 数据类型&#xff1a;3. 运算符&#xff1a;4. 控制语句&#xff1a;5. 字符串和数组&#xff1a;6. 类型转换&#xff1a;7. 输出和输入&#xff1a;8. 变量命名&#xff1a;9. 函数&#xff1a;10. 枚举值的比较&#xff1a;11. …

红旗软件与派盘互认证成功

近年来,随着数据的不断增长和扩张,云计算、大数据、人工智能等技术已成为数字化转型的推动力。在这个背景下,红旗软件和派盘之间的互认证也成为了企业用户进行数据备份和管理的理想选择。 红旗软件是由中国科学院成立的软件公司,其主要产品有红旗Linux操作系统、红旗开发工…

今日分享简单的下划线转驼峰方法

简单的下划线转驼峰方法… #代码片段分享# function underLine2CamelCase(string){return string.replace( /_([a-z])/g, function( all, letter ) {return letter.toUpperCase();}); }

为什么空间坐标系之间的线性变换关系 = 坐标轴向量堆叠?

相机模型存在4个坐标系&#xff1a;世界坐标系、摄像机坐标系、图像物理坐标系和图像像素坐标系。 光心&#xff1a;图像的中心。 光轴&#xff1a;穿过图像的光心&#xff0c;与图像平面垂直的轴。 世界坐标系(Xw,Yw,Zw)&#xff1a;是客观三维世界的绝对坐标系&#xff0c…

【二叉排序树(也叫二叉搜索树)本质就是中序遍历是有序的二叉树】一道题讲解二叉排序树的本质,以及操作代码(通俗易懂的总结帮助理解操作)

1. 二叉排序树&#xff08;中序遍历是有序的&#xff09; 解释一下删除操作的第三点&#xff1a; 首先我们要清楚&#xff1a; 二叉排序树的特点是 中序遍历&#xff08;左根右&#xff09;是有序的 所以如果删除的根节点有左右子树 那么我们为了保证有序 就要把 根节点左子…

Arm64架构(MacBookPro M1)虚拟机安装k8s1.27.3版本记录及问题总结

目录 一、介绍二、安装前设置2.1 设置hostname2.2 关闭防火墙2.3 关闭selinux2.4 关闭swap2.5 允许 iptables 检查桥接流量2.6 安装Docker 三、安装container runtime3.1 安装containerd3.2 安装cri-docker 四、安装k8s集群4.1 配置aliyun的kubernetes yum源4.2 下载 kubelet k…

RTL8309M实现VLAN功能-驱动编进内核

部分硬件实现图 一、使内核支持802.1Q功能 1、使用内核kernel版本4.19.232 2、make menuconfig 配置内核 3、进入Networking support 4、进入Networking options 5、把这些都编进内核 6、点击保存退出 CONFIG_GARPy CONFIG_MRPy CONFIG_BRIDGE_VLAN_FILTERINGy CONFIG_VLAN…

2023年6月第4周大模型荟萃

2023年6月第4周大模型荟萃 2023.6.30版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、腾讯云首次公布大模型进展 6月19日&#xff0c;腾讯云召开行业大模型及智能应用技术峰会&#xff0c;首次公布腾讯云行业大模型研发进展&#xff0…

自定义MVC的初步实现

文章目录 前言一、 工作流程图二、简单的实现自定义MVCController层——Servlet中央控制器子控制器具体Action类 view层——JSP 三、初步实现自定义MVC简单MVC架构中的问题3.1 配置XML文件3.2 建模3.2 Servlet3.3 jsp 前言 在上一篇博客&#xff0c;我们介绍了MVC的演变过程&a…

华为、华三、锐捷、飞塔、山石的抓包命令

一、华为的抓包命令 1、基本概念 华为的抓包行为称之为镜像端口&#xff0c;也就是说将需要抓取的接口上&#xff08;称为镜像端口&#xff09;的流量复制一份到另一个接口上&#xff08;工程师进行流量观察的端口&#xff0c;称为观察端口&#xff09;&#xff0c;如下图所示…

23年hadoop单机版+hive

文章目录 说明分享环境信息安装jdkhadoop配置core-site.xml mysqlhive安装配置hive-site.xml配置hive-env初始化mysql数据库启动验证hive命令hiveserver2方式 总结 说明 工作需要研究hive功能&#xff0c;线上环境不能动&#xff0c;搭建单机版hadoophive测试环境&#xff0c;使…

pyodbc读取.mdb文件时出现[ODBC Microsoft Access Driver] 网络访问已中断。请关闭数据库.....解决方法

在使用pyodbc读取.mdb文件时出现下面的错误 : ODBC Microsoft Access Driver] 网络访问已中断。若要继续&#xff0c;请关闭数据库&#xff0c;然后再将其打开。 (-1022) (SQLDriverConnect) 网上找了很多方法&#xff0c;最后通过下面的方法解决了&#xff0c;就是安装64位的…

搜索团队的技术小结

搜索业务形态 CSDN作为开发者内容中心&#xff0c;主要通过分发博客和商业产品&#xff08;下载资源&#xff09;满足用户碎片化学习需求&#xff1b;产品形态上通过以下3种方式来承接用户需求 1. 站内搜索框 2. 博客相关推荐 3. 下载相…

前端基础知识学习——滑动门(利用背景图像的可层叠性 创造特殊效果)

滑动门&#xff1a;利用背景图像的可层叠性&#xff0c;并允许他们在彼此之上进行滑动&#xff0c;以创造一些特殊的效果。 举例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"…

Linux快速搭建Java环境

1. 安装JDK运行与调试 搭建Java环境 1. 安装JDK 打开命令行执行 sudo apt install default-jdk 有确定的选项直接y就行 安装拓展: 1 . 有时候vscode会自动弹出消息叫你安装拓展,直接点击全部安装就行了 2 . 未弹出或安装失败解决: 打开拓展搜索,把下面的,全部安装就行 这样就可…

适合小企业的小型CRM软件如何选择

市场上有很多小型CRM软件&#xff0c;但很多企业在选型时不知道如何选择&#xff0c;应该考虑哪些因素&#xff0c;什么样的小型CRM软件好&#xff1f;推荐您选择专为小企业设计的CRM客户管理系统。 1、适合初学者&#xff1a; 适合没有使用过CRM软件的企业或个人&#xff0c…

ApiJson json转sql部分示例

ApiJson json转sql部分示例&#xff08;关于json较多&#xff0c;仅供自己快速回顾&#xff09; 首先提供腾讯的APIJSON文档的网址&#xff0c;内容来自于此&#xff1a;部分示例图片 首先提供腾讯的APIJSON文档的网址&#xff0c;内容来自于此&#xff1a; 链接: APIJSON文档…

Matlab隐藏彩蛋

Matlab中的彩蛋实现与Matlab的版本有着重要关系&#xff0c;像Android一样&#xff0c;不同的版本对应不同的彩蛋。这里以Matlab 2016A为例。 1.最著名的一个&#xff0c;命令行窗口输入“image”&#xff0c;就会出现一张倒置的小孩脸&#xff0c;不知情的使用者很可能会被吓…

Solved: “The unsigned image‘s hash is not allowed (DB)“

Solved: “The unsigned image’s hash is not allowed (DB)” 原因是 Secure Boot 的锅 In Hyper-V Manager, make sure the virtual machine is turned off. Select the virtual machine.Right click and select “Settings”Go to “Security”Uncheck “Enable Secure Boo…