單片機(jī)是將中央處理單元(CPU)、儲(chǔ)存器、輸入輸出集成在一片芯片上,可以說單片機(jī)就是一臺(tái)微型計(jì)算機(jī),只是和我們平常使用的計(jì)算機(jī)相比它的功能有所不同,也沒有我們用的計(jì)算機(jī)那樣強(qiáng)大。
計(jì)算機(jī)可以運(yùn)行一個(gè)個(gè)應(yīng)用,單片機(jī)可以按照工程師的編寫可執(zhí)行文件,實(shí)現(xiàn)各種各樣的功能。那么,單片機(jī)是怎么知道要執(zhí)行什么指令,做什么動(dòng)作呢,我們的指令又是怎么被單片機(jī)識(shí)別呢?了解這個(gè)過程,可以加深對單片機(jī)的理解。
CPU
首先要從CPU的組成說起,CPU是由晶體管組成的,這些晶體管是一種半導(dǎo)體器件,比如二極管就是最為常見的半導(dǎo)體器件。電流只能從正極流向負(fù)極,反向則截止。
晶體管通過各種組合方式構(gòu)成門電路:與門,或門,非門,異或門等。門電路又稱為邏輯門,是數(shù)字電路的基礎(chǔ),常見門電路,及其真值表:
我們了解下與門電路:
與門電路可以想象為兩個(gè)串聯(lián)開關(guān)控制一個(gè)燈泡,只有同時(shí)閉合兩個(gè)開關(guān),燈泡才會(huì)被點(diǎn)亮。開關(guān)表示晶體管的導(dǎo)通與截止,燈泡的點(diǎn)亮與熄滅表示電路輸出的高低電平。
其他門電路也是由各種晶體管構(gòu)成,不同的輸入,有不同的輸出,構(gòu)成各種功能。各種門電路通過復(fù)雜的組合就成了CPU了。然后用CPU完成各種復(fù)雜計(jì)算的。
加法器
有了CPU,我們用它來算一道小學(xué)生算術(shù)題1+1=2,看看它是怎么計(jì)算的,從一個(gè)簡單加法器開始,加法器由半加器組成。
半加器
半加器由一個(gè)與門和異或門構(gòu)成。不考慮低位進(jìn)位來的進(jìn)位值,只有兩個(gè)輸入,兩個(gè)輸出。
1+1=2,2在二進(jìn)制中表示為0010。在半加器中:異或門輸入不同的電平(不是同時(shí)高或低),輸出為高,也就是1+0或0+1,輸出1,當(dāng)兩個(gè)都輸入為1輸出為0,與門則輸出為1,也就是進(jìn)位。可以把它抽象成一個(gè)黑盒子:
全加器
用兩個(gè)半加器可以組成一個(gè)全加器:
當(dāng)多位數(shù)相加時(shí),半加器可用于最低位求和,并給出進(jìn)位數(shù)。第二位的相加有兩個(gè)待加數(shù)(B和進(jìn)位CO),還有一個(gè)來自前面低位送來的進(jìn)位數(shù) (A)。這三個(gè)數(shù)相加,得出本位和數(shù)(全加和數(shù))和進(jìn)位數(shù)。同樣可以把它抽象出來:
這個(gè)黑盒子就是一個(gè)函數(shù),輸入兩個(gè)加數(shù),相加運(yùn)算,輸出和數(shù)。
如果要計(jì)算多位數(shù)的相加,則需要多個(gè)全加器以及其他門電路,組合出更復(fù)雜的加法器。減法的運(yùn)算可以用加法來分解:
減法:10 - 5 = 10 +(-5),須通過反碼,補(bǔ)碼等操作。
其他運(yùn)算器也有相關(guān)的門電路來組成,有關(guān)知識(shí)這里不展開。
從加法器我們不難得出,CPU的運(yùn)算是各種門電路的高低電平的輸入和輸出,高電平為1,低電平為0,把我們平常的十進(jìn)制數(shù)字轉(zhuǎn)成二進(jìn)制數(shù)輸入,輸出二進(jìn)制數(shù)。
兩個(gè)數(shù)字相加用全加器的組合來完成,如果是多個(gè)數(shù)字的相加呢?比如1+2+3+4+5+……+100,該怎么完成呢?
按照我們的計(jì)算過程來看這個(gè)問題,我們先把前兩個(gè)數(shù)拿出來相加,得到的和再和第三個(gè)數(shù)相加,依次累加到100,轉(zhuǎn)換到單片機(jī)來完成,那就要把所有的相加數(shù)放到一個(gè)存儲(chǔ)器中,以便在每次的相加中取出,還要把每次相加的和數(shù)保存起來用到下一次的相加,這就用到了寄存器了。
寄存器-1保存1-100的數(shù)字,寄存器-2保存每次的相加結(jié)果。計(jì)算1-100的相加,寄存器-2的初始值為0,依次取出寄存器-1的數(shù)字和寄存器-2的結(jié)果相加:
1+0=1,
2+1=3,
3+3=6,
4+6=10……
鎖存器
但是寄存器是怎么幫我們保存數(shù)據(jù)的呢?這就要鎖存器(Latch)來幫助了,兩個(gè)或非門組成了一個(gè)最簡單的鎖存器。
簡單的說,這個(gè)單元記住了之前S端的輸入1,直到我們把R端設(shè)為1,輸出端Q才變回0。
然后在這個(gè)簡單鎖存器加上控制端G和一個(gè)輸入端D就變成了D鎖存器:
它有兩個(gè)輸入端,分別是一個(gè)信號(hào)控制G,一個(gè)輸入數(shù)據(jù)信號(hào)D,一個(gè)輸出Q。它的功能就是在G有效的時(shí)候把D的值傳給Q,也就是鎖存的過程。
觸發(fā)器
把兩個(gè)D鎖存器結(jié)合到一起就成了D觸發(fā)器(DATA flip-flop)。觸發(fā)器也叫雙穩(wěn)態(tài)門,又稱雙穩(wěn)態(tài)觸發(fā)器,是一種可以在兩種狀態(tài)下運(yùn)行的數(shù)字邏輯電路。
觸發(fā)器一直保持它們的狀態(tài),直到它們收到輸入脈沖,又稱為觸發(fā)。常見的觸發(fā)器包括:RS 觸發(fā)器、D 觸發(fā)器和 JK觸發(fā)器等,其中D觸發(fā)器最為常用。
當(dāng)鎖存器-1控制G為有效信號(hào)時(shí),D的輸入傳到到鎖存器-2的輸入,但是此時(shí)鎖存器-2的控制信號(hào)不是有效的,所以鎖存器-2的輸出Q沒有改變;當(dāng)鎖存器-1的控制G變?yōu)闊o效,鎖存器-2的控制信號(hào)變?yōu)橛行Вi存器-2的輸出Q就改變了,也就是觸發(fā)器的D輸入傳到了Q,并且D沒有輸入就一直不變。
時(shí)序電路
我們再來看看1—100的累加過程,如果寄存器-1和寄存器-2的存儲(chǔ)速度不一樣,或者運(yùn)算單元取數(shù)不協(xié)調(diào),也就是寄存器-2沒來得及存儲(chǔ),或者寄存器-1還沒取出下一個(gè)參與運(yùn)算的數(shù)字,則此次的運(yùn)算就會(huì)就會(huì)出錯(cuò),又會(huì)影響到下一次的運(yùn)算,這個(gè)影響會(huì)無限放大到之后的結(jié)果,并且單片機(jī)還有很多外設(shè)需要同步運(yùn)行,這時(shí)就需要一個(gè)統(tǒng)一指揮來同步各個(gè)部分的行動(dòng),什么時(shí)候該做什么,做到哪一步了。
這個(gè)指揮就是時(shí)鐘。時(shí)鐘電路產(chǎn)生脈沖信號(hào)給電路,可以認(rèn)為給一次脈沖信號(hào),單片機(jī)各個(gè)部位就動(dòng)一下,電路就刷新一下,這就做到了行動(dòng)統(tǒng)一。前面的D鎖存器,D觸發(fā)器G輸入端就是時(shí)鐘脈沖信號(hào)輸入,控制G輸入信號(hào),進(jìn)而控制Q的輸出,或者記住Q值。這是內(nèi)存最初的樣子。
到此,我們知道了寄存器就是一種時(shí)序邏輯電路,但這種時(shí)序邏輯電路只包含存儲(chǔ)電路。寄存器的存儲(chǔ)電路是由鎖存器或觸發(fā)器構(gòu)成的,用來暫時(shí)存放參與運(yùn)算的數(shù)據(jù)和運(yùn)算結(jié)果。
一個(gè)鎖存器或觸發(fā)器能存儲(chǔ)1位二進(jìn)制數(shù),所以由N個(gè)鎖存器或觸發(fā)器可以構(gòu)成N位寄存器,一般有8位寄存器、16位寄存器等。它被廣泛的用于各類數(shù)字系統(tǒng)和計(jì)算機(jī)中。
運(yùn)行程序
有了前面的鋪墊,我們來分析一下,代碼從是怎么被單片機(jī)識(shí)別的,并轉(zhuǎn)換成功能輸出的。
首先工程師把代碼邏輯寫好,再編譯成單片機(jī)的可執(zhí)行程序,這個(gè)可執(zhí)行程序?qū)嶋H上就是變成由0,1組成的按一定規(guī)律排列好的二進(jìn)制數(shù),再用燒錄器寫進(jìn)單片機(jī)。
單片機(jī)內(nèi)部就是由我們前面學(xué)的門電路的各種組合,門電路也由半導(dǎo)體器件構(gòu)成,這些半導(dǎo)體PN結(jié)是一種特殊的熔絲。空白的單片機(jī)內(nèi)部是矩陣排列的熔絲,在燒錄過程,程序中0的地方就熔斷,1的地方就導(dǎo)通。燒錄好之后,單片機(jī)就有了邏輯功能。
執(zhí)行程序過程:從程序存儲(chǔ)區(qū)讀取程序指令——分析指令——執(zhí)行指令。
讀取指令:就是根據(jù)程序計(jì)算器(PC)的地址取出相應(yīng)的指令,送到指令寄存器。
分析指令:將指令寄存器中的指令操作碼取出后進(jìn)行譯碼,分析其指令性質(zhì)。如指令是我們之前的加法運(yùn)算中的取加數(shù),則尋找加數(shù)的地址。
執(zhí)行指令:無非是把一條二進(jìn)制代碼,轉(zhuǎn)換成數(shù)字信號(hào)(高低電平),操作邏輯門電路,就像我們的加法器一樣輸入輸出。把經(jīng)過邏輯門運(yùn)算的結(jié)果輸出,把單片機(jī)的相關(guān)引腳電平輸出高或低。
也就是單片機(jī)上電開機(jī),單片機(jī)處于初始狀態(tài),可以認(rèn)為初始狀態(tài)中程序計(jì)算器(PC)就有了第一個(gè)指令地址,在時(shí)序電路作用下,送到指令寄存器,分析指令,執(zhí)行指令,輸出功能,如此循環(huán)。單片機(jī)就這樣自動(dòng)進(jìn)入執(zhí)行程序過程。
當(dāng)然單片機(jī)運(yùn)行的過程是很復(fù)雜的,這里只是個(gè)人簡單的理解,總結(jié)。
從晶體管組合成邏輯電路,邏輯電路組合成單片機(jī),再從單片機(jī)在到現(xiàn)在的計(jì)算機(jī),超級(jí)計(jì)算機(jī),是一個(gè)不斷積累,不停進(jìn)步的過程。想要你的人生也是這樣的精彩過程嗎,找我領(lǐng)取資料,開啟與導(dǎo)師的一對一互動(dòng),進(jìn)入高階學(xué)習(xí),成就精彩人生。
評論