宗德才, 王康康
(1.常熟理工學院計算機科學與工程學院,江蘇常熟215500;2.江蘇科技大學數理學院,江蘇鎮江212003)
目前,國內很多高校計算機組成原理實驗教學內容主要是基于TEC-XP16 教學計算機而開展的。為使學生更好地掌握計算機各個組成部件的工作原理,理解指令的執行流程,系統地建立計算機整機概念,需要開發一些設計性實驗,如在TEC-XP16 教學計算機中設計一些浮點運算指令。
文獻[1]中設計了一種4 bit 乘法指令與除法指令,文獻[2-3]中將EDA 軟件Proteus 應用于教學實驗中,缺點是很難形成對計算機硬件的直觀了解,文獻[4]中設計了一個8 bit模型機,設計了14 條指令,文獻[5]中設計了加法等指令,文獻[6]中要求學生至少設計實現7 條指令,文獻[1-6]中都未設計浮點除法等復雜指令。
文獻[7]中介紹了TH-union 教學機微程序控制器的原理及實驗步驟,沒有擴展新指令。文獻[8]中在TEC-2000 教學機微程序控制器中設計實現了4 條簡單的擴展指令。文獻[9]中在TEC-2000 教學機微程序控制器中設計實現了兩條簡單的擴展指令。文獻[8-9]中在TEC-2000 教學機微程序控制器中擴展的指令都比較簡單。文獻[10]中研究了在TEC-XP16 組合邏輯控制器中擴展簡單指令的方法。文獻[11]中提出一種微程序控制器中8 bit 無符號乘法指令與8 bit無符號除法指令的設計方法,均需要20 多條微指令組成的微程序來實現,文獻[8-9,11]中設計好微程序后都采用手工方式修改控制器源程序,效率低、速度慢且容易出錯。
基于TEC-XP16 教學機,設計了一種32 bit IEEE 754 格式的浮點數除法指令以及實現32 bit 浮點數除法運算的算法。用TEC-XP16 教學機的匯編指令設計了實現浮點數除法算法的匯編語言程序。為解決人工方式設計微程序和修改微程序控制器源程序效率低且容易出錯等問題,提出了一種能夠由匯編語言程序自動生成微程序以及能夠由微程序自動修改控制器ABEL 語言源程序的方法。實驗結果表明,所設計的32 bit浮點除法指令的功能是正確的,平均只需要2.16 s就能根據匯編語言程序表自動生成微程序表,平均只需1.3 s 就能根據微程序表、微指令轉移判斷條件表和微程序入口地址表自動修改并生成控制器ABEL語言源程序,極大提高了浮點除法指令的設計效率。該方法也可推廣到其他復雜指令的設計過程。
在TEC-XP16 教學機微程序控制器中擴展指令時,首先,設計新指令對應的微程序,根據微程序修改描述MACH 芯片功能的ABEL 語言源程序[12],然后將修改后的ABEL 語言程序用ISP LEVER 軟件編譯成.jed文件,接著將.jed 文件下載到MACH 芯片中,最后,在教學機上調試運行包含新指令的教學機程序。
本文在TEC-XP16 教學機微程序控制器中設計實現了一種32 bit浮點數除法指令。
在TEC-XP16 教學機微程序控制器中設計浮點除法指令的主要過程如下:
(1)確定32 bit浮點除法指令FDIV 的格式和功能,見表1。

表1 FDIV的指令格式與功能
(2)按32 bit 浮點除法指令的功能和格式,設計32 bit浮點除法算法,如算法1。

