數字邏輯層
計算機體系結構的學習,對做嵌入式開發很有作用,它可以讓你層次化理解你所用的開發板的相關細節。本文介紹計算機體系結構中的最底層——數字邏輯層。
數字邏輯層是純硬件實現層,學習本文也可爲後續學習硬件-模電相關知識鞏固基礎。
本文分析過程完全參考《計算機組成-結構化方法》,時間充裕的讀者推薦閱讀原文。此書行文邏輯是從最基礎的數電概念出發,一步一步搭建複雜系統,本文主要分析這種思路。很多數電的基礎概念不會過多闡述。
1、門與布爾代數
本節讀者要能回答以下問題:
- 基本的邏輯門有哪些?簡述工作機理?爲什麼它們是最基本的?
- 如何利用布爾函數進行組合邏輯電路的結構化設計過程?
邏輯門
邏輯門就是用高低電平表示0、1兩個邏輯值的電路,最簡答的三個門電路如下:(工作機理略,自行閱讀基本的模電知識)
由這幾個基本邏輯門可以組合成更多形態的邏輯門,例如多輸入與非/或非門、與/非門。
布爾代數
描述邏輯門輸入、輸出之間的函數,有真值表與布爾函數兩種表示方法。由布爾代數設計相應組合邏輯電路的結構化方法如下
這種結構化設計方法的好處是快、缺點是存在冗餘設計。減少冗餘設計的手段是化簡布爾代數(利用卡諾圖化簡,本文不涉及),但這會破壞結構化設計的思想。
2、基本數字邏輯電路
本節讀者要能回答以下問題:
- 多路選擇器?譯碼器?比較器?移位器?加法器?
- 算術邏輯單元的組成?
多路選擇器
從兩個角度認識多路選擇器:
- 將ABC看成使能端,激活某一個輸入端信號傳輸至輸出端
- 將D0-D7看成使能端,實現不同ABC輸入信號的組合,從這個角度,8路選擇器可以實現任意三輸入的布爾函數。
譯碼器
輸入量的任意布爾組合只有一個輸出迴路會被激活。n位地址線可以譯碼出2n個地址。
比較器
移位器
如何構成兩位移位器:
- 一級結構,則改動輸出線的連接
- 二級結構,再縱向串入一個1位移位器
如何構成任意位移位器,例如8位任意移位
- 串聯8個移位器可以麼?只能實現右移/左移8、6、4、2、0位,並且數據會丟失
- 一種不夠精巧的設計,1-8位的都設計出來,然後通過譯碼器選擇哪個工作。
加法器
1位半加器、全加器的電路圖如上,如何組成多位加法器呢,例如16位加法器?
- 縱向並連16個全加器,缺點很明顯,高位的加法計算受到低位的進位信號影響,速度受限。(行波進位加法器)
- 低八位用一串加法器計算,高八位根據進位信號的不同有兩串加法器同時計算,再根據第八位計算出來的進位結果,選擇合適的高八位進位結果,這樣速度大大加快。(進位選擇加法器)
算術邏輯部件(ALU)
將上文各電路組合起來,形成了上圖所示的1位算術邏輯單元,它可以根據使能信號(控制字節)選擇不同的計算功能,輸出相應的輸出結果。
時鐘
延時環節結構是怎麼樣的:兩個非門就構成了一個延時環節
3、內存
本節讀者要能回答以下問題:
- 鎖存器?觸發器?寄存器?
- 如何構成內存?內存芯片的結構?RAM和ROM的區別?
鎖存器
- SR鎖存器
鎖存器,顧名思義鎖存住信息,在新的輸入信號進入之前,將以前的信號鎖存住。
- 時鐘SR鎖存器
一個實際點的鎖存器,只有在有時鐘信號的時候,才能對輸入信號進行鎖存。
- 時鐘D鎖存器
SR鎖存器如果SR輸入端同時爲1,會造成競爭風險,要避免這種情況出現
觸發器
觸發器和鎖存器的區別如下:觸發器用的是邊沿觸發、鎖存器用的是電平觸發。實現邊沿觸發的方式是在時鐘信號的上升沿/下降沿產生一個很短的脈衝
由脈衝發生器可以構成觸發器,D觸發器如下所示:
總結D觸發器、鎖存器的符號
寄存器
多個觸發器組合在一起構成寄存器,8位寄存器電路結構如下:
內存組成
對寄存器加上地址的概念構成內存
內存芯片
4M位內存的兩種組織方式如下所示:
- 第一種與上文描述一致,512K個地址,每個地址對應一個8位的寄存器。
- 第二種爲尋兩次地址,先從2048個行地址選出,再從2048個列地址選出,定位到一個一位寄存器。
RAM和ROM
RAM可分爲靜態RAM和動態RAM。
- 靜態RAM用的是類似前文介紹的D觸發器的電路,只要不掉電數據可以一直保存。SRAM訪問速度很快,一般用作高速緩存
- 動態RAM用二極管、電容組成存儲單元,由於電荷會泄露,DRAM每一位需要每隔幾十毫秒刷新一次,但由於容量大、存儲密度高,一般用作主存。
RAM不是唯一的內存芯片,在嵌入式應用中,要求內存中的程序和數據在斷電情況下也能保存,這種需求導致了ROM的發展。EPROM、EEPROM、FLASH
4、CPU芯片
- 總線控制信號:CPU用這些信號控制別的部件
- 中斷信號:由外設請求CPU響應
- 總線仲裁信號:防止多外設訪問總線,造成衝突
5、總線
RS232/485、CAN、SPI、IIC、UART、PCIe,瞭解相關協議
6、多內存時地址映射問題
一個完整的系統有多個存儲單元,每個存儲單元都有一套地址,怎麼把它們的地址統一起來呢?
- 地址總線多擴幾條作爲多個芯片的片選信號即可 。
- 同時把IO設備也看成內存一部分(內存映射輸入/輸出)
兩種片選方式:
- 本模塊數據線以外的全部線作爲片選信號(全地址譯碼)
- 統計所有模塊個數,按照譯碼器的思想選擇最少的總線根數作爲片選信號(部分地址譯碼)
部分地址譯碼意味着多個虛擬地址對應了實際地址,原因很好理解:沒有用到的非片選非地址線的0、1狀態不影響片選效果。這會大量佔用內存空間,應該避免使用。