2014年4月9日 星期三

設計 Sequencer 直接驅動 HCTL-2020

自從 1945 年春天 ENIAC 誕生以來,電腦科技快速的滲透至人們的生活中,現在是 2014 年
也就是說電腦的發明才 70 而已,尚不足 100,現代的人們甚至已經拿著功能遠遠超越遠古
電腦的各種移動式嵌入裝置,手指在螢幕前滑個不停,這些嵌入式裝置內的 CPU 功能都是
極端的複雜,而且種類繁多,功能強大,有心學習的人也可以很便宜的買到相關的學習版
例如現在當紅的 ARM 架構,熱門的開發版如 STM32F4-Discovery,這些在以前對一般人
遙不可及的高貴微處理器,現在是唾手可得,這邊就引出了這篇的主題了,新一代的工程
師越來越依賴使用微處理器來完成任務,以寫程式的方式來完成任務,也許是類似驅動
數位的 SPI 介面的慣性單元,驅動 TFT-LCD 螢幕,這邊就出現了一些在下所觀察到的問題
新一代的工程師對微處理器架構掌握程度不夠純熟,往往都需要依附在原廠的某些與需求
類似的 Sample Code 進行修改,最後往往也在一知半解情況下,產品也開發完成了,但是
微處理器架構的掌握度一樣停留在懵懂的階段,這是甚麼原因呢? 主要是新一代的工程師
沒有經歷過電腦架構的演變歷史,新一代的工程師一開始就接觸到這些最複雜的 MCU,當
然在看這些 MCU 的相關文件就不能快速掌握重點,所以本篇就是要來回到古代,在下直接
設計邏輯電路,驅動 HCTL-2020,讓讀者感受一下史前時代的電腦先輩們是怎麼直接就用
邏輯電路達成特定需求,而不依賴寫程式的方式完成目標,後面讀者就會看到,這其實
就是另一種程式設計,直接用硬體的角度在思考問題。

HCTL-2020 是一顆可以直接解 A B Phase 的解碼器,這種解碼器主要應用在光學尺
HCTL-2020 可以直接轉換 A B Phase 並且計數目前的累計值,直接從 8-bit 匯流排輸出目前
所累計的數值,HCTL-2020 其實內部記數是 16-bit,所以它使用一支腳 SEL 來選擇是要
輸出 HI byte 還是 LO byte,圖一是 HCTL-2020 主要會使用到的訊號腳位


圖一 HCTL-2020 主要訊號腳位
這顆會幫我們做 Full 4X Decode
也就是四倍頻

CLK : 根據 Datasheet 中記載,操作在 14 MHz,因此要輸入 14MHz 的頻率
CHA : 這隻腳應該很明顯吧,就是把 A Phase 訊號從這隻腳輸入
CHB : 輸入 B Phase 訊號 
/OE   : Output Enable (Active Low),也就是說拉低的時候,晶片才會動作
SEL  : 選擇到底是要讀取 HI byte 還是 LO byte,只有 /OE 拉低時有效
           SEL=0 表示輸出的 8-bit 為 HI byte,反之則為 LO byte

這種純硬體設計的 AB Phase 驅動 IC 真是介面簡單又原始而且高效能,好了,現在
讀者拿到這顆 IC 後,假如是用 8051 連接的話該怎麼讀取 AB Phase 目前所累加的值呢?


圖二          讀取 HCTL-2020C51 虛擬程式碼
虛擬程式碼 表示程式內有些變數在下沒有明確定義
例如 hbe_flaglbe_flag 在 實際 C51 中可以定義成 bit
還有 SEL 在下也沒指名用哪支 GPIO

從圖二可以知道,在下採用 hbe_flaglbe_flag 作為同步旗標,以確保所讀取到的
HBE 與 LBE 是當下同一個時刻的高低位元,這個圖基本上很好懂,沒甚麼特別的地方
依照 Datasheet 的特性寫程式而已,不過這邊有一點要注意, /OE=0 也就是一般常說
的 Open Device 反之 /OE=1 則為 Close Device,這個觀念在驅動一顆 MCU 的外圍
裝置很常用,有時 /OE 也稱為 /RD,當 Active Low ,使用者可以讀取晶片上的資料
另外有些比較複雜的裝置則有 /CS /WR /RD /INTR,則這種情況 /CS 為 Active Low 才是
晶片的 Open Device,由於 HCTL-2020 為一種只讀的裝置,用 /OE 代表 Open Device
就足夠使用了。

