National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 72 24°C PM2.5 13
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 08

暫存器與計數器

很多個正反器一起動:存數字、數數、移位
Interaction 30 minute(s)

Learning Objectives

  • 用 D 正反器加多工器回授,做出可以選擇載入或保持的暫存器
  • 接出 4 位元同步計數器,推導每一位的 D 算式
  • 從波形說明漣波計數器的過渡值,以及它造成的問題
  • 用移位暫存器做序列傳輸,說明除頻的關係

正反器每個上升緣都會更新

上一課的 D 正反器能存一個位元,但它有個麻煩:每個上升緣都會取樣 D。你希望保留一個分數,時脈卻不會停,下一拍它就被當時 D 上的值蓋掉了。

直覺的做法是把時脈關掉:不想更新時就別讓這顆正反器收到時脈。這叫閘控時脈(clock gating),真實晶片會用,但要小心處理:時脈多經過一個閘就多一段延遲,這顆正反器會比別人晚一點收到上升緣,閘的輸入一變動還可能多出一個假的時脈。入門設計一律讓所有正反器收同一個時脈。

那要怎麼「不更新」?讓它每一拍都取樣自己現在的值就好。D 前面放一個 MUX2:

LOAD=1:D ← 外面的資料(載入)
LOAD=0:D ← 自己的 Q(保持)

這樣時脈照跑,存的值不會變。把 4 組這樣的電路接同一個 LOAD、同一個時脈,就是一個 4 位元暫存器(register)。後面會看到,CPU 裡存運算結果的就是這種東西。

模擬器的顏色與延遲。 綠色是 1、灰色是 0、紅色是未知(x),開機還沒取樣過的正反器就是未知。延遲是整數個單位,不是真實的奈秒。

互動練習:可以載入的暫存器,再改成移位暫存器

D0~D3 已經接到多工器的 D1,MUX 的輸出也接到正反器的 D 了。少的是「LOAD=0 時要選什麼」。電路比較大,手機上用下方的接線選單比較好操作;F0 是最低位。

移位暫存器與序列傳輸

剛才你只改了 4 條線,同一批零件就從「存數字」變成「排隊往前走」。為什麼這些位元不會在一個上升緣之內一路穿到最後?因為正反器的 Q 要過一個延遲才變,同一個上升緣時,每一級取樣到的都是前一級還沒變的舊值。上一課的栓鎖做不到這件事,它在透明期間會讓資料直接穿過去。

這正是序列傳輸(serial transmission)的硬體:傳送端把一個位元組裝進移位暫存器,一個時脈送出一位元,只要一條資料線;接收端再用另一個移位暫存器收回來。USB 的 S 就是 Serial。代價是一次只傳一位元,要靠更高的時脈把速度補回來。

同步計數器:每一位什麼時候該翻

計數器是每個上升緣加 1 的暫存器。可以用完整的加法器做,但觀察二進位數數的規律,可以少用很多閘:

值 Q3 Q2 Q1 Q0
3 0 0 1 1
4 0 1 0 0
7 0 1 1 1
8 1 0 0 0
  • Q0 每一拍都翻。
  • Q1 在 Q0=1 時才翻。
  • Q2 在 Q0 和 Q1 都是 1 時才翻。
  • Q3 在 Q0、Q1、Q2 都是 1 時才翻。

「條件成立時翻,否則不變」就是 XOR:A ⊕ 1 = A′、A ⊕ 0 = A。所以:

D0 = Q0′
D1 = Q1 ⊕ Q0
D2 = Q2 ⊕ (Q0·Q1)
D3 = Q3 ⊕ (Q0·Q1·Q2)

每一位都接同一個時脈,所以叫同步計數器(synchronous counter):所有的位元在同一個上升緣一起變。

互動練習:接一個 4 位元同步計數器

算式裡的 Q0 就是 F0 的輸出 Q,以此類推。時脈要你自己接,其他的重設線、顯示器都接好了。右邊的 AND3 接成「值=4」的偵測器(Q2·Q1′·Q0′),它等一下會派上用場。AND 可以串接:Q0·Q1·Q2 等於 (Q0·Q1)·Q2,所以 3 個 XOR、2 個 AND 就夠了。

漣波計數器:更省,但有過渡值

還有一種更省的接法,完全不用 XOR 與 AND:每個正反器的 D 接自己的 Qn,每拍翻一次,時脈則接前一級的輸出。F0 每拍翻一次,F0 的 Qn 上升時 F1 翻,F1 的 Qn 上升時 F2 翻。這叫漣波計數器(ripple counter),進位像漣漪一樣一級一級傳過去。

看起來很划算,問題是每一級都晚前一級一個延遲。模擬裡從 7 變到 8 的過程是:

7 → 6 → 4 → 0 → 8

每個箭頭相隔 1 個延遲單位。最高位要到上升緣之後第 4 個單位才變;同步計數器全部位元都在第 1 個單位一起變。位元數越多差距越大,而且接在後面的電路會讀到這些不存在的數字。

互動練習:接漣波計數器,抓出過渡值

D 都接好自己的 Qn,同樣有「值=4」的偵測器。CLK 已經接到 F0。你要決定後面每一級的時脈接什麼:是前一級的 Q,還是 Qn?可以兩種都試,看顯示器往哪個方向數。

每一位的頻率:除頻

用 Python 照上面的 D 算式走 16 拍,驗證真的在數數,順便數每一位翻了幾次。注意最後印出來的次數有什麼規律。

計數器就是除頻器

翻兩次才回到原值,所以翻 16 次的 Q0 跑了 8 個週期,翻 2 次的 Q3 只跑了 1 個週期。把時脈的頻率記作 f:

位元 每幾個時脈週期回到原值 頻率
Q0 2 f ÷ 2
Q1 4 f ÷ 4
Q2 8 f ÷ 8
Q3 16 f ÷ 16

晶片裡常有一個很快的主時脈,慢的周邊電路就是這樣得到自己需要的時脈:接一個計數器,取其中一位。這叫除頻(frequency division)。

確認一下

1.

4 位元暫存器的 LOAD=0,D 開關不停地變,時脈照跑。暫存器的內容會怎樣?

2.

要做 5 位元同步計數器,最高位 D4 的算式是什麼?

3.

漣波計數器從 3 變到 4,中間會經過哪些值?

第 1 次作答

再想一下

1.

時脈是 8 MHz,同步計數器 Q2 的頻率是多少?

2.

把移位暫存器的 4 個 D 正反器換成 4 個 D 栓鎖(致能都接 CLK),CLK=1 的時候會發生什麼事?

3.

同樣數到 16,漣波計數器比同步計數器省閘。什麼情況下還可以考慮用漣波?

第 1 次作答

重點整理

  • 暫存器是多個 D 正反器共用時脈,多工器選「載入」或「保持自己」。
  • 同步計數器的每一位用 XOR 決定要不要翻,所有位元同時變。
  • 漣波計數器用前一級的 Qn 當時脈,省閘,但輸出會經過過渡值,位元越多延遲越長。
  • 移位暫存器讓位元一拍走一格,一條線就能傳資料。
  • 計數器的每一位都是一次除頻。

暫存器存狀態,下一課讓狀態自己決定下一步要做什麼:有限狀態機。

這一課完成了!
Next lesson:有限狀態機
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。