圖1 32 bit IEEE754浮點數格式
如圖1 所示,在IEEE 754 格式的32 bit浮點數中最高位是數符,表示浮點數的正負,階碼用移碼表示,階碼的真值都被加上一個偏移量,對于32 bit 浮點數的偏移量為127。
在IEEE 754 格式浮點數中尾數部分通常都是規格化表示的,即非0 的有效位最高位總是1,有效位呈如下形式:1.ffff……fff,在實際的表示中,對于32 bit浮點數,這個整數位的1 被省略,稱為隱藏位。
TEC-XP16 教學機中共有16 個16 bit的通用寄存器R0 ~R15。32 bit浮點數需要用兩個通用寄存器來表示。
算法132 bit 浮點數除法運算算法。被除數與除數都用32 bit IEEE 754 浮點數表示,被除數存放在R1、R0 寄存器,除數存放在R3、R2 寄存器,商為32 bit IEEE 754 浮點數,商存放在R1、R0 寄存器中。
(1)如果R2和R3都是0,即除數近似為0,則置除數為0標記,否則,轉(2);
(2)如果R1和R0都是0,即被除數近似為0,則結果近似為0,結束,否則,轉(3);
(3)取被除數階碼部分,并右移一位,保存在R6 寄存器中,R6中結果為00JJ JJJJ JJ00 0000,其中,J表示階碼部分;
(4)取除數階碼部分,并右移一位,保存在R7 寄存器中,R7中結果為00JJ JJJJ JJ00 0000,其中,J表示階碼部分;
(5)階碼相減:(R6)-(R7)→R6;
(6)浮點數中階碼用移碼表示,移碼是在階碼真值基礎上加127,階碼相減時,127 被減去了,因此,需要把階碼差加上127。即(R6)+(0001 1111 1100 0000)2→R6;
(7)將除法的符號位保存在R7最高位;
(8)取被除數的尾數部分,并恢復隱藏位,存放在R1、R0寄存器,R1、R0 中結果為0000 0000 1WWW WWWW WWWW WWWW WWWW WWWW,其中,W表示階碼部分;
(9)取得除數的尾數部分,并恢復隱藏位,存放在R3、R2寄存器,R3、R2 中結果為0000 0000 1WWW WWWW WWWW WWWW WWWW WWWW,其中,W表示階碼部分;
(10)將R9、R8寄存器清為0,R9、R8寄存器存放商;
(11)令R10寄存器為24,24為相除的次數;
(12)比較R1和R3,相等,轉(13),否則,轉(14);
(13)比較R0和R2,如果(R0)≥(R2),C為1,轉(15);否則,C為0,轉(16)
(14)如果(R1)≥(R3),則C 為1,轉(15),否則,C 為0,轉(16)
(15)R1/ /R0-R3/ /R2→R1/ /R0,
(16)帶進位C循環左移R9、R8,即R9←R8←C
(17)R10減1;
(18)如果R10為0,則執行(20),否則轉(19);
(19)余數R1/ /R0聯合左移一位,轉(12);
(20)此時,R9 和R8 中商為24 位,考慮到被除數小于除數的情形,商要左移一位進行規格化,因此,商要多取一位,取25位,若第25商為1,則令R15為1,否則令R15為0;
(21)將R9、R8內容分別送R1、R0,將R9清0;
(22)如果R1中尾數部分最高位為0,則執行(23),否則,執行(26);
(23)將R15右移一位,R15最低位移入C觸發器;
(24)帶進位C循環左移R1、R0,即R1←R0←C;
(25)階碼減1,即00JJ JJJJ JJ00 0000-0000 0000 0100 0000,其中,J表示階碼部分;
(26)如果R6最高位為1,則為下溢,結果為0,結束;如果R6次高位為1,則為上溢,令C =1,結束;如果R6 最高兩位為00,則執行(27);
(27)R6最高兩位為00 表示結果沒有溢出,令C =0,將R6左移一位,調整R1寄存器的內容,R1最高位即R7 最高位,R1 次高位開始的8位即R6中階碼部分,R1低7位即高7位尾數不變,結束。
(3)根據算法1,用TEC-XP16 教學機的匯編指令編寫程序實現算法1。同時,設計數據庫表。
Python語言具有簡單易學、免費開源和可擴展移植性好等特性[13],選擇Python 語言作為程序設計語言。
如圖2 所示,TEC-XP16 教學機中,一條微指令由16 bit 的下地址字段和32 bit 的控制命令字段共同組成[14]。

