白家璇 辛雨雯 崔天宇



關鍵詞:JavaScript;虛擬實驗;計算機組成原理
中圖分類號:G642;TP391 文獻標識碼:A
文章編號:1009-3044(2023)10-0059-04
0 引言
計算機組成原理是中國民航大學本科計算機專業的專業基礎課,通過學習,體會到本課程的實踐性很強,需要動手操作實踐才能真正理解理論內容,但傳統的只在實物實驗箱上進行實驗操作存在很多不足。譬如:1)固化的內部電路,內部的每個功能模塊硬件電路已焊接好,只需連接I/O導線即可搭建電路連接圖,對硬件電路缺乏設計動手能力的培養,而且也只能做相對固定的實驗,不方便擴展,難于進行設計性和綜合性實驗,更新換代等都很難跟上時代的發展需求;2)已經封裝好的實驗箱,其內部的實現原理、運行狀態等都無法直接觀察;3)實驗室的開放時間有限,因人力資源、學生自身的上課安排、實驗室課程安排等現實原因造成大多數情況下,學生能使用實驗箱的時間遠遠不足,學生的實驗時間和空間受到極大限制;4)在實驗連線時,容易對同顏色的接線進行混淆,同時,如果實驗箱有問題或者部分接線的損壞,對于學生來說都是未知的,在排查錯誤時,不容易將這些硬件的自身問題找出來,會導致實驗效率低下[1]。本文主要介紹一種基于JavaScript設計開發的實驗仿真平臺,配合實物實驗箱進行實驗,能大大提高學生的實驗和學習效率。
1 系統設計方案
本系統在功能上主要開發數字邏輯課程中的基本邏輯元器件,譬如與、或、非等各種門電路,D觸發器等芯片,對所生成的器件功能驗證完成之后,再將這些器件組合應用于計算機組成原理課程的各種功能模塊的設計實驗中,譬如運算器、微程序控制器、總線電路、RAM存儲器讀/寫、模型機的模擬實驗等[2]。在此基礎上,作為擴展可以再完成微機接口技術課程的實驗,譬如8253計數器/定時器、8255A并行傳送、8259A中斷等。其中的每一個器件或模塊都是分解成一個個小的實驗分步實現,最后再組合形成一個具有獨立功能的模塊。
系統前端采用HTML、CSS、VML 工具,其中CSS實現系統外觀的設計及各個部件的具體外形,VML實現組件間的線路連接生成功能;后端采用JavaScript工具;通過UI界面選擇實驗所需芯片;通過HTML5File API將電路保存為.txt文件(.txt文件具有還原電路功能);選用Webstorm作為代碼編譯平臺(Webstorm具有項目重構、快捷搜索、自動排版、代碼提示、錯誤提示等優點)。另外,還需引入組件調度模塊,因為在通過組件庫與電路繪制模塊設計好電路圖之后,運行時還需要解決如何讓各個組件協調有序的工作,否則會出錯。系統總體功能模塊結構如圖1所示。
2 系統芯片設計
本系統開發涉及邏輯與、或等各種門電路器件的設計,74LS139、74LS175、74LS273、74LS374等多個數字功能器件的設計,continuousPulse等多個基本原件的設計、EPROM2716只讀存儲器等多個存儲芯片的設計和SuqueTimer脈沖發生器的設計和運算器等多個模塊的設計。
2.1 數字功能器件設計
設計一個芯片器件,首先需通過代碼定義每個芯片的外觀,主要包括定義芯片上對應位置引腳的類型type、數據源器件source、中間器件intermediat、目的器件destination等,每個芯片的設計大同小異,本文以74LS273為例介紹數字功能器件的設計方法。涉及的外觀屬性主要有:id—芯片編號(唯一,為后面設計前端時引用);type—寄存器上對應位置引腳類型;source—數據源器件;intermediate—中間器件;destination—目的器件;name—器件外觀顯示名稱;width—器件外觀寬度;Height—器件外觀高度;PaddingLR—器件左右邊距;Pinname—器件引腳名稱,Pinwidth—器件引腳寬度(不小于16)。
芯片外觀設計好后,還需對芯片的運算條件進行設計與判斷。74LS273首先對用戶的輸入值進行有無變化的判斷,如果有變化,返回true,否則返回false,同時判斷mr、cp的值(mr為pinNO=0的引腳,cp為pinNo=10的引腳),此處mr為0,處于清0狀態,判斷函數返回true不為0時,通過cp時鐘信號對數據進行鎖存。對于74LS273的功能實現函數,還需判斷其pinNo是否為0,即mr 引腳,如果本引腳處于低電平,則74LS273芯片處于清0狀態,否則正常輸出[3-4]。在本74LS273的設計中通過使用for循環實現芯片的功能函數,具體編程代碼如圖2所示。
2.2 基本原件設計
本文以continuousPulse為例介紹基本原件的設計方法,主要討論其工作方式。對于是否已達到運算標準的函數判斷,因為此功能相當于給一次脈沖,一旦按下這個脈沖,器件就到達了運算條件,所以只需要簡單地判斷輸入端口是否有值輸入即可。
對于輸入引腳值的設置,系統中使用了if結構進行判斷,如果設置輸入的值為0,則將其值設置為1,否則設置為0,同時判斷芯片是否達到了運算條件[5-6]。
2.3 虛擬組件設計
本文以EPROM2716c4為例介紹虛擬組件的設計方法,其重要引腳為第11(ce)與12(oe)引腳。首先判斷芯片所有的值是否已經輸入,如果ce片選信號與oe讀信號中有一個輸入,則返回True,否則返回False;對于只讀存儲器是否滿足運行條件的判斷,需通過輸入值進行,如果輸入的值沒有變化,就無須再重新計算,當ce或oe中有一個引腳的值為1時,則各個io引腳變為高阻態。
3 計算機組成原理仿真實驗
3.1 全加器仿真實驗
全加器仿真實驗的電路圖設計如圖3所示,共用到3個與門、2個或門、2個異或門,3個輸入、2個輸出(輸入、輸出見表1)。當Ai和Bi異或后再與Ci-1進行異或可得到SUMi,當Ai、Bi、Ci-1中只要有兩個以上的輸入為1,則進位Ci=1。所以,只需要將其中的兩個變量求與,然后再將結果求或,具體邏輯表達式為:
此全加器共有3個輸入量,按照所設計的進行電路連接,分為輸出“和”SUMi、進位輸出Ci,這樣就設計了一個“1位加法器”[7-8]。
按照圖3的設計進行電路連接,得到如圖4所示的電路圖。
由圖3、圖4和表1可知,此全加器設計都用1作為輸入(3個開關均為輸入),在遇到第二個與門時,因為第三排為異或門,所以就會有1個0的輸入,在左邊的最后一個與門處,會接受右分支輸入的1個0,這個右分支的0與左分支的1相與,最后輸出0結果,小燈滅;同時可以看到,如果右邊的小燈為異或,相對于左邊,則一個輸入為0,另外一個輸入為1,兩者相與,就能得到1,右邊的小燈就會不斷閃爍,與實驗結果相符。此時,如果把左邊的與門改成異或門,原理上左邊的小燈應該會亮[9],仿真實驗結果也得到了證實,如圖5所示。
3.2 RAM 仿真實驗
本文以RAM6116隨機存儲器芯片的讀/寫操作實驗仿真為例,驗證RAM的讀/寫操作以及AR地址寄存器的地址寫入功能,驗證實驗電路圖的設計如圖6所示,用到了系統所設計的74LS273和74LS245芯片,其中74LS273作為AR地址寄存器使用,同時也作為總線向RAM6116進行寫數據的傳輸寄存器,74LS245作為一條總線向RAM6116寫入中間數據寄存器使用,起暫存數據作用,其他的還用到控制數據輸入開關,給“與”上升沿脈沖的單脈沖信號P1、P2及用于數據顯示的顯示燈使用。
此RAM6116的實驗原理:SW7-SW0數據開關用于設置讀/寫地址和欲寫入存儲器的數據,經三態門74LS245與總線相連,通過總線把地址發送至AR。靜態存儲器由1片6116(2K×8)構成,但地址輸入引腳A8~A10接地,因此實際存儲容量為256字節,其余地址引腳A0~A7與AR相連,讀和寫的地址均由AR給出。6116的數據引腳為輸入、輸出雙向引腳,與總線相連,既可從總線輸入要輸的數據,也可以通過總線輸出數據到數據燈顯示。共使用了兩組顯示燈,一組顯示從存儲器讀出的數據,另一組顯示存儲單元的地址[10]。
讀數據時,在數據開關上設置好要讀取的存儲單元地址,并打開三態門74LS245,LDAR置1,發出P2脈沖,將地址輸入6116,設置6116為讀操作,即可讀出數據并在數據燈上顯示。
寫數據時,先在數據開關上設置好要存儲單元的地址,并打開三態門74LS245,LDAR置1,發出一個P2脈沖,將地址送入6116,然后在數據開關上設置好要寫入的數據,確保三態門打開,設置6116為寫操作,發出一個P1脈沖,即可將數據寫入。RAM驗證實驗電路圖和如此相連的電路圖如圖7和圖8所示。設置電路的初始狀態為MR=1、CE=1、SW-BUS=1。
1)寫操作仿真。以存入11H 為例,調節SW7~SW0為存入的地址00000001,LDAR和WE都置為1,打開SW-BUS,點擊P2,觀察到中間一排燈泡僅最后一個點亮,即操作無誤;關閉SW-BUS,調節SW7~SW0為存入的數據00010001,打開SW-BUS,然后打開CE,點擊P1,可以觀察到上面一排燈泡為00010001,1為亮0為暗(如圖8所示),即操作無誤,關閉CE,關閉SW-BUS。重復上述過程直至全部存入[11]。
在圖8中可以看到中間一排燈泡僅最后一個點亮(操作無誤),上面一排燈泡為00010001(1為點亮0為滅,操作無誤),存入正確。
2)讀操作仿真。以讀取11H為例仿真讀操作,接著以上1)中最后存入的繼續,此時SW-BUS處于關閉狀態。調整SW7~SW0為00000001,然后打開SWBUS,點擊P2,打開CE和WE,觀察到上面一排燈泡的點亮狀態,然后關閉CE和SW-BUS。重復上述過程,直至完成所有數據的讀操作[12]。
4 結束語
本虛擬實驗系統基于JavaScript開發了許多數字邏輯組件,大致分為4類:1)74LS181、RAM等芯片器件;2)與、或、非、異或等各種邏輯門電路;3)開關、小燈、單脈沖和連續脈沖等基本元件;4)為了屏蔽電路細節或實現電路簡潔,將多個功能部件封裝為一個組件而成的各種虛擬組件,譬如時序電路組件、EPROM2716。在此基礎上,設計了計算機組成原理課程實驗中的多個模塊并進行了仿真實驗,譬如全加器、運算器、微控制器等[13]。新冠疫情期間,配合實物實驗箱,部分模塊已用在了中國民航大學計算機專業的計算機組成原理課程中。實踐證明,通過開發系統,大大提高了學生的分析解決問題能力和創新能力;在實際教學中應用仿真實驗,能有效提高學生的學習熱情和學習積極性,收到了事半功倍的學習效果,受到了學生的極大歡迎。
同時,基于JavaScript的開發平臺也存有一些不足,譬如芯片數量有限,如果在實驗過程中發現芯片短缺時,還須重新設計;通過VML設計的連線也有一定的局限性,對于較復雜的實驗,連線很多會很亂,沒有優化機制。
另外,系統開發也參考了https://blog.csdn.net/qq_51314467/article/details/124159657 和https://blog.csdn.net/qq_51314467/article/details/124733329網站的相關內容,在此一并表示感謝。