cpu那麼多晶體管組成的門電路代表不同的邏輯,那麼輸入的代碼是怎樣找到確定的邏輯的?
比如輸入1+1是怎樣觸發cpu中的運算器而不是其他是或非和他們組成的更複雜的電路。。怎樣從幾億個晶體管組成的電路邏輯中找到確定邏輯並運行呢。
你需要學習指令集架構設計和基本的解碼器電路原理。
CPU是有一定結構的,通常具有多個階段:如經典的MIPS五級流水線,包含取指、解碼、執行、訪存、回寫五個階段。
計算機程序在編譯後會被轉換成CPU可識別的二進位代碼,這些代碼在取指階段被從指令存儲器輸入至CPU內部;在解碼階段判斷分析指令功能,選擇數據通路;在執行階段進行邏輯或數學運算;訪存階段讀寫內存;回寫階段將運算結果進行保存。
從電路層面來說,CPU的階段間採用觸發器相連,而在每部分內部則是大量的組合邏輯,組合邏輯可以設計實現在不同的輸入下,選擇不同的數據通路。將指令認為是輸入的條件,在解碼階段,選擇數據通路,從而將數據輸入到正確的執行邏輯中。
大二的時候開始學數字電路,還沒有學單片機原理,所以對CPU內部的原理一點都不理解,但這並不妨礙我自己閉門造芯的熱情,然後我就自己下載安裝了模擬軟體Proteus,打算用邏輯門和觸發器搭出一個可以按照輸入的程序運行的電路——說白了就是CPU,當然,我當時給它設定的基本運算只有四個:加法、與、或、非,雖然很簡陋,但是理論上,程序員完全可以用這四個運算完成計算機可以完成的所有演算法——在不考慮時間成本的情況下。
於是我開始畫電路,第一步是分別畫出針對四個運算任務的運算單元,如果有數字電路基礎,這再簡單不過了。。。。。在真正的CPU裡面,類似的運算單元叫做「算術邏輯單元」,簡稱ALU,它的實現原理我們老師沒說過(二本院校,莫見怪),我自己設想的實現方法有兩種:一種是像我這樣,把幾個運算單元並排放,然後每個編一個地址,要運算的時候把數據輸入相應的地址,就會輸出結果;另一個實現方法是採用類似可編程邏輯器件PLD的單元,這種東西,先輸入一堆電平把它定義成你想要的邏輯單元,然後輸入數據就能輸出結果——並不是三言兩語就能說清楚的,但是CPU問世的時候PLD還沒有發明,所以我只能說「類似」。前面已經說了我選用那四個運算單元的方法——每個單元分配一個地址,要用的時候找這個地址就行了。為了「找」這個地址,我採用的是解碼器,這個東西兩個輸入,四個輸出,輸入兩位二進位數,而輸出的四個口中,只有一個是高電平,這個電平對應的一個單元就會輸入數據,輸出結果,我給每個運算單元編了個地址,但我忘了,不打緊的,舉個例子,可能我輸入00,代表加,01代表與,10代表或,11代表非,這樣的,程序執行起來就不會有歧義了。這個東西在CPU里對應啥我也懵逼。既然涉及到程序,那至少得先把程序存起來吧,在計算機里存儲程序的東西叫做ROM,全名好像是「指令寄存器」,和手機的ROM不是一個東西。當時我會一點單片機C,所以沒有自己設計ROM,寫了一個單片機程序,程序存在單片機里,到時候按順序輸出就行了。當時我設計的指令語法結構是這樣的:運算單元地址 數據甲 數據乙其中三個部分的去向如下:運算單元地址輸入到解碼器;數據甲輸入到運算單元一號入口;
數據乙輸入到運算單元二號入口。這樣一來,如果來了一條指令:00 00 01它的內容其實是:相加 00 01意思就是00和01相加,輸出結果將會是01 。當然,我當時只考慮讓代碼變成可以執行的程序,還沒有考慮到數據回收利用等等CPU必備的,功能,但是考慮到題主的疑惑是「代碼如何找到確定的邏輯」,那麼,我這裡已經簡略地介紹了在機器碼級別,代碼與邏輯對應起來的基本原理——我用了定址的方法,並揣測CPU設計者可能用代碼定義ALU內部邏輯的方法,如果會布爾運算的話就知道邏輯門少的時候,邏輯是很好定義的。當然,真正的CPU還需要很多功能,我這個設計里沒有提到輸出的數據放在哪裡,在CPU里沒有這個東西,實際使用中我們給它加一個叫做內存的東西。CPU里還有很多重要的東西,個人水平低,又忘得厲害,按下不表。CPU的硬體結構已經確定了它能使用的全部機器指令,這些指令構成一個集合,叫做指令集。像這種把代碼每一位的意義都確定了的CPU指令集叫做「精簡指令集」,用在手機上的ARM晶元就是這種指令集,優點是功率低。另外一種指令集叫做「複雜指令集」,它的不同代碼每一位代表的意義可能不一樣,於是需要設計一個特殊的指令解碼器來翻譯指令,這種指令集效率很高,但是功耗也高,這就是電腦CPU需要風扇甚至水冷散熱的原因。由於機器碼只是一串數字,記起來不太好記,所以人們使用一系列裁切過或未裁切的英語單詞代替對應的指令,用來幫助記憶,所以這些單詞叫做「助記符」,比如用ADD代表「加」,那麼上面的代碼就成了:
ADD ,00, 01;看起來直觀多了,但是CPU是識別不了這個代碼的,所以人們寫完這樣的代碼,會使用編譯器把它翻譯成00 00 01 .但是助記符編程序還是挺麻煩的,於是我們把一些常用的代碼組合放在一塊,然後用一個單詞或者式子來代替,比如上面的兩數相加,就可以寫成00+01 .這些單詞或式子的集合,就成了略高級一點的程序語言,比如C語言。然後呢……人類總是會嫌麻煩,設計了越來越多更高級的語言,高級語言越來越接近人類說的話——自然語言,但到如今也只能是接近,想用自然語言編程,還早,而且口語里有太多不規範不確定的東西,就算哪天有人開發出自然語言編程,不好好學語文和邏輯思維能力差的人也編不了什麼好程序。另外,由於高級語言其實是把「低級」語言構成的一些任務打包起來的,同一個任務在不同場景下可能有最優化的「打包」方法,而使用高級語言時只使用確定的一種,這就導致很多情況下不能使用最優化的方法,導致了效率的降低,一般來說,語言越高級,就越容易開發軟體,但開發出來的軟體的執行效率就越低,這也是CPU一直在升級,但性能永遠嫌不夠的原因。……本科學歷,對事物理解也就這個層次了,而且全程憑記憶,沒有查百度百科,差錯難免,勿怪。簡單說說,不是精確工作過程
處理器的運算單元有個使能邏輯,負責開啟相關運算單元的功能,如果沒有使能,則不工作,輸出無效。
通常輸入是接到各個執行單元上的,但是使能邏輯不會同時有效,所以結果就只有一個有效
而使能信號是指令帶過來的,比如add,就使能加法器
指令是程序員/編譯器/彙編器產生的謝邀
從物理上來說,就是一個開關對一個指令。正如你打開某個開關的時候,必然會有對應的電燈或者其它電器對應打開一樣。
然後和從PB級的存儲系統中訪問幾個位元組相比,從幾千個運算指令中選取一個指令運行真心不要太簡單。一加一,首先它是個機器指令,放在內存里,cpu加電會從固定存儲器地址取指令,具體是發送一個存儲器讀信號,存儲器返回內容。該內容被導入到指令解碼單元解碼,執行。電路都是連好的,並不是隨意連接。這問題四個系統問題,回答只能適可而止,否則就忍不住寫一本書出來了。
因為處理器有 很多不同的指令 應對相應功能
這一點從彙編語言看更清楚 彙編語言的格式如下
指令 操作數1 操作數2
其中的指令便代表 要對兩個操作數進行怎樣的操作
將指令在電路中具象 其實也是線路的高低電平關係
這些高低電平關係 則在硬體層面 激活它對應指令的相關電路
所以它們是被設計成這樣的 處理器指令是處理器設計的核心
剛剛問題不見了,不知道怎麼回事。
這個問題比較深了,但是我能回答。
這當中涉及到極多的抽象層。從源代碼到二進位機器狀態,這當中有很多層。
從軟體層縱向深入到硬體層。
軟體層;高級語言到低級語言;c以上的語言接近自然語言,c以下的語言接近機器語言。
其指向是這樣的;
c++,java,python等-》c-》彙編-》機器碼
硬體層;CPU或者其他類似邏輯電路都是這樣,比如GPU mcu DSP等,分前中後段,前段是晶元級彙編,中間是指令集,後端是二進位,也就是一開一關的狀態。
接著上面的軟體層,數據流從軟體二進位來到機器後,首先被編碼為晶元級彙編,然後送到指令集系統進行解碼編碼運算等等 一系列複雜操作,別小看指令集,其實指令集系統是非常龐大的,分複雜指令集和精簡指令集,cisc,risc。最後數據流被送入到二進位池(不要以為這個池子很小,其實比海還大,應該說叫二進位海)進行狀態改變操作,也就是一開一關,這個過程都是按秒算的,因為電子在半導體上的速度是光速,半導體,比如硅原子組成的晶體管也是光速。這都是納秒內的變化速度。而納秒是很短暫的,秒以內一般都是1000進位,秒到納秒中間還有毫秒微秒兩級。一秒等於1000000000納秒。
晶元震動的速度很快,上面說的納秒級,就是說在一秒內電子在晶體管上的門電路一開一關來回跑的速度。而晶體管是由硅原子組成的,總是說小數點後面多少個9,就是說的硅原子的純度。99.99999999%,從沙子還有土中含有硅元素多的物質中提取的純度,一般都要小數點後4個9以上才是基本。也就是說是電子在硅原子周圍不停地做遷移運動。這個速度的單位是赫茲,Hz。kHz就是千赫茲,mHz就是百萬赫茲。其進位也是1000.(這是速度單位,容量是1024)相對的,GHz就是十億赫茲了,現在的cpu基本都能跑到3GHz以上,也就是三十億赫茲,每秒鐘晶體管電子遷移或震動三十億次,這還單單只是一個晶體管呢,現在的大規模集成電路,都是以億為單位的集成度數量。普通晶元,比如我們用的intel,AMD,雙核都在5億左右,核數越多用的晶體管就越多,而GPU已經發展到百億以上的晶體管了,最少的都有50多億。你可以想像下如此多的晶體管,N億數量每秒鐘震動N十億次以上,其速度是有多快,產生的二進位狀態,也就是01組成的機器碼,是不是可以用海來形容了。
這還是通用晶元的速度(一個),會受到通用變數的限制,專用晶元更快,也就是asic,專用集成電路。當然我們說的都是民用,這裡沒有說大型機,集群,超算等計算設備。那根本不是能想像的了。
計算機軟體世界和硬體世界組成了賽博空間,在那裡是一個宇宙。你可以認為是微觀宇宙,從計算機可以模擬模擬現實世界就可以看出。
人類自從掌握核裂變以後,就將工業帶入到原子層面了,現在又用計算機技術征服了原子世界(當然只是冰山一角,原子世界遠遠不止這麼一點),征服了電子和硅原子。你要知道電子比原子要小得多。
我剛剛找了一些知識,你可以去參考下,當然,這只是冰山一角。
http://www.expreview.com/50814.html
http://www.expreview.com/exp_new/exp4_topic.php?action=wendaTopic
這裡有很多硬體知識。
intel的 http://player.youku.com/player.php/sid/XMjQyMjIzODg4/v.swf
amd的 http://v.youku.com/v_show/id_XMzM4NzQ1NjIw.html?spm=a2h0j.8191423.module_basic_relation.5~5!2~5~5!3~5~5~A
更新;
題主在私信里問的,我的回答
其實運算和計算在普通個人平台沒有多大區別,在大型機,超算上才有區別。你問的問題我現在有點頭緒了,其實你的問題就是指令集是怎麼工作的。你要知道cpu中有很多的單元,不同的單元負責不同的工作。指令集是被固化在具體的邏輯電路里,你看cpu的參數,L1 指令緩存,就是機器加電以後,從指令集中讀取的指令。它會告訴【算數單元】怎麼操作晶體管進行四則運算。
指令集和架構是相關聯的,指令在緩存里接收到數據後,又會送回指令集的邏輯電路進行解碼。然後發送給相應的單元進行計數(比如算術單元 浮點單元等 還有很多不同的單元,它們共同組成了中央處理單元,就是處理器的名稱),也就是運算,運算有細分為很多計算。計算就是增刪改查,移動,替換等很多操作。對於二進位來說就是這樣計算的。
///
題主請盡量在題里評論下問,讓知友們看到,可以挑錯。
運算要翻譯成計算機能識別的指令才能執行。例如:
如果用一個最簡單的CPU,考慮用兩個寄存器,那麼指令可能是
LOAD REG0 1
LOAD REG1 1
ADD REG0 REG1
用LUT吧,至少FPGA是這樣的
先了解1加1怎麼送進了cpu,它被編譯成一條2進位指令放在了內存中。程序運行的過程就是cpu從內存中取指令再一條條執行的過程。此外每條指令都會指示這是條要幹嘛的指令。cpu讀到1加1這條指令後,解析出來這是條加法指令,所以指令就被送到加法運算模塊處理了。
首先吧,1+1,在彙編上對應的是一個加指令。每個指令都有相應的機械碼存儲在內部ram。當使用指令的時候,就會從ram中提取出機械碼,然後把加好的數值通過堆棧放入內部rom。
這問題比較複雜,有點興趣可以看一下這本書的目錄,很有興趣可以看完這本書
《計算機系統要素 從零開始構建現代計算機》推薦閱讀:
※cpu是怎麼製造的?
※平面設計電腦應該如何配置?
※為什麼 Intel 的超線程技術是一個核兩條線程,而不是更多?
※如何評價E3-1200 V6 CPU 發布?
※為什麼不能增大CPU面積來提高CPU性能?