【Day16】:Counter的硬体实现

今天的内容主要是让大家知道,究竟counter是如何透过硬体来实作出来的,牵涉到数位逻辑设计相关内容,如果只是要会使用可以些跳过这一部分喔~

逻辑闸

逻辑闸就是能对一或多个输入讯号作运算并产生输出讯号的电子电路,简单有以下几种:
https://ithelp.ithome.com.tw/upload/images/20210915/20141525KyDhfC9HD1.jpg
基本上除了NOT闸以外,其他的都是两个输入一个输出,而这些输入输出的规则基本上都与我们在写程序时使用的逻辑判断相同,例如AND闸就是当输入皆为1时,输出才会是1,OR则是只要有一个输入是1,就输出1,NOT则是会输出相反的值。比较特别的是NAND和NOR,他们分别是 AND + NOT 和 OR + NOT,也就是两个输入会先经过一次AND的运算,在经过NOT的运算,例如:对NAND闸输入0、1,首先AND的结果是0,再相反是1,大家先稍微熟悉一下这些逻辑闸,接下来我们来「组装」这些逻辑闸吧。

循序逻辑电路

循序逻辑电路,也就是这种电路和时间是相关的,他有两个很重要的特点

  1. 具有记忆单元
    也就是说这个电路可以记住某些值
  2. 电路是有回授的(feedback)
    第一点是说电路内部有记忆单元可以记住某些资讯,那我们就是要将这些资讯回授,并且根据这些资讯在计算出新的输出

到这边可能会有人想问,要怎麽利用上面所说的那几种逻辑闸做出记忆单元呢?这里我们说的记忆单元其实很简单,就是要记住0或1,并且能够将这个记忆单元设为0或1,因此最少要有三种功能(记住现在的状态(No change)、设为1(Set)、设为0(Reset)),因此可见我们的输入至少要有两个这样才能够组合出4种状态,才够使用。实际的电路设计如下:
https://ithelp.ithome.com.tw/upload/images/20210915/201415254RJMafu0YT.png
仅仅透过两个NOR逻辑闸加上一些线路,就可以做出记忆单元!
它的操作方法是

S R 功能
0 0 No change
0 1 RESET
1 0 SET
1 1 Forbidden

虽然他有两个输出,但Q'是作为回授用的,先将Q当作输出就好。
当S是1且R是0时会输出1,此时是SET(Q=1),S是0且R是1时会输出0,此时功能为RESET(Q=0),而当Q=R=0时,Q的输出不会改变,也就是如果原本Q=1那麽他就会一直维持1,反之亦然。而最後一个是被禁止的输入,若是输入Q=R=1,则下个状态的输出是无法被预测的。
大家可以想一下实际想一下这四种输入为什麽可以达到这样的结果,这里我们讲解一个就好。当S=1且R=0时,底下的NOR闸因为已经有一个输入是1了,因此势必会输出0,而上面的闸的两个输入是R=0以及底下的输出Q'回授的0,因此输出是1。其他三个也类似这样推导。

上面所介绍的这个电路就是有名的latch(门闩),起初我刚学到这个的时候,怎麽想都想不通为什麽这叫门闩,後来我终於懂了。因为这个电路具有记忆的功能,也就是他可以把资讯「闩」在这个电路里面。

正反器 flip-flop

接下来的内容就有点太复杂了,但为了讲到counter的实作我们还是稍微提一下,至於实际的运作原理就先不用了解。
https://ithelp.ithome.com.tw/upload/images/20210916/20141525BvdmdPkfaC.jpg
这是一个D型的正反器,他有两个输入分别是控制讯号D以及时钟讯号CLK,正反器其实也是一个记忆单元,他是透过两组latch来实现,而他与latch不同的是,他具有synchronous(同步)的特性,也就是他只会在上升缘会下降缘会改变输出的值,其他时候即使你输入改变,输出也会维持原本的,而latch不同,只要你输入改变,输出马上就跟着改变。这与我们之前提到的中断边缘触发的概念有点类似,都是在上升缘或下降缘才会有反应。
而这个电路的功能如下:

D 功能
0 SET
1 RESET

这个D型的正反器只有两种模式,当D=0时输出0,而D=1时输出1。要注意只有在上升缘或下降缘时才会更动输出的值。

听到这边大概已经完全不知道在干什麽了吧,我当初也是想了好久才比较能理解其中的奥妙。总之今天我们主要是让大家知道counter是可以透过最基本的几个逻辑闸实现出来的,最後我们来附上counter的电路设计图吧!
https://ithelp.ithome.com.tw/upload/images/20210916/20141525D5AZcvrNBz.png
电路图上面的D flip-flop就是我们上面所提到的D型正反器。因为全部画出来会太乱,因此用一个block代替。这个counter是一个4-bit的二进位计数器,他会从0000-0001-0010-0011-0100-0101-0110-0111......-1110-1111总共16个数,数到15时下一个归0,因此以STM32的配置来说,这个counter的ARR值是16。

最後的的最後再附上一个我用几个基本的IC实作出的counter,这几个IC包括了基本的逻辑闸,另外我想将讯号以七段显示器来显示,因此还有一个二进位转成七段显示器讯号的decoder,这样是不是更像counter了啊https://ithelp.ithome.com.tw/upload/images/20210916/20141525KpMY492E45.jpg

辛苦看到这边的各位,最重要的一件事就是要知道STM32的许多功能都是用一些很简单的逻辑闸来实现,像之前所讲过的推挽输出与开漏输出是透过电晶体,今天讲的计数器是用逻辑闸来实现。至於怎麽实现的就不是很重要罗,至少现在又更懂一点STM32了

资料来源

1.https://www.edntaiwan.com/20210201ta31-implementing-logic-functions-using-only-nand-or-nor-gates/
2.https://www.electronics-tutorials.ws/sequential/seq_4.html


<<:  Extra07 - Jest - 单元测试框架

>>:  【Day19】:PWM输出-模拟类比讯号

ui 框架説明

我比较熟悉的ui是qt的,但是框架类似,下面就分几步讲解,我是如何在一个自动化项目中使用UI的: 首...

[Day 26] 针对View来作测试

验证view的资料 我们也可以针对view来做测试, 透过Laravel提供的测试方法, 我们可以不...

Day 01: ML基础第一步 Python基础入门

前言 Python是一种易於学习且功能强大的程序语言,可以呼叫使用相当完整的标准资料库,我们也称之为...

Day 6 [Python ML] 随机森林(Random Forests)演算法

前言 决策树(DecisionTree)如果leaf太多的话容易overfitting 若leaf太...

[Day10] Flutter GetX flutter_slidable ListView滑动

Flutter slidable Flutter listView左右滑动後出现的选项,(iOS的 ...