数字电路基础---寄存器

news2024/10/6 20:29:44

目录

数字电路基础---寄存器

1、寄存器简介

1.1、寄存器是如何工作的

2、实验任务

3、程序设计

3.1、模块设计

3.2、绘制波形图

4、编写代码

5、仿真验证

5.1、编写 TB 文件

5.2、仿真验证

6、总结

7、拓展训练


数字电路基础---寄存器

       寄存器是构成时序逻辑最重要的一个单元,可以说没有寄存器就没有时序逻辑。寄存器是由触发器组成的,一个触发器可以组成一个一位的寄存器,多个触发器可以组成一个多位的寄存器。

1、寄存器简介

寄存器一般是由多个触发器构成的,所以在学习寄存器之前,我们先来了解一下触发器。

       从 D 触发器的电路图中我们可以看出,该电路是由两个相同的 D 锁存器以及两个非门连接而成的,图中的 F1 F2 就是 D 锁存器的电路符号,F1 为主锁存器,F2 为从锁存器,由于主锁存器的输出信号 Q0 就是从锁存器的输入信号,因而造成了两个锁存器的主从关系,这两个锁存器的控制信号都由外部时钟信号 CLK 提供。

1.1、寄存器是如何工作的

        首先当 CLK=0 时,CLK 经过非门后直接作为 F1 的控制信号,那么此时 F1 的控制信号为 1F1 被选通,F1 处于工作状态。如果现在输入信号 D 1 的话,它经过 F1F1 的输出 Q0 就为 1,这里的 Q0 不仅是 F1 的输出信号,同时也是 F2 的输入信号。不过现在 F2 的控制信号为 0,因此 F2 现在被锁存了,处于保持状态。输入信号 D 没有办法直接改变输出 Q1 的状态,这是前半拍的工作情况,也就是说,输入信号先存入主锁存器中,但不直接影响输出 Q1 的状态。

       接下来我们再来看后半拍,当外部的控制信号 CLK 0 变为 1 时,经过第一个作为 F1 控制信号的非门后,此时 F1 的控制信号将变为 0。主锁存器 F1 就被封锁了,它的输出 Q0 将保持在当前的状态,即使现在输入信号 D 再发生改变,Q0 的值也不再受影响了。经过两个非门后,F2 的控制信号 CLK 此时为 1,那么 F2 将处于工作状态。Q0 将会作为 F2 这个从锁存器的输入信号,直接影响到输出信号 Q1 的状态。当 Q0 为 1 时,那么根据 D 锁存器的逻辑规律,输出的 Q1 就为 1F2 Q 非为 0,这就是后半拍的工作情况。在后半拍中我们才能实现整个电路状态的改变,因此从上面的分析中我们就可以看出,在 CLK 信号由 0 变为 1 这样的一个变化周期内,触发器的输出状态只可能改变一次。

       在了解完触发器之后,我们再来看一下寄存器。一个触发器可以组成一个一位的寄存器(一个触发器其实可以看作一个寄存器),多个触发器可以组成一个多位的寄存器,多位的寄存器可以存储多 bit 的二进制数据。

       如果多个触发器组成的寄存器输入都是相同信号,那么寄存器的输出也都是相同的信号,这种属于触发器并联如果多个触发器组成的寄存器输入是互相传递的(下一个触发器的输入是上一个触发器的输出),那么寄存器的输出也都是不相同的信号,这种属于触发器串联

       下面我们先来看下触发器的并联,我们以 2bit 的寄存器为例子说明,如下图所示:

       通过上图,我们可以看到,每个触发器的输入都是 D0F1 触发器的 D0 经过时钟上升沿采样后输出是 Q0F2 触发器的 D0 经过时钟上升沿采样后输出是 Q1。由于两个触发器的 D0 是来自同一个信号,所以每个触发器的 Q 端输出也是相同的。

下面我们来看下这并联下的 2bit 寄存器的状态表格。

       由上表格我们可以看出,只有时钟上升沿,数据采样变化,其他时候数据是保持锁存状态。看完触发器的并联后,接下来我们再来看下触发器的串联,我们还是以 2bit 寄存器为例子说明, 如下图所示:

       通过上图,我们可以看到,第一个触发器的输入是 D0F1 触发器的 D0 经过时钟上升沿采样后输出是 Q0,输出的 Q0 F2 的输入。由于 F2 的输入来自于上一个触发器的输出 Q0,因此 F2 的输出比 F1 的输出要晚一个时钟周期,这个地方也就是通常所说的延迟一拍的概念,在逻辑电路设计里面,俗称“打一拍”,或者寄存一拍。

       下面我们来看下这串联下的 2bit 寄存器的状态表格:

       由寄存器的状态表可以看出,当 F1 的输入为 1 时,在时钟上升沿采样后,F1 的输出是 1,此时 F2 的输出还是 0,当下一个上升沿过去之后,F2 的输出才为 1。同理,如果更多的触发器依次串联,其实完成的是一个多级打拍的功能,也是逻辑电路里面移位的功能,就是一个信号在时钟上升沿跳变的时候依次传递到下一个寄存器中。

2、实验任务

本节的实验任务是设计一个 4 级串联寄存器电路。

3、程序设计

3.1、模块设计

       根据实验任务可知,我们需要设计一个 4 级串联寄存器的电路模块。它的输入端口为 a,输出端口为 y,在输入到输出之间使用 4 个触发器进行串联。而每个触发器都是需要时钟信号以及复位信号,所以我们还需要一个时钟端口以及一个复位端口。

模块端口与功能描述如下表所示:

3.2、绘制波形图

根据模块框图以及端口功能的描述列表可以画出该模块的波形,波形如下图所示:

       从绘制的波形图我们可以看出,因为是时序逻辑电路,所以输入 a 的值会延迟一个时钟周期赋值给 a_reg1。以此类推,每个寄存器的值都会延迟一个时钟周期赋值给下一个寄存器。

4、编写代码

       4 级的串联寄存器需要 4 个寄存器,每个寄存器都是需要有时钟,复位信号,输入和输出,根据波形图我们可以写出如下代码:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/06/19 11:56:45
// Design Name: 
// Module Name: shfit_reg4
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
//实验任务
//本节的实验任务是设计一个 4 级串联寄存器电路。

//4 级的串联寄存器需要 4 个寄存器,每个寄存器都是需要有时钟,复位信号,输入和输出
module shfit_reg4(
    input               sys_clk,      //50MHz系统时钟(一个周期是20ns:1/50MHz=0.02us=20ns)
    input               sys_rst_n,    //全局复位
    input               a,            //输入a
    
    output               y             //输出y
    );

reg         a_reg1;      //寄存器1
reg         a_reg2;      //寄存器2
reg         a_reg3;      //寄存器3
reg         a_reg4;      //寄存器4

always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
        a_reg1 <= 1'b0;
        a_reg2 <= 1'b0;
        a_reg3 <= 1'b0;
        a_reg4 <= 1'b0;
     end
     else begin
         a_reg1 <= a;
         a_reg2 <= a_reg1;
         a_reg3 <= a_reg2;
         a_reg4 <= a_reg3;
     end
end

assign y = a_reg4;

endmodule

       程序中第 33 行到第 36 行定义了 4 个寄存器,代码第 38 行到第 51 行将 4 个寄存器串联起来,第 53 行将 a_reg4 的值赋给输出 y

       我们可以使用 VIVADO RTL ANALYSlS 来看一下 RTL 电路。

       从上图可以看出,每个触发器都有 sys_clk 输入信号端口、一个异步清零端口、一个输出端口以及一个输出端口。我们代码中的输入 a 通过 a_reg1a_reg2a_reg3 以及 a_reg4 的串联输出到 y,从图中可以看出这个电路就是一个 4 级寄存器组成的移位寄存器。

5、仿真验证

5.1、编写 TB 文件

下面我们编写一个 testbech 激励文件,通过仿真来看下移位寄存器的波形。仿真代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/06/19 14:15:30
// Design Name: 
// Module Name: tb_shfit_reg4
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_shfit_reg4();

reg             sys_clk;
reg             sys_rst_n;
reg             a;

wire           y;

initial  begin
    sys_clk = 1'b1;
    sys_rst_n <= 1'b0;
    a <= 1'b0;
    #201
    sys_rst_n <= 1'b1;
    #100
    a <= 1'b1;
    #100
    a <= 1'b0;
end

always #10 sys_clk <= ~sys_clk;

shfit_reg4 u_shfit_reg4(
    .sys_clk        (sys_clk      ),
    .sys_rst_n      (sys_rst_n    ),
    .a              (a            ),
    
    .y              (y            )
    );

endmodule

