iT邦幫忙

2021 iThome 鐵人賽

0
Arm Platforms

STM32 基礎入門教學系列 第 16

【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


上一篇
【Day15】:STM32輾壓Arduino的功能—TIM(下)
下一篇
【Day17】:STM32系統時鐘配置(上)
系列文
STM32 基礎入門教學30

尚未有邦友留言

立即登入留言