翻閱了一些關于數電教材,說實話,對一個有着十幾年研發經驗的老工程師我來講,最大的感覺是 - 看着暈、吃力,雖然每本書都試圖講清楚每一個知識點的作用和前、後文的關聯,但作為一個被各種新概念和邏輯公式繞暈的讀者,确實已經無法get到這些點,進而理清楚由這些點構成的知識圖譜。
好在我從最初的二進制、各種門、布爾邏輯、卡諾圖到編碼/譯碼,已經學習完組合邏輯部分的内容,靜下心來理出了些許的頭緒,作為總結把這些點點滴滴的知識梳理一下,嘗試着用下面的這幅圖表達表達:
暫不管後面的時序邏輯,在這張圖裡,組合邏輯位于頂層,各種教材裡基本上都作為重點講述的一些邏輯功能 - 加法器、譯碼器等其實都是組合邏輯的一些典型案例而已,因為它們在某個年代因為是比較常用的數字功能塊,被做成了專用的中等規模(被稱之為MSI)的集成電路産品,比如74系列、CD4000系列中都有,做成專用的集成電路從實現的角度可以保證更高的可靠性、最佳的性能。
産業的發展,這些獨立的功能模塊IC已經很少被使用,當今一顆最小規模的FPGA就可以勝過幾十個各種MSI模塊的組合,而且更靈活、性價比高。它們當前存在的主要使命是用在教材裡,用在有些實驗室的實驗平台裡。
我們要加強的,就是要理解這些被重點強調的功能模塊的實際應用場景,以及它們代表的一類産品的結構特點。
按照組合邏輯的定義,當前的2個或多個邏輯輸入通過某種邏輯功能得到需要的邏輯輸出,而這個輸出隻依賴于當前的輸入。邏輯門是構成組合邏輯的基礎,組合邏輯包括了以下3個部分:
- 輸入變量,二進制,要麼是0,要麼是1,比如說有n個輸入變量;
- 多個邏輯門構成的布爾邏輯;
- 輸出變量,可以是多個,比如m個
在所有的教材裡,講述完“門”,緊接着就是一系列比數學公式還要抽象的布爾邏輯公式以及像極了數獨遊戲的卡諾圖。多數的作業題都是給你一個用各種門構成的電路,讓你進行“邏輯化簡”;或者給你一個真值表,讓你做”邏輯分析”,即便化簡完、分析完,你面對的還是一個由多個門組成的電路圖,其實還是不知道它們是用來做什麼的。
到這裡我基本上弄明白我為啥會“暈”的原因,因為我不知道自己所學的東西、所做的東西到底都是做什麼用的?我在生活中如何會用到這些知識來解決問題?
這些教材試圖讓我提升的能力:根據一系列抽象的公式和工具,對一系列抽象的圖做抽象的“簡化”和“分析”。
這些,在今天這個時代實際上已經嚴重不合适,因為這方面的能力對于大多數人幾乎無用武之地 - 我們要分析的對象已經被海量門陣列的FPGA代替,我們做的事情,EDA工具轉瞬就幫我們實現,永遠不再需要我們插手。
對于90%以上的同學,我們真正需要的能力其實是邏輯“表達”的能力,也就是對生活中、研發中遇到的任何一件事情,都能夠把這件事情用數字邏輯的方式表達清楚,比如将要處理的事情分解成:
- 哪幾個輸入變量 - 有哪幾種因素起作用?
- 哪幾個輸出變量 - 會得到哪幾種結果?
- 輸入變量和輸出變量之間千絲萬縷的關系是什麼?
正确地分解成這三個部分,你完全可以借助EDA工具,無論是Verilog、VHDL甚至更高級的語言,都可以幫你完成您需要的邏輯。
即便從學習的角度,需要你去做底層的邏輯設計(IC設計)、需要你做邏輯化簡和邏輯分析,正确的邏輯表達也是第一位的,因為它是解決一切應用的起點。
而這點,恰恰是我們衆多的教材中欠缺的。
所以“組合邏輯”設計的邏輯應該是這麼一個流程:
- 确定輸入變量和輸出變量的個數
- 将輸入和輸出變量都用字母表示
- 将輸入和輸出變量的關系描述出來
- 構建能夠表達上述輸入輸出關系的真值表
- 獲取針對每一個輸出變量與輸入變量之間關系的布爾表達式
- 簡化針對不同輸出變量的布爾表達式
- 基于簡化的波爾表達式構建邏輯框圖
可以采用多種不同的簡化技巧以最小化布爾表達式,目的是減少門數,進而降低成本。這些技巧包括布爾算數理論、卡諾圖化簡,從硬件實現的角度,實現如下的目标:
- 盡可能少的門數,最少數量的輸入
- 門和門之間的連接要盡可能少,傳輸時間盡可能短
如果基于以上的流程來理解教程中的知識點,就可以自上而下地理順了它們之間的定位和關聯,整個知識體系也就順理成章了。
後面幾節的内容,我們就來看看幾種典型功能模塊案例的實現方式,從原理圖到用FPGA來驗證。
,