圖2 TEC-XP16教學機的微指令格式
根據TEC-XP16 教學機微指令的格式,設計了微程序表MProgram,如表2 所示,用于保存32 bit浮點數除法指令對應的由微指令組成的微程序。
為實現根據匯編程序自動生成微程序這一功能,設計了匯編程序表AsblProgram,見表3,用于保存根據32 bit浮點數除法運算算法編寫的90 條匯編指令組成的匯編程序。

表2 MProgram微程序表

表3 AsblProgram匯編程序表
圖2 中,命令碼用于控制微指令的執行順序,命令碼CI3 ~CI0 為1110 時,順序執行。命令碼CI3 ~CI0為0010 時,根據指令的操作碼確定該指令對應的微程序的入口地址。設計微程序入口地址表MPFAdr,見表4,用于保存32 bit浮點數除法指令對應的微程序的第一條微指令的地址。

表4 MPFAdr微程序入口地址表
命令碼CI3 ~CI0 為0011 時,用于條件微轉移控制,見表5,微轉移條件SCC3 ~SCC0 用于條件微轉移時給出轉移依據的條件,條件滿足時發生轉移,下一條微指令的地址為當前微指令中下地址字段的內容;條件不滿足,順序執行[15]。
根據表5,設計了微指令轉移判斷條件表CC,見表6,用于保存微指令轉移的條件。

表5 條件微指令轉移所依據的判斷條件表

表6 CC微指令轉移判斷條件表
由于每一條匯編指令轉換后的微指令數目不同,設計了ISEA表(見表7)用于存儲每一條匯編指令轉換成為微指令后,對應的第一條微指令地址start 和最后一條微指令的地址end。(4)在匯編程序表AsblProgram中輸入實現32 bit浮點數除法運算算法的匯編程序,共有90 條匯編指令,在微程序入口地址表MPFAdr 中輸入FDIV指令的操作碼1110 1101,微程序入口地址為0100 0000。

