陳凱
摘要:為了幫助學生直觀地理解計算機底層硬件的工作過程,本文設計了一種簡單的數(shù)字邏輯電路,可利用這種邏輯電路來解釋計算機邏輯架構(gòu)中運算器、控制器、存儲器三者的關系,以及二進制編碼在計算機工作過程中所起到的作用。
關鍵詞:計算機體系結(jié)構(gòu);控制器
中圖分類號:G434? 文獻標識碼:A? 論文編號:1674-2117(2023)11-0020-05
“一去二三里,煙村四五家。亭臺六七座,八九十枝花?!北彼未蠹疑塾簩懴碌臄?shù)字詩恰好用到了從一到十的十個數(shù)字。代入詩人的視野:從宏觀的“二三里路”,到中觀的“煙村”和“亭臺”,再到微觀的“花”;代入詩人的情緒:從灑脫的“一去二三里”,到精細的“八九十枝花”。此數(shù)字詩之妙趣可謂無出其右。仔細看詩中數(shù)字,二三四五直到十,這些都是數(shù)量,而“一去”的“一”卻是助詞,兩類數(shù)字屬性不同,卻達成了數(shù)字序列形式上完美的統(tǒng)一。這讓筆者聯(lián)想起計算機機器語言,在那些底層的指令代碼中,無論是操作碼還是操作數(shù),雖然其表現(xiàn)形式都是一連串的數(shù)碼,但數(shù)碼的作用卻完全不同,如果不是投入目光到計算機內(nèi)部組件的運作過程,恐怕很難體會到這些數(shù)碼的真實用途。那么有沒有可能讓學生真正了解到計算機底層大致的工作過程,領悟當前硬件的計算機架構(gòu)和二進制數(shù)碼形式的機器語言兩者間的密切聯(lián)系?本文試著給出一種教學思路。
一種通用的計算機架構(gòu)模擬器
“Johnny”是一種通用的計算機架構(gòu)模擬器,從軟件的界面可以看出,左側(cè)欄是存儲器,中間欄和右側(cè)欄是中央處理器中的控制器和運算器??梢栽谀M器界面左側(cè)輸入程序代碼,然后運行代碼,觀察控制器如何根據(jù)機器指令的操作碼和操作數(shù),命令運算器實現(xiàn)不同的計算動作。以下頁圖1的程序代碼為例,首先執(zhí)行的是01號指令,代表的含義是從存儲器取數(shù)到處理器的寄存器,示例中取的是004號空間中的數(shù);然后執(zhí)行的是02號指令,代表含義是從存儲器取數(shù)與處理器中的寄存器數(shù)做加法,示例中取的是005號空間中的數(shù),于是就執(zhí)行了數(shù)字009和數(shù)字008的加法運算;最后執(zhí)行的是03號指令,代表含義是從處理器中的寄存器存儲數(shù)字到存儲器,示例中存儲的地址是003號空間。這個模擬器軟件很清晰地將計算機內(nèi)部處理器芯片根據(jù)存儲器的程序和數(shù)據(jù)進行運算的工作流程展現(xiàn)了出來。
但請注意,從模擬器的軟件界面中可以看出,處理器芯片中的控制器是一個黑箱。如果想要知道控制器到底是如何根據(jù)存儲器中的代碼實現(xiàn)對應的操作的,就需要進一步將控制器的內(nèi)部結(jié)構(gòu)展現(xiàn)出來。如圖2所示,控制器內(nèi)部結(jié)構(gòu)是比較復雜的,雖然“Johnny”模擬器可以完整地模擬控制器中數(shù)據(jù)的變化,但對大部分學生而言,恐怕不是短時間就能理解的??刂破鹘Y(jié)構(gòu)之所以如此復雜,是因為控制器必須能實現(xiàn)通用性的程序運行的控制。
如果不考慮計算的通用性的問題,目的僅僅是演示一個簡單運算過程中整個計算機體系結(jié)構(gòu)各個部件的作用,就能對控制器的結(jié)構(gòu)進行簡化。本文將要討論的兩個重點,其一是設計一種簡化的控制器結(jié)構(gòu),其二是試圖循序漸進地剖析控制器的功能。
一種時序控制裝置
考慮到學生對算法和高級語言的了解遠多于對計算機硬件結(jié)構(gòu)的了解,所以教師可以借助簡單的變量賦值語句來類比處理器芯片中寄存器的數(shù)據(jù)傳輸和存儲。學生從經(jīng)驗出發(fā),應該比較容易在高級語言的賦值語句和硬件寄存器的數(shù)據(jù)存儲動作兩者間產(chǎn)生聯(lián)想,雖然技術(shù)事實是后者的硬件電路結(jié)構(gòu)支撐著前者程序功能的實現(xiàn)。例如,a=3,b=4這兩句語句可以類比為上頁圖3所示的數(shù)字電路,此電路圖可由仿真軟件Logisim模擬運行。在圖3中,左側(cè)裝置演示的是時鐘脈沖尚未來到時的寄存器的狀態(tài),右側(cè)裝置演示的是始終脈沖到來后寄存器的狀態(tài)??梢钥闯?,數(shù)字3和4可以同時存儲到寄存器中,而高級程序語言中,數(shù)字3和4賦值給變量是有先后關系的。
一種自動的斐波那契數(shù)列項生成器
假設變量a和b中已有初始值,且均為1,有以下語句:
a=a+b
b=a+b
如果反復地按順序執(zhí)行這兩句語句,則會按如下表所示的順序陸續(xù)生成斐波那契數(shù)列項:
但如上頁圖4所示的硬件電路卻難以達成類似目標。因為加法器運算后的結(jié)果數(shù)據(jù),會同時存儲到寄存器a和寄存器b中。
為了使電路能像程序代碼那樣按順序執(zhí)行,可以添加兩個緩沖控制器,電路圖中用小三角形表示。如圖5所示,當緩沖控制器的控制端為“1”信號時,數(shù)據(jù)可以通過,當控制端為“0”信號時,數(shù)據(jù)無法通過。這樣,只要先打開上方緩沖控制器通路,將加法結(jié)果存入a寄存器,再關閉上方緩沖控制器,打開下方緩沖控制器,將加法結(jié)果存入b寄存器,反復執(zhí)行這個動作,就能使這個電路生成斐波那契數(shù)列項了。圖5左圖展示了上方緩沖控制器打開時電路運行的狀態(tài),可見“1+1”加法運算結(jié)果數(shù)據(jù)存入寄存器a,右圖展示了后續(xù)下方緩沖控制器打開時電路運行的狀態(tài),可見“2+1”加法運算結(jié)果數(shù)據(jù)存入寄存器b。
雖然時鐘脈沖是自動產(chǎn)生的,但輪流選中不同的緩沖控制器,卻需要人工操作,在這里,希望學生能有所領悟,人工操作的動作本身也就是輪流發(fā)送給控制緩沖控制器的“1”信號和“0”信號的動作,其實是可以被預先存儲起來的。上頁圖6所示的電路使用到了一個存儲器(注意存儲器和寄存器的區(qū)別),存儲器中用“1”指令代表開啟上方緩沖控制器,用“0”指令代表開啟下方緩沖控制器。這樣,只要從存儲器中按順序取出二進制數(shù)字,也就能按順序執(zhí)行指令了。
一種簡單的可編程的多功能加法裝置
在上面的例子中,存儲器里只存儲了動作指令,為了增強功能,指令中應包括動作的類別和動作的處理對象,上頁圖7是個極為精簡的處理器的例子,存儲器里的指令包括了操作碼和操作數(shù)。操作碼只有一位二進制數(shù),對應兩個動作,指令“0”代表向寄存器做加法的動作,指令“1”代表向寄存器存儲數(shù)字的動作,操作數(shù)有兩位,可以是“00”“01”“10”“11”,代表數(shù)字0到3,為了盡可能簡化問題,這些數(shù)字會直接存放或加到寄存器中,這和現(xiàn)實中的處理器要根據(jù)操作數(shù)的地址從存儲器中獲取數(shù)字的行為有所不同。在圖7所示的電路中,存儲器中的指令是5、1、0、1,它們對應的二進制數(shù)是101、001、000、001,其含義是對寄存器存1,對寄存器加1,對寄存器加0,對寄存器加1,在完整執(zhí)行完所有指令后,得到的結(jié)果是3。
當然,也可以另外使用一個存儲器專門存儲需要進行存儲或加法運算的數(shù)據(jù),這樣,指令中的操作數(shù)就表示了指向數(shù)據(jù)存儲器的地址,如上頁圖8所示。不過就算如此,這個結(jié)構(gòu)和先前的“Johnny”模擬器或者說和當前最普遍使用的計算機體系架構(gòu)還是有幾處不同,在“Johnny”中,指令和數(shù)據(jù)是存儲在一個存儲器中的,另外,“Johnny”中可以將運算后的結(jié)果存儲回存儲器。這些功能當然是可以用電路實現(xiàn)的,但會使得系統(tǒng)結(jié)構(gòu)變得非常復雜,對大部分學生來說,重點是理解二進制數(shù)是如何在計算過程中起到控制作用的。對于學有余力的學生,可以鼓勵自主探索,筆者有幾位學生按本文思路,完整地設計出了通用計算機體系結(jié)構(gòu)的數(shù)字電路。
計算機體系結(jié)構(gòu)示意圖
雖然教師可以將教材上的計算機體系結(jié)構(gòu)示意圖直接拋給學生,但這樣就剝奪了學生自主思考的機會,考查前面介紹的精簡的計算機體系結(jié)構(gòu)電路模型,可以試著繪制此結(jié)構(gòu)的示意圖,思考存儲器、控制器、運算器三者間的關系是怎樣的。繪制的結(jié)果可以不設標準答案,不過可以想見,它大概是如圖9所示的樣子。存儲器中指令的操作碼傳輸?shù)搅丝刂破鳎僮鲾?shù)中的數(shù)據(jù)或操作數(shù)所指向地址的數(shù)據(jù)傳輸?shù)搅诉\算器。不過,其實很難說控制器是否對存儲器和運算器起到了控制作用,因為控制器實際上只是根據(jù)存儲器發(fā)來指令的操作碼開通或關閉數(shù)據(jù)傳輸?shù)耐范?,所以圖9中將控制線條畫成虛線。
很容易想到,稍微復雜一些的計算機體系結(jié)構(gòu),應該具有將運算器結(jié)果重新存儲到存儲器中的能力,再加上人機交互的輸入和輸出模塊(簡單推理可知,為了能輸入和修改程序,人和存儲器交互較之與運算器交互更為方便,這里不進一步展開討論),整個計算機體系結(jié)構(gòu)示意圖就成為如圖上頁10所示的樣子。這個示意圖和廣為流傳的以存儲器為中心的現(xiàn)代計算機體系結(jié)構(gòu)示意圖已經(jīng)非常相近了。
芯中之數(shù),數(shù)中之心
本文使用仿真軟件演示了一個精簡的計算機體系結(jié)構(gòu)是如何搭建起來的,考慮到筆者其實是使用了實體計算機中的仿真軟件模擬出了可運行的虛擬的計算機,那么就能引出一個有趣的問題,計算機是不是能經(jīng)由計算而判斷出自己能否完成某些特定的任務呢?乍一想,只要計算機將自身程序在模擬環(huán)境中運行一下,就能得出判定結(jié)論了,但這其中存在一個邏輯上的陷阱,計算機為了模擬運行自身程序,就需要額外用到那些實現(xiàn)模擬的程序。如果再追問:計算機是否能判斷那個模擬自身程序的程序完成任務呢?為了回答這個問題,就必須把這個實現(xiàn)模擬自身程序的程序也放置到某個實現(xiàn)模擬的程序環(huán)境中,這樣就陷入到無窮倒退的窘境之中了。假設人的頭腦的工作方式和計算機是相近的,那么當人在自問能否完成任務的時候,答案可能只是頭腦所模擬出來的虛假的自我程序所做出的。當然,人的頭腦的工作方式是否和計算機類似,這還是一個懸而未決的問題,然而,只從結(jié)果上看,人工智能的能力已經(jīng)超過許多人類了。以下是向人工智能對話軟件ChatGPT提出的問題:
“北宋時期,邵雍的數(shù)字詩《山村詠懷》按順序用到了從一到十這10個數(shù)字。第一個問題,你能否也寫一首短詩,其中用到從一到十按自然數(shù)順序排列的數(shù)字?第二個問題,數(shù)字詩中的‘一所起的作用和其他數(shù)字所起的作用是不同的,讓人聯(lián)想到計算機機器語言指令中,二進制數(shù)碼所起的作用是不同的,你能否具體舉例說明呢?”
人工智能給出幾乎是滿分的回答:“如一個16位計算機指令,其中前四位代表操作碼,后12位代表地址碼,操作碼表示不同的操作,而地址碼則指示了操作數(shù)在內(nèi)存中的位置。因此,在計算機中使用二進制數(shù)碼,其具體作用與其所處的上下文密切相關,需要根據(jù)具體情況加以理解?!?/p>
本文最后就以人工智能寫的數(shù)字詩來結(jié)尾,筆者做了兩處修改,把原詩中的“六合之內(nèi)”改為“六合位定”,把“一劍鋒利出”改成“一劍定乾坤”,這極少數(shù)的修改,可以算是人的創(chuàng)造力較人工智能占優(yōu)的不嚴謹?shù)淖C明吧。
“一生為二二生三,三生萬物森。四海潮漲五岳高,六合位定七星璀。八方風雨九州闊,十年一劍定乾坤。”