编写完我们的仿真代码,就可以对仿真代码进行仿真的验证了。

5.2、仿真验证

我们打开 Modelsim 软件对代码进行仿真,在运行仿真 1us 后,仿真的波形如下图所示:

       由上图可知,当输入信号 a 1 之后,在下一个时钟上升沿到来时,a_reg1 拉高,经过一个时钟后,a_reg2 拉高,再经过一个时钟后,a_reg3 拉高,在 a 拉高之后的第 4 个时钟,a_reg4 也由低变为了高,然后 a_reg4 的值是通过组合逻辑直接赋值给了 y 信号,因此 y 的波形和 a_reg4 也是完全一样的。可以看出触发器的采样都是在时钟上升沿进行的,其他时候触发器是保持之前采样的信号。另外从波形中,我们也能看到一个移位的效果,就是数据 1 依次移动到下一个触发器中。

6、总结

       本章主要为大家介绍了寄存器的相关概念,并且通过一个时序逻辑电路设计了一个移位寄存器。通过代码的编写以及仿真波形的观察,我们知道了带有时序逻辑的 always 语句块都具有延迟一拍的效果。在后续的学习与设计中我们要养成一个思维,看到 always 语句块下的时序逻辑电路,自然的想到会产生延迟一拍的现象,这个也就是人们常说的“打拍”操作。

7、拓展训练

       我们学习并了解了锁存器和寄存器。可以对比一下锁存器以及寄存器到底有什么区别?锁存器最大的危害是什么?可以画一下寄存器和锁存器的波形图进行对比。

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

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

相关文章

理解安卓的视图体系结构

原文链接 理解安卓的视图体系结构 当我们想要写一个页面的时候&#xff0c;通过一个Activity&#xff0c;然后调用其setContentView方法&#xff0c;把一个布局文件当作一个参数传递过去&#xff0c;然后一个页面就好了&#xff0c;但是除此之外&#xff0c;我们还需要与一些组…

【MySql】MySql索引的作用索引的理解

【MySql】MySql索引的作用&&索引的理解 文章目录 索引的作用认识磁盘MySql 与磁盘交互基本单位Page共识索引的理解主键有序问题理解单个Page理解多个Page页目录单页情况多页情况 索引的作用 索引是与效率挂钩的&#xff0c;所以没有索引&#xff0c;可能会存在问题 索…

从0到1搭建属于自己的Gitlab CI/CD平台

文章目录 持续集成(CI)持续交付(CD)Gitlab CI/CD功能和架构本地搭建GitLab CI/CD平台 MCNU云原生&#xff0c;文章首发地&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;第一时间掌握&#xff01; CI和CD是软件开发中常用的缩写&#xff0c;分别代表持续集成&am…

【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令

更新日期&#xff1a;2023年6月19日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 指令系统1.使用指令系统2.自定义指令1.新建类 MyInstruction2.标记 CustomInstruction 特性3.编写指令的逻辑4.执行自定义指令5.自定义指令的参数6.结尾 …

C进阶 - 数组和指针

Declare an array manually VS malloc or calloc an array 用英文是因为有些东西得用他们的语言才能表达不失真 栈和堆 In C, a heap is a region of memory that is dynamically allocated during runtime. It is used to store variables and data structures that have a …

学习HCIP的day.14

目录 STP生成树协议 生成树协议 一、802.1D 1、根网桥 2、根端口 3、指定端口 4、非指定端口 5、接口状态 802.1D的收敛时间 802.1D算法的缺点 以上cost值的解释 二、PVST 三、PVST 四、快速生成树 五、MSTP/MST/802.1S STP生成树协议 网络三层架构…

南京企业所得税高怎么办?

南京企业所得税高怎么办&#xff1f; 《税筹顾问》专注于园区招商&#xff0c;您的贴身节税小能手&#xff0c;合理合规节税&#xff01; 众所周知&#xff0c;企业所得税是按利润来计算的&#xff0c;按照不同的利润阶梯计算适用的税率也会有所不同&#xff0c;那么当企业利润…

launch文件的编写及ROS配置文件的详细介绍

launch文件的编写及ROS配置文件的详细介绍 1 launch文件介绍及简单应用1.1 launch文件介绍1.2 launch文件简单应用 2 package.xml文件介绍及配置3 CMakeLists.txt文件介绍及配置 1 launch文件介绍及简单应用 1.1 launch文件介绍 根据ROS的架构和通信机制来看&#xff0c;ROS的…