表7 ISEA匯編指令微指令地址表
(5)根據算法2,用Python 語言編程(記為程序1),能夠自動將AsblProgram 表中的匯編程序轉換成微程序并寫入MProgram表,根據算法4 為JRZ/JRNZ/JRC/JRNC/JRS/JRNS/JR轉移類指令更新其微指令中的下地址字段Nadr,根據算法5 為JRZ/JRNZ/JRC/JRNC/JRS/JRNS指令生成CC表。
算法2根據AsblProgram 表中的匯編程序生成MProgram表和ISEA表算法。
(1)從AsblProgram表中查找所有記錄的最大Number 字段值,記為maxNum,令i =1;
(2)查找AsblProgram表中Number字段等于i的記錄,記為AsbInsti;
(3)如果記錄AsbInsti 的Itype 為2,即為MVRD 指令,則根據算法3 將MVRD Ri,DATA 指令轉換成微指令并寫入MProgram表,同時在ISEA表中寫入MVRD指令對應的第一條微指令的地址start和最后一條微指令地址end;
如果記錄AsbInsti 的Itype 為1,即為MVRR 指令,則只需轉換成一條相應的微指令并寫入MProgram表,同時在ISEA表中寫入MVRR指令對應的第一條微指令的地址start和最后一條微指令地址end;
如果記錄AsbInsti 的Iname 為OR、AND、ADD、SUB、SBB、XOR、TEST、ADC、CMP、SHR、RCL、SHL、INC、DEC、JR、JRZ、JRNZ、JRC、JRNC、JRS、JRNS、CLC、RET 指令,則只需要轉換成一條相應的微指令并寫入MProgram表,同時在ISEA表中寫入待轉換匯編指令對應的第一條微指令的地址start和最后一條微指令地址end;
如果記錄AsbInsti的Iname為PSHF、POPF指令,則需要轉換成兩條相應的微指令并寫入MProgram表,同時在ISEA表中寫入待轉換匯編指令對應的第一條微指令的地址start和最后一條微指令地址end;
(4)i =i +1,重復(2),(3),直到i >maxNum結束。
在設計的實現FDIV 指令的匯編程序中,用到的MVRD Ri,DATA 指令中,DATA 值有7F80、1FC0、8000、007F、0010、0001、0008、0040、0080、0100。根據DATA值的特點,設計了算法3,算法3 的設計目標是盡量用最少的微指令實現MVRD指令。
算法3MVRD Ri,DATA 指令轉換成微指令算法。
(1)將DATA轉換成16 bit二進制數data16;
(2)計算data16中1的位數,記為num_1(data16);
(3)如果num_1(data16)>1,則執行(4),否則,執行(12);
(4)MVRD指令的第一條微指令為SUB指令對應的微指令,該微指令執行后得到1111 1111 1111 1111;
(5)計算將1111 1111 1111 1111 采用先左移后右移的方法得到data16的次數,記為shiftlr(data16);
(6)計算將1111 1111 1111 1111 采用先右移后左移的方法得到data16的次數,記為shiftrl(data16);
(7)如果shiftlr(data16)小于等于shiftrl(data16),則執行(8),否則,執行(10);
(8)生成16-num_1(data16)條SHL指令對應的微指令;
(9)生成shiftlr(data16)+num_1(data16)-16條SHR指令對應的微指令,結束。
(10)生成16-num_1(data16)條SHR指令對應的微指令;
(11)生成shiftrl(data16)+num_1(data16)- 16 條SHL指令對應的微指令,結束。
(12)計算由0000 0000 0000 00001得到data16的次數,記為leftshift2(data16),則由DATA 得到data16 需要leftshift2(data16)+2條微指令;
(13)計算由1111 1111 1111 11111得到data16的次數,記為shiftlr(data16),則由DATA 得到data16 需要shiftlr(data16)+1條微指令;
(14)如果leftshift2(data16)+2 小于等于shiftlr(data16)+1,則執行(15),否則執行(18);
(15)生成SUB指令對應的微指令,該微指令執行后得到0000 0000 0000 0000;
(16)生成INC指令對應的微指令,該微指令執行后得到0000 0000 0000 0001;
(17)生成leftshift2(data16)條SHL 指令對應的微指令,結束。
(18)生成SUB指令對應的微指令,該微指令執行后得到1111 1111 1111 1111;
(19)生成shiftlr(data16)條SHL 指令對應的微指令,結束。
算法4為JRZ/JRNZ/JRC/JRNC/JRS/JRNS/JR轉移類指令生成微指令中的下地址字段Nadr算法。
JRZ、JRNZ、JRC、JRNC、JRS、JRNS 都只需要轉換成一條微指令即可,但是要根據轉移目標地址更新Nadr字段值。
(1)從AsblProgram 表中查找Itype 為3 或4 的所有記錄(JRZ、JRNZ、JRC、JRNC、JRS、JRNS指令的Itype為3,JR指令的Itype為4),假設查詢結果有n條記錄,令i =1;
(2)根據查詢結果中記錄i的Number字段值在ISEA表中查找start字段值,并轉換成微指令地址,記為JIstart;
(3)在AsblProgram 表中查找Label 字段等于查詢結果中記錄i的DstAdr字段值的記錄的Number字段值,記為number;
(4)在ISEA表中查找Number字段等于number的記錄的start字段值,并轉換成8bit二進制,記為JDstart;
(5)更新MProgram表中MIadr 字段等于JIstart 的記錄的Nadr字段值為JDstart;
(6)i =i +1,重復(2)~(5),直到i >n結束。
算法5為JRZ/JRNZ/JRC/JRNC/JRS/JRNS 指令生成CC表算法。
(1)從AsblProgram 表中查找Iname 為JRZ/JRNZ/JRC/JRNC/JRS/JRNS的所有記錄,假設查詢結果有n 條記錄,令i =1;
(2)在AsblProgram 表中查找Label 字段等于查詢結果中記錄i的DstAdr字段值的記錄的Number字段值,記為number;
(3)在ISEA表中查找Number字段等于number的記錄的start字段值,并轉換成8 bit二進制,記為JDstart;
(4)如果CC 表中還沒有Nadr 等于JDstart 的記錄,則在CC表中插入一條記錄,否則,轉(5);
(5)i =i +1,重復2 ~4步驟,直到i >n結束。
(6)根據算法6,用Python 語言編程(記為程序2),能夠根據MPFAdr表以及程序1 生成的MProgram表、CC表自動生成實現了32 bit浮點除法指令的控制器源文件m256c6.abl。
算法6自動修改并生成微程序控制器源程序的Python語言實現的算法。
(1)打開控制器源程序文件m256c.abl,讀取m256c.abl文件的所有行存放在list1列表對象中;
with open('m256c.abl','r')as f1:
list1 =f1.readlines()
(2)連接FLOATDIV.db數據庫;
db =sqlite3.connect('FLOATDIV.db')
(3)從MPFAdr表中讀取所有記錄,將所有記錄的Iname字段值和Opcode字段值組成一個字符串a,
字符串a為:FDIV =(IR ==[1,1,1,0,1,1,0,1]);
在list1列表對象中找到“Expand Instruction here”字符串,將該字符串替換為字符串a;
(4)從CC表中讀取所有記錄,根據這些記錄的SCC字段值、Iname字段值、Nadr字段值和Condition 字段值修改CC0 表達式;
(5)對MPFAdr表中的每一條記錄,根據MPadr字段值,在list1列表對象中找到D0 ~D7 邏輯表達式所在的行并進行修改,例如,FDIV指令的MPadr 字段值為0100 0000,則D6 表達式中需增加FDIV信號;由于m256c.abl文件中D0 ~D7表達式出現在CC0表達式后面,因此,在list1列表中查找D0 ~D7 時,可以從CC0表達式的下一行開始查找,這樣可提高查找速度;
(6)根據算法7,由MProgram 表中記錄修改list1 列表對象;
(7)將list1列表對象寫入一個新文件m256c6.abl,然后,關閉該文件。
算法7根據MProgram 表中記錄修改list1 列表對象的算法。
(1)從MProgram表中讀取所有記錄,假設有n條記錄;
(2)令i =1;
(3)根據記錄i 的Nadr 字段值,在list1 列表對象中找到NADR7 ~NADR0邏輯表達式所在的行并進行修改;
(4)根據記錄i 的Cmd 字段值,在list1 列表對象中找到CI3 ~CI0邏輯表達式所在的行并進行修改;
(5)根據記錄i 的SCC 字段值,在list1 列表對象中找到SCC3 ~SCC0邏輯表達式所在的行并進行修改;
(6)根據記錄i的MRW字段值,在list1列表對象中找到!_MIO00、REQ00、_WE00邏輯表達式所在的行并進行修改;
(7)根據記錄i 的I2-0 字段值,在list1 列表對象中找到I200、I100、!I000邏輯表達式所在的行并進行修改;
(8)根據記錄i 的I5-3 字段值,在list1 列表對象中找到I500、I400、I300邏輯表達式所在的行并進行修改;
(9)根據記錄i 的I8-6 字段值,在list1 列表對象中找到I800、I700、!I600邏輯表達式所在的行并進行修改;
(10)根據記錄i 的SST 字段值,在list1 列表對象中找到SST200、SST100、SST000邏輯表達式所在的行并進行修改;
(11)根據記錄i的SSHSCI字段值,在list1 列表對象中找到SSH00、SCI100、SCI000邏輯表達式所在的行并進行修改;
(12)根據記錄i的DC2 字段值,在list1 列表對象中找到DC2_200、DC2_100、DC2_000 邏輯表達式所在的行并進行修改;
(13)根據記錄i的DC1 字段值,在list1 列表對象中找到DC1_200、DC1_100、DC1_000 邏輯表達式所在的行并進行修改;
(14)如果記錄i的Bp 字段值為“DR”,則list1 列表對象的B30表達式增加當前記錄的MIadr字段值;如果記錄i的Bp字段值為“SR”,則list1 列表()對象的B301 表達式增加當前記錄的MIadr字段值;如果記錄i的Bp字段值為數字字符,則修改list1列表對象的B300、B20、B10、B00邏輯表達式的值;
(15)如果記錄i的Ap 字段值為“DR”,則list1 列表對象的A301表達式增加當前記錄的MIadr 字段值;如果記錄i 的Ap字段值為“SR”,則list1列表對象的A30 表達式增加當前記錄的MIadr字段值;如果記錄i 的Ap 字段值為數字字符,則修改list1列表對象的A300、A20、A10、A00邏輯表達式的值;
(16)i =i +1,若i <=n,則轉到(3),否則,結束。
SQLite3 數據庫模塊是Python 2.5 之后的內置模塊[16],使用時不用安裝,直接導入即可。為方便python語言編程,按照上述方法在Access 2010 中設計好數據庫表后,使用SQLite Expert工具將Access數據庫轉換成SQLite數據庫。
用Python語言編寫兩個程序,程序1 能夠自動將AsblProgram表中的匯編程序轉換成微程序并寫入MProgram表、CC表和ISEA表,程序2 能根據MPFAdr表和程序1 生成的MProgram、CC 表中的內容自動修改微程序控制器源程序文件,根據MPFAdr 表在控制器源程序中自動添加擴展指令的操作碼與匯編語句的關系表達式以及自動添加擴展指令的微程序入口地址,根據CC表在控制器源程序中CC信號的邏輯表達式中自動添加擴展指令的條件微指令轉移所依據的判斷條件,根據MProgram表在控制器源程序中16 bit下地址字段與32 bit控制信號的邏輯表達式中自動添加相應的微指令地址。先后運行這兩個程序后,會自動生成一個名為m256c6.abl的包括了FDIV指令的控制器源程序文件。
實驗環境為:Intel Core i5 CPU M 450 (2.40 GHz),內存4 GB,Windows 10 操作系統。
將能夠自動將AsblProgram 表中的匯編程序轉換成微程序并寫入MProgram表、CC表和ISEA表的程序1 運行50 次,結果如圖3 所示,最快只需1.9 s,平均需要2.166 s;將能根據MPFAdr 表和程序1 生成的MProgram、CC表中的內容自動修改微程序控制器源程序文件的程序2 運行50 次,結果如圖4 所示,最快只需1.1 s,平均需要1.3 s。

