日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自己动手写CPU(3)逻辑、移位操作与空指令

發布時間:2023/12/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自己动手写CPU(3)逻辑、移位操作与空指令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自己動手寫CPU(3)邏輯、移位操作與空指令

指令說明

MIPS32指令集架構中定義的邏輯操作指令有8條: and、andi、or、ori、xor、xori、nor、lui,其中 ori指令已經實現。

MIPS32指令集架構中定義的移位操作指令有6條: sll、sllv、sra、srav、srl、srlv。

MIPS32指令集架構中定義的空指令有2條: nop、ssnop。其中 ssnop是一種特殊類型的空操作,在每個周期發射多條指令的CPU中,使用ssnop指令可以確保單獨占用一個發射周期。OpenMIPS 設計為標量處理器,也就是每個周期發射一條指令,所以ssnop 的作用與nop相同,可以按照nop指令的處理方式來處理ssnop指令。

此外還有sync、pref這兩條指令,其中sync指令用于保證加載、存儲操作的順序,但對于OpenMIPS而言,它是嚴格按照指令順序執行的,加載、存儲操作也是按照操作順序進行的,所以可以將sync指令當做nop指令處理;pref指令用于緩存預取,OpenMIPS未實現緩存,所以也將該指令當做nop指令處理。

指令格式

and、or、xor、nor指令格式

  • and指令,功能碼是6’b100100,邏輯“與”運算。

    指令用法:and rd, rs,rt (rd <- rs AND rt)

  • or指令,功能碼是6’b100101,邏輯“或”運算。

    指令用法:or rd, rs,rt (rd <- rs OR rt)

  • xor指令,功能碼是6’b100110,異或運算。

    指令用法:xor rd, rs,rt (rd <- rs XOR rt)

  • nor指令,功能碼是6’b100111,或非運算。

    指令用法:nor rd, rs,rt (rd <- rs NOR rt)

  • andi、xori指令格式

  • andi指令,指令碼是6’b001100,邏輯“與”運算。

    指令用法:andi rt, rs,imm ( rt <- rs AND zero_extended(imm) )

  • xori指令,指令碼是6’b01110,邏輯“異或”運算

    指令用法:xori rt, rs,imm ( rt <- rs XORI zero_extended(imm) )

  • lui指令格式

    指令用法:lui rt,imm ( rt <- imm || 0^16 , 即將指令中的16bit立即數保存到地址為rt的通用寄存器的高16位,低16位用0填充)

    sll、srl、sra、sllv、srlv、 srav指令格式

  • sll指令,功能碼是6’b000000,邏輯左移

    指令用法:sll rd,rt,sa ( rd <- rt << sa(logic) rt的值向左移位sa位,空出來的位置用0填充,結果保存到地址為rd的通用寄存器中)

  • srl指令,功能碼是6’b000010,邏輯右移

    指令用法:srl rd,rt,sa ( rd <- rt >> sa(logic) rt的值向右移位sa位,空出來的位置用0填充,結果保存到地址為rd的通用寄存器中)

  • sra指令,功能碼是6’b000011,算術右移

    指令用法:sra rd,rt,sa ( rd <- rt >> sa(arithmetic) rt的值向右移位sa位,空出來的位置用rt[31]的值填充,結果保存到地址為rd的通用寄存器中)

  • sllv指令,功能碼是6’b000100,邏輯左移

    指令用法:sllv rd,rt,rs ( rd <- rt << rs[4:0] rt的值向左移位rs[4:0]位,空出來的位置用0填充,結果保存到地址為rd的通用寄存器中)

  • srlv指令,功能碼是6’b000110,邏輯右移

    指令用法:srlv rd,rt,rs ( rd <- rt >> rs[4:0] rt的值向右移位rs[4:0]位,空出來的位置用0填充,結果保存到地址為rd的通用寄存器中)

  • srav指令,功能碼是6’b000111,算術右移

    指令用法:srav rd,rt,rs ( rd <- rt >> rs[4:0] rt的值向右移位rs[4:0]位,空出來的位置用rt[31]填充,結果保存到地址為rd的通用寄存器中)

  • nop、ssnop、sync、pref指令格式

    指令說明:空指令

    修改代碼

    為了實現邏輯、移位操作與空指令(其中 nop、ssnop不用特意實現,可以認為是特殊的邏輯左移指令sll),只需要修改OpenMIPS 的如下兩個模塊。

    • 修改譯碼階段的ID模塊,用以實現對上述指令的譯碼。
    • 修改執行階段的EX模塊,使其按照譯碼結果進行運算。

    確定指令種類的過程

    疑問之處:書上提供的sync指令的op[10:6]=00001,但代碼中判斷認為op[10:6]=00000,查閱MIPS32手冊后發現,op[10:6]為stype碼,可以指定多種類型,全0和00001都在其中,如下圖

    仿真結果

    邏輯功能測試波形圖

    移位功能測試波形圖


    與書上提供的匯編代碼結果進行核驗后完全正確,功能正常實現。其中調試邏輯功能波形圖時,寄存器出現X的情況,調試了近兩個小時發現是頂層連線連錯了,真是個低級錯誤,希望大家認真仔細,不要重蹈我的覆轍。

    項目鏈接

    總結

    以上是生活随笔為你收集整理的自己动手写CPU(3)逻辑、移位操作与空指令的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。