锁存器触发器

2023-12-30 03:04
文章标签 触发器 存器

本文主要是介绍锁存器触发器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

本篇文章介绍触发器
触发器是这样一种电路实现,触发器有一个控制输入端和一个数据输入端,触发器的特点是可以保存数据输入的信息

  • 如果控制输入端设置为高电平,数据输入端的数据将会改变输出的数据
  • 否则,数据输入端不对输出数据产生影响

SR锁存器

SR锁存器是最简单的一类触发器,通过两个或非门实现,电路图如下:
在这里插入图片描述

我们再次给出或非门的输入输出逻辑关系:
输入 A 输入 B 输出 0 0 1 0 1 0 1 0 0 1 1 0 \begin{array}{|c|c|c|} \hline 输入A&输入B&输出\\ \hline 0&0&1\\ \hline 0&1&0\\ \hline 1&0&0\\ \hline 1&1&0\\ \hline \end{array} 输入A0011输入B0101输出1000
SR锁存器的特点如下:

  • 默认 S = 0 S=0 S=0 R = 0 R=0 R=0 Q Q Q=0, Q ‾ \overline{Q} Q=1
  • 当第一次设置 S S S端为1时, Q Q Q=1, Q ‾ \overline{Q} Q=0
  • 然后再次断开 S S S的值不会影响 Q Q Q Q ‾ \overline{Q} Q的值
  • 如果设置 R R R端为1, Q Q Q=0, Q ‾ \overline{Q} Q=1
  • 然后再次断开 R R R的值不会影响 Q Q Q Q ‾ \overline{Q} Q的值

SR锁存器有两点需要注意:

  1. S = 0 S=0 S=0 R = 0 R=0 R=0时, Q Q ‾ Q\overline{Q} QQ维持之前的状态不变
  2. 不能同时设置 S = 1 S=1 S=1 R = 1 R=1 R=1,因为这个时候状态是不可预测的,这样SR锁存器就没有意义了。

SR锁存器可以简化为带有输入和输出标志的小框图:
在这里插入图片描述

SR锁存器最突出的特点在于,它可以记住哪个输入端的最终状态为 1。

触发器

触发器与锁存器的不同在于, 它除了置1、置0输人端以外,又增加了一个触发信号输人端。 只有当触发信号到来时,触发器才能按照输人的置 1、置0信号置成相应的状态,并保持下去。 我们将这个触发信号称为时钟信号(CLOCK),记作CLK。当系统中有多个触发器需要同时动作时,就可以用同一个时钟信号作为同步控制信号了

D型触发器

D型触发器由两个或非门组成的SR锁存器加上两个与门组成的逻辑电路
D型触发器有两个输入端:

  • 数据控制端,控制端可以看作是CLK
  • 数据输入端,数据输入端本来有两个,就是SR锁存器的S端和R端,但是在SR锁存器这一节中我们说过,SR都为0的话保持之前的状态不变,并且SR不能都为1,也就是说SR值一样的时候对我们没什么意义,我们需要的是记住数据输入端的状态,所以我们用一个输入输入端,通过添加一个反相器来引出SR端。参照下面的电路图

D型触发器的特点是:只有当数据控制端为高电平时,数据输入端的状态才会被保存
D型触发器比SR触发器复杂一些,电路图如下:
在这里插入图片描述

根据D型触发器的特点我们可以想到,D型触发器可以保存数据,就是当我需要保存输入数据的时候,只需要把控制端的时钟置成高位即可。并且时钟变为低位后,输入数据不会改变已经保存的数据。

下面列出D型触发器的状态值:

  • 时钟为1,数据端为1, Q Q Q=1, Q ‾ \overline{Q} Q=0
  • 时钟为1,数据端为0, Q Q Q=0, Q ‾ \overline{Q} Q=1
  • 时钟为0,数据端为1或者0, Q Q Q不变, Q ‾ \overline{Q} Q不变

关于D型触发器的思考:
D型触发器的特点决定了一个可能的情况,就是当时钟为1时,如果数据端的数据发生了改变,每次改变都会产生新的状态。对于某些情况而言,可能需要的仅仅是时钟切换到1时保存数据输入的值,然后不在改变。一个是区间,一个是即时,对于即时的改变,有一种新的触发器,叫做边沿触发器

边沿触发器

边沿触发器的特点:
只有当时钟从0跳变到1时,才会引起输出的改变。边沿触发器与D型触发器的区别在于,在D型触发器中,当时钟输入为0时, 数据端输入的任何改变都不会影响输出;而在边沿触发器中,当时钟输入为1时,数据端输入的改变也不会影响输出。只有在时钟输入从0变到1的瞬间,数据端的输入才会影响边沿触发器的输出

边沿触发器是由两个D型触发器连接而成的,电路图如下:
在这里插入图片描述

可以推导一下边沿触发器的规则:

  • 当CLK=0时,前面的D型触发器能保存数据端的数据,并且会一直保存最新的数据,后面的D型触发器因为CLK=0,不保存数据
  • 当CLK从0变成1时,前面的D型触发器关闭,输出的一直是最新的数据,后面的D型触发器打开,将前面的数据保存到 Q Q Q Q ‾ \overline{Q} Q
  • 当CLK保持1时,因为前面的D型触发器已经关闭,输出的一直是之前的数据,所以后面的D型触发器一直保存的是CLK从0变成1时的数据。
  • 当CLK从1变成0时,回到第一步。

最后给出锁存器触发器的C语言实现
可以参考Git地址

/*** sr锁存器的C语言实现* s:置位项* r:重置项* q:输入Q* q1:输出Q1*/
extern void sr_lock(long s, long r,long *q,long *q1);/*** D型触发器* clock:时钟输入* data:数据输入* q:输出Q* q1:输出Q1*/
extern void d_trigger(long clock, long data,long *q,long *q1);/*** 边沿触发器* clock:时钟输入* data:数据输入* q_0:前面的D型触发器的输出数据* q_1:前面的D型触发器的输出数据* q:输出Q* q1:输出Q1*/
extern void b_trigger(long clock, long data,long *q_0,long *q_1,long *q,long *q1);
void sr_lock(long s, long r,long *q,long *q1)
{for(int i =0;i<sizeof(long)*8;i++){// 输入都是0,状态不变if(((1<<i)&s) == 0 && ((1<<i)&r) == 0){continue;}// 输入都是1,理论上要避免if(((1<<i)&s) != 0 && ((1<<i)&r) != 0){continue;}// s==1 r==0if(((1<<i)&s) != 0){(*q) |= 1<<i;}else// s==0 r==1{(*q) &= ~(1<<i);}}(*q1) = ~(*q);
}void d_trigger(long clock, long data,long *q,long *q1)
{long in_1 = alu_and(clock, data, sizeof(long)*8);long in_2 = alu_and(clock, ~data, sizeof(long)*8);sr_lock(in_1,in_2,q,q1);
}void b_trigger(long clock, long data,long *q_0,long *q_1,long *q,long *q1)
{d_trigger(~clock,data,q_0,q_1);long in_1 = alu_and(clock, *q_0, sizeof(long)*8);long in_2 = alu_and(clock, *q_1, sizeof(long)*8);sr_lock(in_1,in_2,q,q1);
}

这篇关于锁存器触发器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/551501

相关文章

Oracle数据库(触发器、存储过程、函数、包)

一、触发器(trigger) 推荐练习文档: http://wenku.baidu.com/link?url=brtd9myO4XIaEjRPaRB0yWgV2_TfXmNxS6KKjB_avq7d0hPs3SknJdrs-JLtWe–H-f3q-I61HUxkcqqAFMC0z6Zf65QBbmFRB8TAlULmGS http://www.cnblogs.com/friends

Flink实例(115):自定义时间和窗口的操作符(十四)窗口操作符(四)触发器(Triggers) (二)

Flink 中窗口是很重要的一个功能,而窗口又经常配合触发器一起使用。 Flink 自带的触发器大概有: CountTrigger: 指定条数触发ContinuousEventTimeTrigger:指定事件时间触发ContinuousProcessingTimeTrigger:指定处理时间触发ProcessingTimeTrigger: 默认触发器,窗口结束触发EventTime

Oracle19C触发器

触发器可以看作一种特殊的存储过程,它定义了一些在数据库相关事件(如INSERT、UPDATE、CREATE等事件)发生时应执行的“功能代码块”,通常用于管理复杂的完整性约束,或监控对表的修改,或通知其他程序,甚至可以实现对数据的审计功能。 1. 触发器简介 触发器是通过触发事件来执行的(存储过程的调用或执行是由用户或应用程序进行的)。能够引起触发器运行的操作就被称为触发事件,如执行DML

SQL server触发器简单示例

一:触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。   二:SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表由系统来维护,它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行 完成

oracle触发器浅析

1.定义:数据库触发器是一个与表相关联的,存储的pl/sql程序 2.作用:每当一个特定的数据操作数据(insert,update,delete)在指定的表上操作时,oracle自动滴执行触发器中的语句序列 3.语法:create [or replace] trigger 触发器名before/After(执行前/后出发) insert(执行操作insert,update,delete[of

Quartz.Net_侦听触发器

简述 触发器执行任务时存在数个阶段,利用侦听器可以在对应的阶段执行一些代码 如何侦听 1.实现ITriggerListener接口,并实现其函数,具体说明见代码注释 public class DeleteAfterCompleted : ITriggerListener{public string Name => "X";// 触发时public async Task TriggerFi

SQL Server触发器的创建

参考http://blog.csdn.net/fredrickhu/article/details/4708906一 (一)先打开sql server数据库,创建数据库Stu ,创建两个表: create database Stu create table Student(StudentID int primary key,StudentName nvarchar(50)

Oracle—触发器(转)

触发器的种类和触发事件 触发器必须由事件才能触发。触发器的触发事件分可为3类,分别是DML事件、DDL事件和数据库事件。 每类事件包含若干个事件,如下所示。数据库的事件是具体的,在创建触发器时要指明触发的事件。 种 类 关 键 字 含 义: DML事件是针对数据,DDL事件是针对对象(表,视图,触发器,存储过程等等),数据库事件针对数据库服务。 DML事件(3种)

008 数据库对象—触发器—讲解

触发器看的我一知半解,看到师兄的一篇触发器的博客特别好,看完以后觉得茅塞顿开,我这个闷葫芦终于也开窍了!先跟大家分享一下这犀利的好文章,其后是我个人的一下补充和思维导图。 分享: 触发器简介: 触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,事件大家应该非常熟悉吧,比如按钮的Click事件、网页的Load事件等。按钮的Click

数据库里面的updateTimed选择代码更新和还是数据库触发器自动更新?

1.updateTime更新可以归纳以下几种: 在项目中,当对数据库的数据进行修改时,updateTime(或类似的表示最后更新时间的字段)的更新时机通常取决于你的应用程序逻辑或使用的数据库框架(如ORM)的行为。 手动更新:最直接的方式是在你的代码中,每次对数据库中的记录进行修改时,显式地更新updateTime字段。这通常涉及到在更新记录的SQL语句中包括updateTime字段,并设置其