圖3 由AsblProgram表自動生成MProgram表時間

圖4 由MProgram表、CC表等自動產生abl文件時間
在TEC-XP16 教學機微程序控制器中擴展FDIV指令的完整過程如下:
(1)在Access 2010 數據庫中創建AsblProgram 匯編程序表、MProgram微程序表、CC微指令轉移判斷條件表、MPFAdr微程序入口地址表和匯編指令微指令地址表ISEA,并且在AsblProgram表輸入實現32 bit 浮點除法指令FDIV 的90 條匯編指令,在MPFAdr表中輸入FDIV 指令對應的微程序入口地址0100 0000。
(2)使用SQLite Expert 工具將Access 數據庫轉換成SQLite數據庫。
(3)用Python語言編寫程序1,該程序能從SQLite數據庫自動讀取AsblProgram表中的匯編指令并自動生成微程序、微指令轉移條件、每條匯編指令的微指令起始地址并分別寫入MProgram表、CC表和ISEA表。
(4)用Python語言編寫程序2,該程序能從SQLite3 數據庫自動讀取并根據MProgram表、CC 表和MPFAdr 表中的內容自動修改m256c.abl文件并生成一個新的微程序控制器源程序文件。
(5)先后運行程序1 和程序2,會自動生成一個名為m256c6.abl的實現了FDIV指令的控制器源程序文件。
(6)將m256c6.abl文件重命名為m256c.abl。
(7)啟動Lattice ispLEVER Classic Project Navigator 軟件,新建一個名為lc4256 的項目文件,將m256c.abl 添加到項目中,然后,將m256c.abl編譯后生成名為lc4256.jed 的文件,將lc4256.jed下載到教學機MACH芯片中。方法詳見文獻[11]。
(8)啟動WinPcec16軟件,然后啟動教學機監控程序。
(9)在WinPcec16軟件中編寫一個實現2個32 bit浮點數除法的教學機程序,如圖5 ~6所示,教學機中規定擴展指令必須用E命令寫入教學機內存,FDIV指令的二進制代碼為ED00(十六進制形式),ED 為FDIV 指令的操作碼,被除數存放在R1、R0寄存器中,除數存放在R3、R2 寄存器中,最后商保存在R1、R0寄存器中。
圖5 中,被除數和除數分別是0100 0001 1011 0000 0000 0000 0000 0000,0100 0000 0101 0000 0000 0000 0000 0000 即1.011 ×24÷1.101 ×21,商為0100 0000 1101 1000 1001 1101 1000 1001,即1.10110001001 1101 1000 1001 ×22,程序運行結果驗證了所設計和實現的32 bit浮點除法指令的功能是正確的。