其實圖二這種讓 C51 直接驅動 HCTL-2020 是很沒有效率的作法,這會消耗 MCU 寶貴的
運算資源,讓 MCU 執行效率變的低落,這種驅動外部裝置的程式作法,會使得 MCU 不能
專一執行晶片內可能是主要核心演算法的特殊任務,這種讓 MCU 事必躬親的作法是非常
沒有效率的做法,所以當遇到這種情況的時候, 在 MCU 沒有很快的時代裏面,要加速程式
執行就是把驅動外部裝置這種瑣碎程式變成硬體,而針對特殊裝置設計驅動硬體就稱為

Sequencer 定序器

Sequencer 正是構成各種複雜 ControllerMCU 的基本單元,所謂 Sequencer 就是能夠
發射出驅動特定裝置所要求的時序,而 Controller 又更複雜一些,Controller 可能還會帶有
完整用硬體實現的特殊介面 例如 SPI 介面的 AD 轉換 IC,這種 IC 絕對不可能大費周章的
用一顆有 SPI 介面與 Analog In 的 MCU 來做,成本高又沒效率,裏頭的 SPI 介面就是用很多
不同種類的 Sequencer 直接組合出 SPI 介面,這種特別的 SPI 介面一定是設計成可以直接
就跟前端的 AD 數位類比混訊電路連接,而 MCU 更複雜,MCU 基本上又是一堆 Controller
集合在一起所產生的終極產物,所以可以說 Sequencer 其實就是一種在硬體上直接以時序
的觀點來寫程式,把上面的論述稍微整理一下

 Sequencer         定序器     (簡單) 
 Controller         控制器     (較複雜)
 MCU (or CPU) 微處理器 (複雜度高)

所以現在吾人要將圖二那種軟體驅動 HCTL-2020 的流程改成用硬體實現,MCU 只要直接
讀取 GPIO 就可以擷取到計數資料,驅動裝置的程式邏輯改由硬體直接實現

現在來介紹一下怎麼有系統化的根據硬體的時序設計 Sequencer

剛剛為什麼要給出一支 C51 驅動的虛擬程式碼呢?其實這個就是硬體化的技巧之一
因為這樣就可以看出設計 Sequencer 要有那些額外的訊號,可以看到 SEL 會控制
hbe_flaglbe_flag 是否已經分別從 HI byte 與 LO byte 讀取訊號,最後才進行
16-bit 讀取結果的合成,所以說,在 Sequencer 上面也是一樣的情況,需要有兩支腳
進行高低位元組判斷,一支是 /HBE 另外一支是 /LBE,也就是說這個特殊的 Sequencer
必須要有能力用時序將 SEL 訊號分裂成 /HBE 與 /LBE 訊號,讓同步器可以在最終
輸出資料的時候,保證 HI & LO bytes 皆抵達同步器的匯流排,輸出端直接以 16-bit 的形式
輸出資料,MCU 只要準備好兩支 8-bit GPIO 直接接收結果即可,不用理會如何驅動外設的
方法,這樣 就把 驅動外部裝置的工作,交給了外部硬體實現,MCU 可以更專心的執行主要
工作,我們先看看硬體化後的方塊圖:


圖三 直接用 Sequencer 直接驅動 HCTL-2020 方塊圖

讓在下先講 Synchronizer (同步器),同步器比較簡單,其實就是利用 D Flip-Flop 的特性做
栓鎖,以保存高低位元組為一對,等兩組訊號都到了,從 Dout 直接輸出 16-bit 計數值

Synchronizer (同步器) (用74HCT373構成)


由於先讀 高位元組 後讀 低位元組,因此要把先到達的高位元組資料擋住,等到 /LBE 訊號
觸發後,高低位元同步直接輸出至 Dout[15:0],373 具有保留資料的資料的特性,只有當
LE (Latch Enable) 是 HI 的時候,資料才會被更新至輸出端,HI-To-LO 至維持 LO 的時候
不論輸入端如何變化,輸出端總是維持最後設定的值,這樣就達成了資料保持的目的
這種特性就能夠用來對付像這種分段讀值的 IC,373 到現在於離散的邏輯電路中還是用很多

Sequencer (定序器)

當讀者看到一個定序器使用的設計原理時,就會恍然大悟,除頻器 存在的意義 其實就代表
就代表可以在硬體上表達與時間有關係的順序邏輯,因為硬體天生就是平行架構,除頻器
存在的意義就是可以將平行架構下表達跟時間前後次序有關的事件,為了方便解說,吾人
先將最後的 Sequencer 設計結果貼上:


