這個題目是我臨時想的,不知道是否準確,一直想寫乙個類似的東西,希望能夠引起童鞋們關注硬體並喜歡上硬體。
我是文科出生,研究生階段才轉向計算機,中間有很長一段時間都只做軟體理論相關研究和一些具體的軟體專案,包括編譯器、電力系統監控器、軟體測試工具研發等;直到2023年,才開始陸陸續續接觸一些硬體專案,說是硬體專案,其實主要是一些嵌入式的專案,如世界盃前做的3g轉wifi和自己玩的一些小車和感測器等。
在做嵌入式專案之前,壓根就沒接觸過硬體方面的開發知識,難度可想而知,什麼叫編碼器、什麼叫解碼器、怎麼做分頻、怎麼做倍頻、怎麼做a/d轉換、d/a等等,一系列的問題迎面而來。為了完成專案,只能硬著頭皮上,從最基礎的數字邏輯開始看起,從二進位制、卡諾圖入手,逐漸深入到組合電路和時序電路,再結合一本叫做《計算機組成與設計-硬體/軟體介面》,才逐漸深入明白我們做的編譯器後端的具體工作原理,在此基礎上對軟體的各種效能問題有了更深刻的認識。
組合電路和時序電路是計算機原理的基礎課,組合電路描述的是單一的函式功能,函式輸出只與當前的函式輸入相關;時序電路則引入了時間維度,時序電路在通電的情況下,能夠保持狀態,電路的輸出不僅與當前的輸入有關,而且與前一時刻的電路狀態相關,如我們個人pc中的記憶體和cpu中的暫存器,均為時序電路。
說了這麼多,我們學習的組合電路和時序電路在計算機中又是怎麼一回事呢?為了便於理解,下面以乙個大家都能接受的c語言程式開始,從上層向下層開始解釋。
void main()
這個例子大家都能明白,main函式要做的事情就是實現兩個數的加法操作。這是我們人類的思維方式,但是計算機並不認識,如何讓計算機理解呢?於是,我們需要將上面這個程式翻譯成機器能理解的模樣,這時候就需要借助編譯器(如常見的gcc、msc等)將上面的程式翻譯成mips指令(不同的cpu有不同的指令集,包括x86指令集、mips指令集、sparc指令集等,我們在這裡用mips指令集,咱們的龍芯也是採用mips指令集),如下所示:
addi $t0, 0, 3
# a = 0+3, a儲存在$t0暫存器中, 對應的二進位制**為:0010 00** **** **** **** **** **** ****(這裡的星號*表示二進位制,這裡暫時不關心)
addi $t1, 0, 5
# b = 0+5, b儲存在$t1暫存器中
addi $t2, $t1, $t0
# sum = a + b, sum儲存在$t2暫存器中
到這裡,大家一定還在疑惑,不是說要翻譯成二進位制**嗎?怎麼是mips組合語言?對,就是組合語言,這個組合語言中的每一條指令就對應一條二進位制**,彙編的方式更容易讓人理解。
現在我們得到了計算機可以理解的mips指令(可以想象成可執行程式)了,接下來的問題是如何執行mips指令。
要執行程式,首先必須將可執行程式檔案(從外設)載入到記憶體。可執行檔案載入到記憶體時,作業系統會為每個可執行程式在記憶體中分配四個區:
我們重點關注**區和棧區,初始時,其分布如下圖所示:
其中pc(program counter)是程式計數器(是cpu中的乙個暫存器,具有資料儲存功能),即用來指示下乙個即將執行的指令的位址,本例中,進入main函式後,即將執行的第一條指令是a = 3,其位址為:0x ff ff ff 00, 因此pc指向其對應的彙編**的位址。
cpu根據pc的的值,從指定位址0x ff ff ff 00處獲取指令,然後解析指令,並執行指令(即執行a=3)。
當a = 0執行完畢後,pc執行操作:pc = pc + 4,pc指向0x ff ff ff 04,即b = 5的指令的位址。此時,棧區的狀態為:
接著,cpu根據pc的的值,從指定位址0x ff ff ff 04處獲取指令,然後解析指令,並執行指令(即執行b=5)。當b=5執行完畢後,pc執行操作:pc = pc + 4,pc指向0x ff ff ff 08,即sum=a+b的指令的位址。此時,棧區的狀態為:
然後,cpu根據pc的的值,從指定位址0x ff ff ff 08處獲取指令,然後解析指令,並執行指令(即執行sum=a+b)。當sum=a+b執行完畢後,pc執行操作:pc = pc + 4,pc指向0x ff ff ff 12(因為,指令已經執行完畢,這裡應該提示要從main函式返回)。此時,棧區的狀態為:
至此為止,main函式內部的流程基本上陳述完了(關於函式間呼叫,相對複雜,計算機組成中會詳細講解),但如何實現這些步驟呢,其中的關鍵問題包括如下:
組合電路 時序電路在數位電路中的地位
我是文科出生,研究生階段才轉向計算機,中間有很長一段時間都只做軟體理論相關研究和一些具體的軟體專案,包括編譯器 電力系統監控器 軟體測試工具研發等 直到2009年,才開始陸陸續續接觸一些硬體專案,說是硬體專案,其實主要是一些嵌入式的專案,如世界盃前做的3g轉wifi和自己玩的一些小車和感測器等。在做...
2018 5 7 計算機課作業
1 按金字塔形狀列印楊輝三角形。include int main data i j 1 for i 0 i count line i for j 0 j i j putchar n return 0 2 輸入乙個字串形式的數字,將其轉化為數值輸出 如輸入字串 123 輸出數字123,僅考慮無符號整數...
計算機數位電路實現
以上所說的這些概念性設計的物理實現是多種多樣的。如同我們前述所及,一台儲存程式式計算機既可以是巴比奇的機械式的,也可以是基於數字電子的。但是,數位電路可以通過諸如繼電器之類的電子控制開關來實現使用2進製數的算術和邏輯運算。夏農的 正是向我們展示了如何排列繼電器來組成能夠實現簡單布林運算的邏輯門。其他...