圖5 包含FDIV指令的教學機程序1

圖6 包含FDIV指令的教學機程序2
圖6 中,被除數和除數分別是0100 0001 0001 1110 1001 0010 0011 0001,0100 0000 0010 0010 0011 1011 1100 0010,即1.00111101001001000110001 ×23÷1.01000100011101111000010 ×21,商為0100 0000 0111 1010 0011 1000 1000 1011,即1.11110100 01110001000 1011 ×21,程序運行結果驗證了所設計和實現的32 bit浮點除法指令的功能是正確的。
目前國內外還沒有研究在TEC-XP16 教學機的微程序控制器中擴展較復雜指令,如32 bit 浮點數除法指令的文獻。本文對TEC-XP16 教學機微程序控制器中擴展32 bit浮點數除法指令進行了嘗試,設計實現了一種32 bit IEEE 754 浮點數除法指令,測試結果表明,采用本文方法在TEC-XP16 教學機上設計的32 bit浮點數除法指令的功能是正確的。
為解決原來采用人工方式將TEC-XP16 教學機匯編程序轉換成微程序效率低且容易出錯等問題,設計了匯編程序表和微程序表,并設計了一個python 程序,能夠根據匯編程序直接自動生成微程序,同時,為解決手工修改控制器源程序速度慢及容易出錯等問題,提出了一種能夠根據微程序自動修改微程序控制器源程序的方法。實驗結果表明,所設計的32 bit 浮點除法指令功能是正確的,平均只需要2.16 s就能根據匯編程序表自動生成微程序表,平均只需1.3 s 就能根據微程序表、微指令轉移判斷條件表和微程序入口地址表自動修改并生成控制器ABEL 語言源程序,極大提高了32 bit浮點除法指令的設計實現效率。本文提出的方法也可推廣到其他復雜指令的設計。
下一步將嘗試在TEC-XP16 教學機微程序控制器中設計32 bit浮點數加減法指令等復雜指令,以及進一步研究在TEC-XP16 教學機組合邏輯控制器中設計復雜指令的方法。