讀者可以看到,邏輯電路裡面有一顆 74HC193,這個就是一顆 4-bit 計數器,計數器其實
就是一種除頻器,怎麼講呢?當 CLK 從 CP_U 輸入時,193 的腳位 Q0 Q1 Q2 其實就分別是

Q0 = CLK/2
Q1 = CLK/4
Q2 = CLK/8

可以從模擬的時序圖驗證:


圖四 Q0 Q1 Q2 與 CLK 時序圖

利用除頻器,就可以很巧妙的在硬體架構中,構造出與時間有關的順序事件,怎麼講呢?
Q2 是 CLK/8 頻率最慢,這就相當於在程式裡面 最外層的條件敘述句,Q1 的頻率比 Q2 頻率快,這個就類似程式內一層的條件敘述句,可以依此類推

if(...) then ...          ; Q2 頻率所表達的條件
   if(...) then ...       ; Q1 頻率所表達的條件
      if(...) then ...    ; Q0 頻率所表達的條件

所以就可以在硬體上表達出跟時間執行順序有關的真值表

圖五 利用除頻技巧製造出 Q2 Q1 Q0 
排列出四種與時間先後次序有關的執行狀態


所以最終的結果就是圖六,真值表的狀態將不斷的循環

圖六 直接由 Sequencer 不斷循環狀態讀取 HCTL-2020 的過程,要特別注意
硬體由於可以同步觸發多個事件,當 Enable LO byte From HCTL-2020 狀態
產生時,Synchronizer也一起將高低位元組由 Dout[15:0] 送出給 MCU

從圖六可以知道,用 Sequencer 直接驅動 HCTL-2020 的結果只需要 4 個 cycles,後面會有
沒用到時間狀態一共 4 個 cycles,可以視為轉換完後一段 Idle 的時間,剛好讓晶片有趁
還未更新值之前可以讀取當前 HCTL-2020 的輸出值。 這就是用硬體的好處,明顯,高效
執行效率是可測,沒有多餘的包袱。

採用 Sequencer 的最終結果

C51 端的程式將會變得很簡單,假設 P1 連接 D[0:7],P3 連接 D[8:15]
則讀取程式變成

P1 = P3= 0xff
usCurrentCnt = P3; usCurrentCnt <<= 8;
unsigned short usCurrentCnt |= P1;

MCU 上讀取 HCTL-2020 變得沒有負擔,只是簡單的存取 GPIO,其他瑣碎的 HCTL-2020
操作交給 Sequencer 去處理,假如讀者背景是 CPLD 或是 FPGA 的專長大概也發現了,由於
在下是用很純 74 系列這種最古老的手法去組合出 Sequencer,那個邏輯電路對現在的
CPLD 和 FPGA 實在太簡單了,不用幾分鐘就可以移到 CPLD 或 FPGA 實現,這種電路
正是一切 MCU 或 Controller 的原理,熟悉 VHDL 的人可能幾分鐘就可以寫出來,因為硬體
描述語言可以直接處理 " 狀態 " 這種真值表格,不過讀者可以看到,你想用 74 系列完成
圖五那張真值表,就不是這麼容易了。各位可以看到 Sequencer 簡單到直接針對某 IC 的
時序進行驅動,那到底能不能認定它也是一種 MCU 或 Controller 呢?因為實際上那個
時序邏輯的工作其實根本就跟 圖二 裡面的程式邏輯一樣啊,這個就得要看讀者是怎麼去
認定了,這篇文章主要讓讀者認識針對特定 IC 時序設計 Sequencer 直接驅動 IC 的手法
降低 CPU 的程式負載。許多高級 MCU 或 Controller 脫去它們神秘的外衣基本上就是
一大堆 不同種類的 Sequencer 組合,也就是 在甚麼時間點,要同時做哪些事情,這就
是硬體的特性

後記:
由於整篇文章內容採用的工具 LTspice 進行數位電路模擬與設計,這種方法是比較
少見,這是吾人自己的習慣,所以我並不打算解釋在 LTspice 內怎麼做像本文內的
數位模擬,以及還要建構哪些元件,因為我不想讓文章變成 LTspice 數位模擬教學
在 LTspice 進行數位電路設計是比較麻煩的工作,有些特別的元件得要用 SPICE 自己
寫才有,就像我把電壓時間圖當邏輯時序圖那個 LOGICVIEW 元件就得需要寫 SPICE
自己建構,LTspice 許多詳細的使用方法也許讀者自己看 LTwiki 會比較清楚


沒有留言:

張貼留言