讯飞星火大模型详细内测体验:它能否应对这些挑战?

名人说&#xff1a;一花独放不是春&#xff0c;百花齐放花满园。——《增广贤文》 作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、简要介绍二、分类问题测试0️⃣自我介绍1️⃣语言理解2️⃣知识问答3️⃣逻辑推…

Vue中如何进行文件转换与格式转换

Vue中如何进行文件转换与格式转换 在Web应用程序中&#xff0c;经常需要进行文件转换和格式转换。例如&#xff0c;将PDF文件转换为图像文件、将音频文件转换为不同的格式或将视频文件转换为不同的分辨率和编解码格式。Vue作为一种流行的前端框架&#xff0c;提供了许多实用工…

网络管理与维护(二)网络用户设置管理

网络用户设置管理 2.1 用户帐户安全管理 用户账户的分类 管理员帐户。拥有管理本台计算机的所有权限和权利。系统内置的Administrator用户帐户 和Administrators组帐户的成员就属于管理员帐户 标准帐户。通常分配给最终用户使用&#xff0c;适用于日常工作&#xff0c;对操作…

GeoServer中地图可视化提升利器之SLD知识简介

目录 前言 一、SLD简介 1、介绍 2、SLD的版本 3、SLD的Schema说明 二、SLD中相关知识解析 1、Scheme简要说明 2、一个SLD实例 总结 前言 在互联网上有很多精美的地图&#xff0c;在地图从shp或者gdb等矢量文件&#xff0c;经过设计人员的加工&#xff0c;配色&#xff0…

【论文阅读】Graph-less Collaborative Filtering

【论文阅读】Graph-less Collaborative Filtering 文章目录 【论文阅读】Graph-less Collaborative Filtering1. 来源2. 介绍3. 模型解读3.1 协同过滤3.2 模型3.2.1 对比知识精馏 3.2.2 自适应对比正则化3.2.3 SimRec的参数学习 4. 实验5. 总结 1. 来源 2023WWW CCFA原文地址co…

【Linux】linux | 服务响应慢、问题排查 | 带宽问题导致 | 网速

一、说明 1、项目使用云服务器&#xff0c;服务器配置&#xff1a;5M带宽、4核、32G&#xff0c;1T&#xff0c;CentOS7 2、CPU、内存、磁盘IO都没有达到瓶颈&#xff0c;猜测是带宽问题 3、应用比较多&#xff0c;应用中间件&#xff0c;十几个差不多 4、同时在线人数30 5、已…

“暗网议会”如今已成为现实

图片来源:Marcin Balcerzak 最近&#xff0c;“暗网议会”已经成为了网络犯罪分子试图证明自己影响力的最新流行语&#xff0c;安全内部人士对这个词也很感兴趣。 上周五&#xff0c;臭名昭著的亲俄黑客组织Killnet在其电报威胁帖子中使用了这个词语。随后&#xff0c;twitte…

d2l_第五章学习_Multilayer Perceptrons多层感知机

x.1 Hidden Layers 线性模型的基本假设是单调&#xff0c;即任何特征的增大都会导致模型的输出增大&#xff08;权重正时&#xff0c;负值时亦&#xff09;。但是现实中很多的关系并不仅仅是简单的线性关系&#xff0c;这个时候就需要引入非线性关系&#xff0c;而非线性关系由…

Verilog基础之七、译码器实现

目录 一、前言 二、工程实现 2.1 工程代码 2.2 仿真结果 2.3 参考 一、前言 ​译码器的实现为编码器的逆过程&#xff0c;以3-8译码器为例&#xff0c;真值表如下。 二、工程实现 ​实现同时使用for循环和case两种方式。 2.1 工程代码 module Decoder(in,out,out_case )…

【菜单折叠效果】这菜单效果千万别让领导看了,一不小心就升职加薪(附源码)

【写在前面】 上周想着冲一波粉丝量&#xff08;周冲700&#xff09;&#xff0c;但是事与愿违&#xff0c;没办法我只能不断的督促自己多分享&#xff0c;多总结了&#xff0c;那么今天晚上我就好好整理了一篇常见后台管理系统的菜单收缩动态效果&#xff0c;主要是用于后台管…

基于深度学习的高精度打电话检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度打电话检测识别系统可用于日常生活中或野外来检测与定位打电话目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的打电话目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…