6.4 訪存指令的控制信號


計算機組成

6 單周期處理器

6.4 訪存指令的控制信號

Screen Shot 2018-09-29 at 7.53.33 pm

對於MIPS這樣的指令系統來說,其運算指令是不能直接訪問存儲器的,因此,我們還需要設計單獨的訪存指令,用來完成寄存器和存儲器之間的數據傳輸。在這一節,我們就來看一看這一類訪存指令是如何生成控制信號的。

Screen Shot 2018-09-29 at 7.53.42 pm

對於我們要實現的這個處理器,訪存指令都是屬於 I 型指令,一條是load,一條是store。我們分別來進行分析。

Screen Shot 2018-09-29 at 7.53.51 pm

對於load指令。首先,當然也是取指;然后根據運算出的地址,訪問數據存儲器,並將讀出的內容寫入到 rt 指定的寄存器中;最后,是更新PC寄存器。 那第一步和第三步,與運算指令都是一樣的。在這里我們就只講解第二步相關的操作。

Screen Shot 2018-09-29 at 7.54.00 pm

這是我們的數據通路,如果當前IFU 取回的是一條load指令,那這些控制信號將會如何設置呢? 首先,下一條指令的地址應該還是采用PC+4的方式。然后我們來看寄存器堆這一邊,rs 和 rt 都是固定連接到了指令編碼的對應位域,因此,busA 和 busB 這兩組信號上,分別是由rs和rt所指定的寄存器的內容。

Screen Shot 2018-09-29 at 7.54.08 pm

但我們要注意,對於這條指令,我們想要運算的是rs寄存器中的內容和立即數的符號擴展進行加法。因此,對於ALU的第二個操作數的來源,我們應該通過這個多選器(ALUSrc),選擇通道1,並且設置擴展部件為符號擴展的功能(ExtOp=“sign”)。這樣,指令位域中的16位立即數就會經過符號擴展,最終連接到了ALU的第二個輸入端,而我們發送到ALU的控制信號,則是要設置為加法運算(ALUCtr=“ADD”)。 這樣,ALU就會完成了訪存地址的運算,並將地址信號送到數據存儲器的地址輸入端(Adr)。同時我們也要注意,busB上的信號也會被連接到數據存儲器(Data Memory)的數據輸入端(Data In),雖然我們並不需要它,但是這根信號仍然會把 rt 所指定的寄存器的內容送過來。 所以我們需要設置數據存儲器的寫使能信號(MemWr)把它設為0,保證了數據存儲器的內容不會發生改變。 然后我們來看最后這個多選器,這個多選器的兩個輸入,一個是ALU的運算結果,就是訪存的地址;另一個是從數據存儲器當中,讀出的數據。 那么對於這條指令,我們顯然希望把后者送到寄存器堆當中去。因此,對於這個多選器來說,我們需要設置它的選擇信號為1(MemtoReg=1), 這樣我們就可以把數據存儲器的輸出傳送到寄存器堆的數據輸入端(busW),
而且因為我們要寫入 rt 所指定的寄存器,所以,我們需要設置寄存器堆的寫使能信號為有效(RegWr=1),並把寫入寄存器編號的來源設置為rt(RegDst=0)。

Screen Shot 2018-09-29 at 7.54.17 pm

這樣,在下一個時鍾上升沿到來的時候,數據存儲器輸出的內容就會被寫入到rt所指定的寄存器當中去了,而且在同樣的這個時鍾上升沿,PC寄存器的內容也會被更新為PC+4,這就是load指令所完成的操作。

Screen Shot 2018-09-29 at 7.54.28 pm

然后我們來看store指令,store指令也分為三步,同樣,我們也只看其中的第二步。

Screen Shot 2018-09-29 at 7.54.37 pm

對於store指令,我們也需要將rs寄存器中的內容和立即數 的符號擴展進行加法運算,並以此作為地址訪問數據存儲器, 不過不是讀出,而是寫入。因此,對應到數據通路上,我們就直接標出了對於store指令,有效的這些信號。 那這些控制信號又該如何設置呢? 那你不妨自己想一想,然后我們一起快速地瀏覽一遍。 對於IFU,我們要選擇下一條指令的地址, 仍然是PC+4(nPC_sel="+4"),我們要選擇ALU的數據的輸入,現在我們選的是立即數的符號擴展(ExtOp=“sign”; ALUSrc=1), 而對於ALU,我們依然要選擇加法的運算類型(ALUCtr=“ADD”)。ALU的運算結果,依然是一個地址,會被送到數據存儲器上。但是與之前不同的是,這條指令要完成向數據存儲器的寫操作。所以,在這里我們會把數據存儲器的寫使能信號置為有效(MemWr=1)。 這樣,在下一個時鍾的上升沿,數據存儲器就會采樣其數據輸入端(Data In)的信號,但這個輸入端的信號又是什么呢?我們可以看一看,實際上它連到了busB,而 busB是由rt這個信號所指定的寄存器中的內容。 因此,在下一個時鍾上升沿到來的時候,數據存儲器會根據ALU算出來的地址(Adr),選中對應的存儲單元,並采樣這個來自rt寄存器當中的內容,將它存到對應的存儲單元中去。 對於store指令來說,它就完成了它所需要做的主體的操作,但是對於這個數據通路,我們必須要把剩下的控制信號都設置完整。

我們來看后面這個多選器,因為對store指令,我們不需要改寫寄存器堆的內容, 所以無論選擇哪個通路,都是沒有意義的。 在這里,我們就設置這個控制信號,可以是0,也可以是1,就用x來進行標記(MemtoReg=x)。 那這樣,這個多選器總會選出一組信號,最終送到寄存器堆的數據輸入端。不過沒有關系,我們只需要設置寄存器堆的寫使能信號為無效(RegWr=0),在時鍾上升沿到來的時候,寄存器堆的內容就不會發生改變。也正因為如此,這個要寫入的寄存器編號,無論設成rb還是rt(RegDst=x)也都是可以的。

這就是對於store指令的控制信號的設置方法。

Screen Shot 2018-09-29 at 7.54.46 pm

現在,我們已經掌握了訪存指令是如何生成控制信號的,再加上之前的運算指令,我們就可以編寫程序,讓計算機完成相應的任務了。不過,如果我們想編寫出功能更為強大的程序,那只有運算指令和訪存指令是不夠的,我們還需要改變程序流向的分支指令。這一點,我們在下一節繼續分析。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM