驗(yàn)全解析:?jiǎn)慰偩€CPU設(shè)計(jì)與計(jì)數(shù)器調(diào)試指南)
做了這么多年計(jì)算機(jī)組成原理的課程設(shè)計(jì)和實(shí)驗(yàn)輔導(dǎo)我越來(lái)越確定一件事微程序控制器實(shí)驗(yàn)是整個(gè)課程里最容易被低估、也最容易翻車的一個(gè)實(shí)驗(yàn)。說它容易被低估是因?yàn)樵碚n上的知識(shí)點(diǎn)就那幾條——微指令格式、微地址轉(zhuǎn)移、控制存儲(chǔ)器、時(shí)序系統(tǒng)聽起來(lái)很抽象但不算難理解說它容易翻車是因?yàn)橐坏┱镜綄?shí)驗(yàn)平臺(tái)前面對(duì)密密麻麻的開關(guān)、指示燈和連線前期預(yù)習(xí)欠下的“理解債”會(huì)被加倍討回來(lái)。這篇文章想寫的不只是一份實(shí)驗(yàn)步驟說明書而是把微程序控制器實(shí)驗(yàn)從“原理”到“平臺(tái)”再到“排查”的完整鏈路梳理清楚給正在做實(shí)驗(yàn)、準(zhǔn)備期末考試或者打算考研復(fù)習(xí)的同學(xué)一個(gè)可以反復(fù)對(duì)照的參考。我會(huì)把重點(diǎn)放在三個(gè)地方微程序控制器的本質(zhì)運(yùn)行邏輯、教學(xué)實(shí)驗(yàn)平臺(tái)上從頭到尾的實(shí)現(xiàn)流程、以及那些真正讓人卡住的經(jīng)典問題和調(diào)試思路。如果你正在為“單總線CPU微程序控制器設(shè)計(jì)”這種綜合性實(shí)驗(yàn)頭疼或者拿著使用手冊(cè)卻不知道第一步該按哪個(gè)鍵這篇文章應(yīng)該能幫你省下大量翻手冊(cè)和試錯(cuò)的時(shí)間。1. 微程序控制器實(shí)驗(yàn)到底在做什么先搞懂CPU的“發(fā)號(hào)施令”機(jī)制很多同學(xué)一進(jìn)實(shí)驗(yàn)室就直接去連線和撥開關(guān)這是本末倒置。微程序控制器實(shí)驗(yàn)的本質(zhì)不是連線不是撥開關(guān)而是要你親手“寫出一套讓CPU聽話的控制邏輯”。在動(dòng)手之前必須先想明白CPU里的控制器到底是干什么的。1.1 從一次“取指”看清控制器的工作流程計(jì)算機(jī)執(zhí)行任何一條機(jī)器指令都不是一步完成的而是被拆成一小步一小步的微操作。就拿最基礎(chǔ)的“取指令”來(lái)說CPU內(nèi)部大致要發(fā)生這樣一串動(dòng)作把程序計(jì)數(shù)器PC中的指令地址送到地址總線也就是PC輸出、地址寄存器MAR輸入發(fā)出讀信號(hào)存儲(chǔ)器根據(jù)地址取出指令代碼讀出的指令送到指令寄存器IR中暫存程序計(jì)數(shù)器加一為取下一指令做準(zhǔn)備。這四步里每一步都有一個(gè)明確的“動(dòng)作”這些動(dòng)作就是微操作。而控制器的工作就是按照正確的順序、在正確的節(jié)拍里產(chǎn)生對(duì)應(yīng)的微命令讓數(shù)據(jù)通路上的每一個(gè)部件知道“這一刻你該干什么”。這里的核心思維方式是把一條機(jī)器指令的執(zhí)行過程看成是一串微指令的有序執(zhí)行。一條微指令對(duì)應(yīng)一個(gè)節(jié)拍內(nèi)全部微命令的集合而若干條微指令按順序組合就完成了一條機(jī)器指令的功能。這個(gè)思想來(lái)自英國(guó)計(jì)算機(jī)科學(xué)家威爾克斯他提出用“存儲(chǔ)程序”的思路來(lái)替代復(fù)雜的硬邏輯電路——你不是用一堆門電路去做判斷和連線而是把控制信號(hào)預(yù)先“寫成”一串微指令存放在一個(gè)專門的存儲(chǔ)器里執(zhí)行時(shí)依次讀出來(lái)驅(qū)動(dòng)數(shù)據(jù)通路。打個(gè)比方硬布線控制器像是一個(gè)用純機(jī)械方式運(yùn)行的自動(dòng)售貨機(jī)按鈕和出貨機(jī)構(gòu)之間直接靠連桿傳動(dòng)而微程序控制器像是一臺(tái)用“配方卡片”驅(qū)動(dòng)的機(jī)器不同商品對(duì)應(yīng)不同的卡片卡片上寫明每一步怎么操作機(jī)器只是忠實(shí)地讀取卡片并執(zhí)行。配方改起來(lái)容易機(jī)器本身不用換。1.2 微程序控制器與硬布線控制器兩種“發(fā)令槍”的差別計(jì)算機(jī)組成原理課程里一定會(huì)對(duì)比這兩種控制器實(shí)驗(yàn)做完了這個(gè)對(duì)比會(huì)變得極其直觀。我整理了一個(gè)對(duì)照表也是期末經(jīng)常考的歸納點(diǎn)對(duì)比項(xiàng)微程序控制器硬布線控制器實(shí)現(xiàn)方式控制信號(hào)預(yù)先寫成微指令存放于控制存儲(chǔ)器用組合邏輯電路直接產(chǎn)生控制信號(hào)指令修改修改微程序即可靈活性高需要修改電路成本高、周期長(zhǎng)執(zhí)行速度每步都要訪問控制存儲(chǔ)器速度較慢硬件直接產(chǎn)生信號(hào)速度較快設(shè)計(jì)復(fù)雜度規(guī)則性強(qiáng)易設(shè)計(jì)、易維護(hù)邏輯復(fù)雜設(shè)計(jì)調(diào)試?yán)щy典型應(yīng)用CISC類處理器中廣泛使用RISC類處理器較多采用成本與功耗控制存儲(chǔ)器占用面積大邏輯門數(shù)量多但無(wú)存儲(chǔ)開銷這個(gè)表背起來(lái)容易但實(shí)驗(yàn)的體驗(yàn)會(huì)讓你真正明白“規(guī)則性強(qiáng)、易設(shè)計(jì)”是什么意思。你在實(shí)驗(yàn)平臺(tái)上寫一條微指令本質(zhì)上就是在填寫一行由若干個(gè)字段組成的“配置項(xiàng)”每個(gè)字段控制一個(gè)部件的動(dòng)作邏輯非常清楚。而如果你看到實(shí)驗(yàn)平臺(tái)上那些復(fù)雜的門電路芯片想象一下把它們換成幾千個(gè)邏輯門來(lái)實(shí)現(xiàn)同樣的控制邏輯馬上就明白為什么微程序設(shè)計(jì)思想能大大降低控制器的設(shè)計(jì)門檻。1.3 實(shí)驗(yàn)平臺(tái)的單總線結(jié)構(gòu)如何影響指令執(zhí)行不少高校的微程序控制器實(shí)驗(yàn)都基于“單總線CPU”模型這也是熱搜詞里反復(fù)出現(xiàn)“單總線cpu微程序控制器設(shè)計(jì)”的原因。所謂單總線就是CPU內(nèi)部所有部件——寄存器、ALU、存儲(chǔ)器數(shù)據(jù)口、指令寄存器等——都掛到一組公共數(shù)據(jù)總線上任何一次數(shù)據(jù)傳送都必須經(jīng)過這條總線。單總線結(jié)構(gòu)有一個(gè)特別重要的約束同一時(shí)刻只能有一個(gè)部件向總線發(fā)送數(shù)據(jù)但可以有多個(gè)部件同時(shí)接收數(shù)據(jù)。這句話是實(shí)驗(yàn)中的“鐵律”。比如把R0的內(nèi)容傳送到R1你必須先把R0的輸出門打開讓數(shù)據(jù)上總線同時(shí)讓R1的輸入時(shí)鐘有效總線上的數(shù)據(jù)才能被R1鎖存。如果這一刻R2的輸出門也被錯(cuò)誤地打開了總線上的數(shù)據(jù)就會(huì)沖突結(jié)果完全是亂的。理解了這個(gè)約束你對(duì)“為什么一條微指令里很多控制信號(hào)是不能同時(shí)有效的”就有了直觀認(rèn)識(shí)。微指令的設(shè)計(jì)與其說是在“寫命令”不如說是在“排交通”每個(gè)節(jié)拍只能安排一個(gè)數(shù)據(jù)源上總線但可以合理安排多個(gè)目的地同時(shí)接收。后面第3章講具體編寫時(shí)你會(huì)反復(fù)用到這條規(guī)則。2. 實(shí)驗(yàn)環(huán)境與平臺(tái)準(zhǔn)備部件、開關(guān)、手冊(cè)里最容易被忽略的細(xì)節(jié)微程序控制器實(shí)驗(yàn)一般是在專用的教學(xué)實(shí)驗(yàn)平臺(tái)上完成的。不同學(xué)校的平臺(tái)型號(hào)可能不同常見的有CO-2018型、COP2000型等但核心模塊大同小異。以CO-2018這類平臺(tái)為例你會(huì)在實(shí)驗(yàn)箱面板上看到一堆功能模塊事先認(rèn)識(shí)它們比拿著手冊(cè)臨時(shí)找開關(guān)要高效得多。2.1 教學(xué)實(shí)驗(yàn)平臺(tái)的核心部件認(rèn)識(shí)實(shí)驗(yàn)平臺(tái)通常把CPU的各個(gè)組成部分拆成獨(dú)立模塊方便你直接觀察和手動(dòng)控制。常見模塊包括寄存器組一般有R0、R1等通用寄存器有的平臺(tái)還有暫存器。注意區(qū)分寄存器的“輸出使能”和“寫入時(shí)鐘”這兩個(gè)信號(hào)分別控制數(shù)據(jù)的讀出和寫入是實(shí)現(xiàn)單總線隔離的關(guān)鍵。ALU完成算術(shù)邏輯運(yùn)算比如加法、減法、與、或等。它的兩個(gè)輸入一般一個(gè)來(lái)自總線另一個(gè)來(lái)自鎖存器運(yùn)算結(jié)果也送回總線。存儲(chǔ)器模塊包括存儲(chǔ)器芯片和地址寄存器MAR、數(shù)據(jù)寄存器MDR。讀寫信號(hào)需要手動(dòng)或通過微指令控制。微程序控制部件這是實(shí)驗(yàn)的核心區(qū)域一般包括微地址寄存器μPC或μAR、控制存儲(chǔ)器EPROM或SRAM、微指令寄存器μIR以及地址轉(zhuǎn)移邏輯。時(shí)序電路產(chǎn)生節(jié)拍脈沖常見的是T1、T2、T3之類的時(shí)鐘節(jié)拍用來(lái)同步微指令的執(zhí)行。輸入輸出開關(guān)和指示燈數(shù)據(jù)開關(guān)用來(lái)手動(dòng)輸入數(shù)據(jù)或指令指示燈用來(lái)顯示總線數(shù)據(jù)、微地址、指令寄存器內(nèi)容。千萬(wàn)不要忽略任一模塊因?yàn)楹罄m(xù)你寫的每一條微指令里的每一個(gè)字段都對(duì)應(yīng)這些模塊的一個(gè)具體控制信號(hào)。一個(gè)最簡(jiǎn)單的加法指令可能就要同時(shí)控制寄存器輸出、ALU運(yùn)算、結(jié)果寫入等五六路信號(hào)。2.2 微指令字段的拆分與編碼方案談到微程序控制器就繞不開微指令的格式。一條微指令通常分成三個(gè)部分操作控制字段、判別測(cè)試字段、下地址字段。操作控制字段是最核心的部分它決定這個(gè)節(jié)拍里各個(gè)部件做什么動(dòng)作。教材里講了三種編碼方式實(shí)驗(yàn)平臺(tái)最常用的是“直接控制”和“字段譯碼”的折中方案。直接控制法微指令里每一位對(duì)應(yīng)一個(gè)微命令比如第0位控制PC輸出、第1位控制MAR寫入等。優(yōu)點(diǎn)是直觀、速度快缺點(diǎn)是位數(shù)太多一條微指令會(huì)非常長(zhǎng)。字段譯碼法把互斥的微命令分成一組用二進(jìn)制編碼表示。比如控制“把哪個(gè)寄存器的值送到總線”這個(gè)動(dòng)作可以直接用2位二進(jìn)制編碼表示4個(gè)寄存器譯碼后產(chǎn)生對(duì)應(yīng)的輸出信號(hào)。優(yōu)點(diǎn)是微指令大大縮短缺點(diǎn)是譯碼電路有延遲?;旌暇幋a法不互斥的、要求并行執(zhí)行的信號(hào)用直接控制互斥的信號(hào)用字段譯碼。實(shí)驗(yàn)平臺(tái)通常采用這種方式。寫實(shí)驗(yàn)報(bào)告時(shí)老師特別希望看到你對(duì)編碼方案的分析為什么某些信號(hào)可以分組、某些不能核心判斷依據(jù)就是互斥性——如果兩個(gè)微命令絕不可能在同一個(gè)節(jié)拍同時(shí)出現(xiàn)它們就可以放在同一組里譯碼如果它們經(jīng)常需要同時(shí)有效就必須各自獨(dú)立占位。比如寄存器R0和R1的“輸出到總線”是互斥的因?yàn)閱慰偩€同一時(shí)刻只允許一個(gè)寄存器輸出它們就可以編成一組而“PC輸出”和“PC加一”雖然都在取指周期出現(xiàn)但嚴(yán)格來(lái)說加一是對(duì)PC內(nèi)部計(jì)數(shù)器的操作輸出是送到總線兩者并不互斥設(shè)計(jì)時(shí)要仔細(xì)分析。2.3 微地址生成邏輯計(jì)數(shù)器方式與斷定方式微程序是一條條按順序執(zhí)行的但和機(jī)器指令一樣它也有“順序執(zhí)行”和“跳轉(zhuǎn)”兩種流程。微地址的生成方式主要有兩種第一種是計(jì)數(shù)器方式。微程序按順序存放在控制存儲(chǔ)器中每執(zhí)行完一條微指令微地址自動(dòng)加一指向下一條。取指周期完成后的微程序入口、不同機(jī)器指令加法、跳轉(zhuǎn)、傳送對(duì)應(yīng)的執(zhí)行微程序入口都需要用某種方式跳轉(zhuǎn)過去這就要靠分支或轉(zhuǎn)移能力。第二種是斷定方式也叫下地址字段方式。每條微指令的下地址字段直接給出下一條微指令的地址或者通過某個(gè)判別條件決定下地址是A還是B。這種方式的好處是靈活每條指令都能顯式指定后繼地址代價(jià)是微指令長(zhǎng)度增加。實(shí)驗(yàn)平臺(tái)通常把兩種方式結(jié)合起來(lái)。微指令中有一個(gè)“判別測(cè)試字段P”根據(jù)某個(gè)條件比如當(dāng)前操作的機(jī)器指令是什么、運(yùn)算結(jié)果是否為0來(lái)決定下地址如何產(chǎn)生。這里的“條件”非常關(guān)鍵在取指周期結(jié)束后控制器必須根據(jù)IR中存放的機(jī)器指令操作碼跳轉(zhuǎn)到對(duì)應(yīng)的執(zhí)行微程序入口這就是所謂“操作碼譯碼形成微程序入口地址”。2.4 動(dòng)手前必須完成的“靜態(tài)檢查”清單去實(shí)驗(yàn)室之前先對(duì)照平臺(tái)手冊(cè)畫一張微指令格式表把每個(gè)字段的映射關(guān)系寫清楚。這一步看起來(lái)繁瑣但能避免你在平臺(tái)上對(duì)著手冊(cè)翻來(lái)翻去。我在實(shí)際操作中總結(jié)了一份“靜態(tài)檢查清單”每次實(shí)驗(yàn)前都會(huì)過一遍連線是否完整檢查各模塊間的數(shù)據(jù)總線、控制信號(hào)線是否按實(shí)驗(yàn)手冊(cè)要求接好有沒有松動(dòng)或插反。開關(guān)初始狀態(tài)數(shù)據(jù)開關(guān)是否全部處于非選中狀態(tài)避免上電瞬間總線沖突。存儲(chǔ)器/微程序存儲(chǔ)器的寫保護(hù)狀態(tài)還沒到寫入步驟時(shí)一定確保讀寫開關(guān)處于“讀”的位置防止誤寫。時(shí)鐘源選擇是使用平臺(tái)內(nèi)部連續(xù)脈沖還是手動(dòng)單步脈沖調(diào)試階段強(qiáng)烈建議先選擇手動(dòng)單步。復(fù)位狀態(tài)實(shí)驗(yàn)箱上電后先做一次復(fù)位讓PC、μPC回到初始狀態(tài)。這一步被很多人跳過結(jié)果程序一啟動(dòng)就跑飛。做完這五步再上電大概率能避開一半以上的低級(jí)問題。3. 從指令集到微程序一次算術(shù)指令的完整編寫過程解決了環(huán)境和理解問題下面進(jìn)入核心怎么把一條機(jī)器指令變成一段能在實(shí)驗(yàn)平臺(tái)上運(yùn)行的微程序。我這里不針對(duì)某一款具體平臺(tái)的開關(guān)名寫死步驟那樣換個(gè)型號(hào)就不適用了而是講完整的實(shí)現(xiàn)思路你完全可以移植到自己的平臺(tái)和手冊(cè)上。3.1 先把指令周期拆成微操作序列假設(shè)要實(shí)現(xiàn)一條“加法指令”功能是把某個(gè)寄存器比如R0的值和另一個(gè)寄存器比如R1的值相加結(jié)果存回R0。機(jī)器指令會(huì)有一個(gè)操作碼假設(shè)叫ADD。在編寫微程序前先強(qiáng)制自己寫出一份完整的微操作序列這個(gè)過程叫“指令流程分解”。ADD指令的執(zhí)行可以分為兩個(gè)周期取指周期所有指令公用和執(zhí)行周期ADD專用。取指周期微操作序列T1PC輸出到總線MAR接收地址同時(shí)PC1。T2根據(jù)MAR地址讀存儲(chǔ)器MDR接收指令數(shù)據(jù)。T3MDR輸出到總線IR接收形成指令。執(zhí)行周期微操作序列ADD R0, R1T4R1輸出到總線ALU的A鎖存器接收。T5R0輸出到總線ALU的B鎖存器接收ALU執(zhí)行加法。T6ALU結(jié)果輸出到總線R0接收。這只是一個(gè)簡(jiǎn)化模型實(shí)際實(shí)驗(yàn)平臺(tái)可能還需要考慮暫存器、ALU輸入通路等細(xì)節(jié)但方法論是通用的。注意一個(gè)關(guān)鍵點(diǎn)每個(gè)微周期里總線上最多只有一個(gè)數(shù)據(jù)源。我在T4里讓R1輸出、同時(shí)ALU的A鎖存器接收是合理的如果我貪心想在同一拍里同時(shí)讓R1和R0都輸出總線就沖突了。這就是前面強(qiáng)調(diào)的單總線約束在實(shí)際設(shè)計(jì)中的體現(xiàn)。3.2 微程序的編寫與存儲(chǔ)有了微操作序列下一步就是把每一步轉(zhuǎn)換成一條微指令。你需要使用平臺(tái)手冊(cè)上的微指令格式比如“控制字段判別字段下地址字段”逐條填寫。以取指周期第一條微指令為例它需要完成的動(dòng)作是“PC→MAR”PC內(nèi)容送地址寄存器和“PC1”。填寫時(shí)就需要在相應(yīng)字段里置上對(duì)應(yīng)控制信號(hào)。再比如取指周期最后一條微指令“MDR→IR”除了要打開MDR的輸出門和IR的寫入時(shí)鐘外還需要把判別字段P設(shè)置為“根據(jù)指令操作碼譯碼”下地址字段填寫默認(rèn)的取下一條指令的入口地址或執(zhí)行微程序的首地址。這樣才能讓控制器在取指完成后自動(dòng)跳轉(zhuǎn)到正確指令的執(zhí)行微程序去。這里有個(gè)設(shè)計(jì)上的常見技巧所有機(jī)器指令的取指微程序通常是公用的。也就是說不管是什么指令取指都走同樣一段微程序差別只在取指結(jié)束后的跳轉(zhuǎn)目標(biāo)不同。你可以把取指微程序放在控制存儲(chǔ)器的固定地址區(qū)然后各條指令的執(zhí)行微程序分散在不同區(qū)域通過操作碼譯碼跳轉(zhuǎn)過去。這樣設(shè)計(jì)的好處是省空間、結(jié)構(gòu)清晰寫實(shí)驗(yàn)報(bào)告時(shí)也是加分項(xiàng)。微程序編寫完成后還需要手工或通過軟件工具生成對(duì)應(yīng)的二進(jìn)制代碼然后寫入控制存儲(chǔ)器。教學(xué)平臺(tái)一般支持兩種方式一種是手動(dòng)撥動(dòng)數(shù)據(jù)開關(guān)逐條寫入另一種是借助PC端軟件將微程序代碼下載到實(shí)驗(yàn)平臺(tái)的存儲(chǔ)芯片中。能用軟件下載就盡量用軟件效率高得多也方便反復(fù)修改。3.3 運(yùn)行與調(diào)試單步執(zhí)行、信號(hào)觀測(cè)、結(jié)果驗(yàn)證微程序?qū)懭牒缶涂梢赃\(yùn)行調(diào)試了。調(diào)試順序有講究千萬(wàn)別一上來(lái)就連續(xù)運(yùn)行。第一步是“單微周期執(zhí)行”。把時(shí)鐘調(diào)到單步模式每按一次按鈕控制器只執(zhí)行一條微指令。觀察面板上的微地址顯示看它是否按預(yù)期遞增或跳轉(zhuǎn)。如果微地址走的不是你設(shè)計(jì)中的順序立刻就能發(fā)現(xiàn)不需要等整個(gè)程序跑完再猜哪里錯(cuò)了。第二步是“單指令執(zhí)行”。在微周期正常的前提下?lián)苋胍粭l機(jī)器指令比如ADD讓控制器完成完整的取指和執(zhí)行周期觀察指令寄存器IR的內(nèi)容、總線上每一步傳的數(shù)據(jù)、ALU的運(yùn)算結(jié)果。第三步才是“連續(xù)運(yùn)行”或“多指令運(yùn)行”。此時(shí)如果結(jié)果出錯(cuò)大部分情況是微操作的時(shí)序問題或者某個(gè)控制信號(hào)沒被正確置位。我調(diào)試時(shí)最愛看的是總線和微地址兩組指示燈??偩€指示燈直接反映每個(gè)節(jié)拍到底哪個(gè)部件的數(shù)據(jù)被送到了總線上微地址則反映控制流程走的是不是預(yù)期路線。兩者結(jié)合基本能把絕大多數(shù)邏輯錯(cuò)誤定位到某一條微指令上。4. 實(shí)驗(yàn)中的經(jīng)典問題排查計(jì)數(shù)器、時(shí)序、總線沖突做微程序控制器實(shí)驗(yàn)崩潰的瞬間往往不在編寫階段而在運(yùn)行階段。下面幾個(gè)問題是我?guī)?shí)驗(yàn)中遇到最多的也是搜索“計(jì)算機(jī)組成原理實(shí)驗(yàn)計(jì)數(shù)器”“單總線CPU”時(shí)最常被問到的類型我把完整的排查鏈路寫出來(lái)供你調(diào)試時(shí)對(duì)照。4.1 微指令計(jì)數(shù)器不遞增的排查鏈路現(xiàn)象按下單步執(zhí)行按鈕微地址顯示始終不變或者一直停在同一個(gè)地址。排查第一步檢查時(shí)鐘是否有效到達(dá)μPC。微程序計(jì)數(shù)器是在時(shí)鐘邊沿觸發(fā)遞增的如果時(shí)鐘信號(hào)沒接上或者被短路到地計(jì)數(shù)器自然不動(dòng)。用示波器或者平臺(tái)上的時(shí)鐘指示燈確認(rèn)手動(dòng)單步時(shí)每按一次按鈕應(yīng)該能看到一個(gè)脈沖。排查第二步檢查復(fù)位信號(hào)是否持續(xù)有效。很多平臺(tái)有一個(gè)全局復(fù)位開關(guān)它會(huì)讓?duì)蘌C清零。如果復(fù)位開關(guān)沒有彈起或者復(fù)位信號(hào)被某個(gè)跳線強(qiáng)制拉低μPC就會(huì)被反復(fù)清零看起來(lái)就像“完全不遞增”。這也是為什么我強(qiáng)調(diào)上電后先做一次復(fù)位再開始同時(shí)確保復(fù)位狀態(tài)已經(jīng)解除。排查第三步確認(rèn)中斷或暫停信號(hào)沒有生效。有些平臺(tái)有暫停/運(yùn)行控制邏輯微地址生成邏輯中有等待信號(hào)。如果某個(gè)判別條件一直滿足暫停請(qǐng)求控制器會(huì)一直停在當(dāng)前微周期。把判別測(cè)試字段清掉或者讓相應(yīng)條件失效再試一次。排查第四步重點(diǎn)確認(rèn)微地址字段本身沒寫錯(cuò)。不少同學(xué)把微指令的下地址字段算錯(cuò)或者填錯(cuò)導(dǎo)致控制器其實(shí)在執(zhí)行跳轉(zhuǎn)指令但跳轉(zhuǎn)目標(biāo)還是當(dāng)前地址看起來(lái)跟“沒遞增”一樣。把這條微指令的下地址字段單獨(dú)提取出來(lái)和當(dāng)前微地址做比較手工推導(dǎo)一遍排除這類低級(jí)的邏輯錯(cuò)誤。4.2 總線沖突多個(gè)部件同時(shí)輸出的根源現(xiàn)象總線指示燈出現(xiàn)多位同時(shí)為1或者看起來(lái)像“疊加”的亂碼ALU結(jié)果寄存器里存儲(chǔ)的值忽對(duì)忽錯(cuò)??偩€沖突的本質(zhì)只有一個(gè)同一時(shí)刻有多個(gè)部件的輸出使能同時(shí)有效都在往總線上灌數(shù)據(jù)。在單總線結(jié)構(gòu)里數(shù)據(jù)總線是共享的多個(gè)輸出驅(qū)動(dòng)同一組線結(jié)果既不是A也不是B而是電氣上的疊加無(wú)法得到任何邏輯值。排查思路從微指令本身入手。調(diào)出當(dāng)前微周期的控制字段看看哪些輸出門信號(hào)被置成了有效狀態(tài)。我曾經(jīng)遇到過一個(gè)同學(xué)他設(shè)計(jì)時(shí)想把R0的數(shù)據(jù)送給ALU又把R1的數(shù)據(jù)送給ALU“準(zhǔn)備下一次運(yùn)算”結(jié)果一條微指令里同時(shí)打開了兩個(gè)寄存器的輸出開關(guān)總線立刻沖突。要避免這個(gè)問題動(dòng)手寫微指令之前就要給自己立一個(gè)規(guī)定每寫一條微指令先用偽代碼把總線上傳輸?shù)臄?shù)據(jù)流畫出來(lái)只允許一個(gè)“源”箭頭指向總線但可以有多個(gè)“目的”箭頭從總線引出。一條微指令里出現(xiàn)兩個(gè)及以上源箭頭就要立刻修改。4.3 實(shí)驗(yàn)計(jì)數(shù)器模塊的觀測(cè)與微程序地址顯示熱搜詞里的“計(jì)算機(jī)組成原理實(shí)驗(yàn)計(jì)數(shù)器”其實(shí)包含了兩個(gè)不同的東西很多初學(xué)者容易混淆。一個(gè)是程序計(jì)數(shù)器PC記錄的是正在執(zhí)行的機(jī)器指令的地址另一個(gè)是微程序計(jì)數(shù)器μPC或微地址寄存器記錄的是當(dāng)前微指令在控制存儲(chǔ)器中的位置。實(shí)驗(yàn)平臺(tái)面板上通常都有這兩個(gè)計(jì)數(shù)器的顯示區(qū)域做實(shí)驗(yàn)時(shí)一定要分清楚。調(diào)試時(shí)你會(huì)發(fā)現(xiàn)執(zhí)行一條機(jī)器指令PC可能只加了1取指完成后加1但μPC卻走過了好幾步取指周期有3條微指令執(zhí)行周期又有好幾條微指令。這就是“兩級(jí)編程”的體現(xiàn)機(jī)器指令層和微指令層是兩層不同的地址空間。很多同學(xué)在實(shí)驗(yàn)報(bào)告里把PC的值和微地址混著寫結(jié)果時(shí)序圖完全對(duì)不上。我建議畫時(shí)序圖時(shí)用兩條獨(dú)立的時(shí)間線分別標(biāo)注PC和μPC的變化層次一目了然。還有一個(gè)容易踩的坑有些實(shí)驗(yàn)平臺(tái)為了演示方便把PC也做成了可以手動(dòng)置數(shù)的并且在取指時(shí)不自動(dòng)加一需要你用一條專門的微指令去執(zhí)行PC加一操作。這意味著每條指令的取指微程序里都必須包含PC1這個(gè)微操作漏了它程序就會(huì)反復(fù)讀取同一條指令形成死循環(huán)。這種設(shè)計(jì)在實(shí)際CPU里很少見但在教學(xué)平臺(tái)中很常見一定要看手冊(cè)確認(rèn)。4.4 指令執(zhí)行結(jié)果不正確從時(shí)序到控制的細(xì)致排查如果總線沒沖突、微地址也對(duì)但最終結(jié)果還是不對(duì)那問題可能出在部件的工作時(shí)序上。舉個(gè)例子寄存器寫入通常要求數(shù)據(jù)在總線上穩(wěn)定建立一段時(shí)間然后在時(shí)鐘邊沿打入如果數(shù)據(jù)還沒穩(wěn)定就發(fā)寫入信號(hào)寫入的內(nèi)容自然不對(duì)。這類問題的排查方法只有一個(gè)逐節(jié)拍核對(duì)。把仿真波形或者平臺(tái)指示燈顯示的數(shù)據(jù)和你在紙上推演的微操作序列一行一行對(duì)。重點(diǎn)檢查三處數(shù)據(jù)送入的鎖存/打入信號(hào)是否早于數(shù)據(jù)有效部件的輸入源是否選對(duì)了運(yùn)算結(jié)果輸出是否有足夠的建立時(shí)間被下一級(jí)接收。實(shí)驗(yàn)平臺(tái)的節(jié)拍發(fā)生器是固定的你能調(diào)整的其實(shí)是微指令內(nèi)部的信號(hào)安排——盡量把數(shù)據(jù)源信號(hào)的起始時(shí)間提前把接收信號(hào)的時(shí)刻放在節(jié)拍后沿這樣能爭(zhēng)取更多的建立時(shí)間。5. 從實(shí)驗(yàn)到考試期末與考研繞不開的幾個(gè)核心考點(diǎn)既然做到這個(gè)實(shí)驗(yàn)了肯定繞不開期末考試和考研。很多同學(xué)實(shí)驗(yàn)做完就丟到一邊其實(shí)實(shí)驗(yàn)里那些操作細(xì)節(jié)恰恰是考題的絕佳素材。我根據(jù)帶學(xué)生復(fù)習(xí)的經(jīng)驗(yàn)把實(shí)驗(yàn)對(duì)應(yīng)的考點(diǎn)拎出來(lái)串一遍幫你實(shí)現(xiàn)“實(shí)驗(yàn)報(bào)告”與“試卷得分”之間的轉(zhuǎn)化。5.1 微指令格式與編碼方式的對(duì)比題期末考試最基礎(chǔ)的一類題是給出一條微指令的二進(jìn)制編碼讓你指出每一個(gè)字段的含義或者反過來(lái)給你一條機(jī)器指令的微操作序列讓你編寫對(duì)應(yīng)的微指令編碼。這類題考察的就是你對(duì)微指令格式的熟悉程度。做題時(shí)注意幾點(diǎn)看清楚題目用的是直接控制還是字段譯碼如果用了字段譯碼要知道譯碼器的輸入編碼與輸出信號(hào)的對(duì)應(yīng)關(guān)系下地址字段多少位能尋址多大范圍的控制存儲(chǔ)器。這些在實(shí)驗(yàn)中都親手填寫過做題時(shí)會(huì)很有畫面感。5.2 微地址轉(zhuǎn)移的常見考法考研題和期末大題更喜歡的考法是給出控制存儲(chǔ)器的容量、微指令格式中判別測(cè)試字段的位數(shù)、下地址字段的位數(shù)讓你計(jì)算能容納多少條微指令、最多有多少個(gè)判別分支或者給出一段帶條件跳轉(zhuǎn)的微程序流程讓你標(biāo)出每條微指令的下地址。這類題的核心在于理解判別測(cè)試字段如何影響微地址生成。常見的硬件邏輯是當(dāng)判別測(cè)試字段無(wú)效時(shí)下地址直接等于“下地址字段內(nèi)的值”當(dāng)判別測(cè)試字段有效時(shí)根據(jù)條件從“下地址字段的值”和“某個(gè)固定分支地址”中選擇一個(gè)。做題時(shí)要把這兩種情況分開討論。實(shí)驗(yàn)里你跳轉(zhuǎn)到各指令執(zhí)行微程序入口的操作本質(zhì)上就是這個(gè)機(jī)制的硬件實(shí)現(xiàn)。5.3 把實(shí)驗(yàn)報(bào)告寫成加分項(xiàng)的技巧最后給寫實(shí)驗(yàn)報(bào)告的同學(xué)一點(diǎn)建議。實(shí)驗(yàn)報(bào)告不只是記錄你做了什么更是向老師證明你“想清楚了”。我建議報(bào)告里包含這五部分微程序設(shè)計(jì)方案畫出指令流程分解圖標(biāo)出每條微指令的微操作和所用節(jié)拍。微指令編碼表用表格列出每條微指令的控制字段、判別字段、下地址字段及對(duì)應(yīng)二進(jìn)制編碼。關(guān)鍵信號(hào)時(shí)序說明挑一兩條關(guān)鍵微指令說明為什么這個(gè)節(jié)拍安排這些微操作尤其要解釋總線數(shù)據(jù)流的單源原則。調(diào)試過程與問題記錄記錄你遇到的卡點(diǎn)、排除思路和最終解決方式。這部分是老師最看重的真實(shí)記錄比“一切順利”有價(jià)值得多。優(yōu)化思考如果你能提出對(duì)該微程序設(shè)計(jì)的簡(jiǎn)化方案或者指出當(dāng)前設(shè)計(jì)的不足報(bào)告會(huì)明顯上一個(gè)檔次。每次帶學(xué)弟學(xué)妹做這個(gè)實(shí)驗(yàn)我都會(huì)讓他們先合上手冊(cè)用白紙把“取指周期三條微指令”默寫出來(lái)。能默寫出來(lái)后面所有的操作都順理成章默寫不出來(lái)在實(shí)驗(yàn)箱前看再久也是瞎猜。這個(gè)習(xí)慣我也建議你試試。微程序控制器實(shí)驗(yàn)最有意思的地方就是它把教材上最抽象的“控制”二字變成了一條條你能親手指定的微指令和能親眼看到的總線數(shù)據(jù)流。一旦你真正看懂了一條機(jī)器指令是如何被微程序一步步“翻譯”并執(zhí)行的計(jì)算機(jī)組成原理這門課最難的那道坎就算徹底邁過去了。