宗德才,王康康
(1.常熟理工學院計算機科學與工程學院,江蘇 常熟 215500; 2.江蘇科技大學數(shù)理學院,江蘇 鎮(zhèn)江 212003)
目前,國內(nèi)很多高校計算機組成原理實驗教學內(nèi)容主要是基于TEC-XP16教學計算機而開展進行的。為了使學生更好掌握計算機的各個組成部件的工作原理,理解指令的執(zhí)行流程,系統(tǒng)地建立計算機整機概念,迫切需要開發(fā)一些設(shè)計性實驗,如在TEC-XP16教學計算機中設(shè)計一些新指令。
文獻[1]設(shè)計了一種4 bit乘法指令與除法指令;文獻[2-3]將EDA軟件Proteus應(yīng)用于教學實驗中,其缺點是很難形成對計算機硬件的直觀理解;文獻[4]設(shè)計了14條指令;文獻[5]設(shè)計了加法等指令;文獻[6]要求學生至少設(shè)計實現(xiàn)7條指令。文獻[7]設(shè)計了一種簡單的定點數(shù)減法運算的微程序;文獻[8]設(shè)計了一種簡單的累加器加立即數(shù)加法指令;文獻[9-14]設(shè)計了一種簡單的寄存器型加法或減法指令。文獻[1-14]中都未設(shè)計浮點除法等復雜指令。文獻[15]介紹了TH-union教學機微程序控制器的原理及實驗步驟,沒有擴展新指令。文獻[16]在TEC-2000教學機微程序控制器中設(shè)計實現(xiàn)了4條簡單的擴展指令。文獻[17]在TEC-2000教學機微程序控制器中設(shè)計實現(xiàn)了2條簡單的擴展指令。文獻[16-17]在TEC-2000教學機微程序控制器中擴展的指令都比較簡單。文獻[18]研究了在TEC-XP16組合邏輯控制器中擴展簡單指令的方法。文獻[19]提出一種微程序控制器中8 bit無符號乘法指令與8 bit無符號除法指令的設(shè)計方法,均需要20多條微指令組成的微程序來實現(xiàn),設(shè)計好微程序后都采用手工方式修改控制器源程序,效率低。文獻[20-22]基于硬件描述語言設(shè)計實現(xiàn)了浮點運算單元,能夠執(zhí)行基于RISC-V的浮點運算指令。文獻[23]設(shè)計了一種有效的浮點乘加單元,能夠執(zhí)行浮點乘加指令和浮點加法指令。目前,國內(nèi)外還沒有研究在TEC-XP16教學機中設(shè)計實現(xiàn)浮點運算指令的文獻。
基于TEC-XP16教學機,研究微程序控制器中32 bit浮點運算指令的一種通用的設(shè)計方法,能夠快速實現(xiàn)各種浮點運算指令。為解決傳統(tǒng)人工方式設(shè)計微程序效率低且容易出錯等問題,首先,設(shè)計匯編語言程序表、微程序表等數(shù)據(jù)庫表,并用Python語言設(shè)計程序,能夠根據(jù)匯編語言源程序直接自動生成微程序。同時,為解決手工修改控制器ABEL語言源程序速度慢及容易出錯等問題,提出一種能夠根據(jù)微程序表等數(shù)據(jù)庫表自動修改控制器ABEL語言源程序的方法。用戶只需將事先設(shè)計好的實現(xiàn)浮點運算指令的匯編語言源程序輸入?yún)R編語言程序表,即可在7 s之內(nèi)得到能夠運行浮點運算指令的微程序控制器源程序。為了驗證本文提出的方法,在本文中設(shè)計了4種浮點運算指令,即32 bit浮點乘法指令FMUL、32 bit浮點除法指令FDIV、32 bit浮點加法指令FADD、32 bit浮點減法指令FSUB,并給出了實現(xiàn)32 bit浮點減法指令的算法。最后,測試了4種浮點運算指令的功能,并分析了采用本文方法實現(xiàn)4種浮點運算指令所需要的時間。
在TEC-XP16教學機微程序控制器中擴展指令時,首先,設(shè)計新指令對應(yīng)的微程序,根據(jù)微程序修改描述MACH芯片功能的ABEL語言源程序[24],然后將修改后的ABEL語言程序用ISP LEVER軟件編譯成.jed文件,接著將.jed文件下載到MACH芯片中,最后,在教學機上調(diào)試運行包含新指令的教學機程序。
本文在TEC-XP16教學機微程序控制器中設(shè)計實現(xiàn)了4種32 bit浮點運算指令。
在TEC-XP16教學機的微程序控制器中設(shè)計實現(xiàn)浮點運算指令的主要過程如下。
為了實現(xiàn)由匯編語言源程序自動生成微程序這一功能,設(shè)計了匯編語言程序表AsblProgram,如表1所示。表1中FLINST字段用于表示當前匯編語句是屬于FMUL、FDIV、FADD、FSUB中哪一條浮點運算指令;Number字段表示當前匯編語句是屬于浮點運算指令中的第幾條匯編語句;Iname字段表示當前匯編語句的名稱;Label表示匯編語句的標號,供轉(zhuǎn)移類語句控制轉(zhuǎn)移使用,當需要用符號地址來訪問該語句時,才給此語句賦予標號;Itype字段表示匯編語句的類型;Dest表示匯編語句的目的操作數(shù)地址;Src表示源操作數(shù)地址;DstAdr表示轉(zhuǎn)移類匯編語句的轉(zhuǎn)移目標地址,用標號表示目標地址。
表1 AsblProgram匯編語言程序表
在TEC-XP16教學機中,一條微指令由16位的下地址字段和32位的控制命令字段共同組成[25]。
根據(jù)TEC-XP16教學機微指令的格式,設(shè)計了微程序表MProgram,如表2所示,用于保存32 bit浮點運算指令對應(yīng)的由微指令組成的微程序。表2中FLINST字段用于表示當前微指令對應(yīng)FMUL、FDIV、FADD、FSUB中哪一條浮點運算指令;MIadr字段表示當前微指令地址;Nadr表示當前微指令中的8位下地址;Cmd表示當前微指令中的4位命令碼;SCC表示當前微指令中的4位微轉(zhuǎn)移條件。
表2 MProgram微程序表
表2中,命令碼用于控制微指令的執(zhí)行順序,命令碼CI3~CI0為1110時,順序執(zhí)行。命令碼CI3~CI0為0010時,根據(jù)指令的操作碼確定該指令對應(yīng)的微程序的入口地址。設(shè)計了微程序入口地址表MPFAdr,如表3所示,用于保存32 bit浮點運算指令對應(yīng)的微程序的第一條微指令的地址。
表3 MPFAdr微程序入口地址表
命令碼CI3~CI0為0011時,用于條件微轉(zhuǎn)移控制,微轉(zhuǎn)移條件SCC3~SCC0用于條件微轉(zhuǎn)移時給出轉(zhuǎn)移依據(jù)的條件,條件滿足時發(fā)生轉(zhuǎn)移,下一條微指令的地址為當前微指令中8位下地址的內(nèi)容;條件不滿足,順序執(zhí)行[26]。
設(shè)計了微指令轉(zhuǎn)移判斷條件表CC,如表4所示,用于保存微指令轉(zhuǎn)移的條件。
表4 CC微指令轉(zhuǎn)移判斷條件表
由于每一條匯編指令轉(zhuǎn)換后的微指令數(shù)目不同,設(shè)計了ISEA表(如表5所示),用于存儲每一條匯編指令轉(zhuǎn)換成為微指令后,對應(yīng)的第一條微指令地址start和最后一條微指令的地址end。
表5 ISEA匯編語句微指令地址表
在Access 2010數(shù)據(jù)庫管理系統(tǒng)中,創(chuàng)建名為fpys.mdb的數(shù)據(jù)庫并根據(jù)表1~表5創(chuàng)建表結(jié)構(gòu)。
設(shè)計實現(xiàn)浮點運算指令FMUL、FDIV、FADD、FSUB的匯編語言源程序,并按照表1~表5的結(jié)構(gòu)將匯編語言源程序輸入到一個Excel文件中,然后將Excel中數(shù)據(jù)導入fpys.mdb中的匯編語言程序表AsblProgram。
Access數(shù)據(jù)編輯功能較弱,因此,首先將數(shù)據(jù)輸入到Excel中,然后再將Excel中數(shù)據(jù)導入到Acces數(shù)據(jù)表中。
由于教學機硬件資源的限制,不能同時生成FMUL、FDIV、FADD、FSUB指令的控制器源文件,每次只能生成一條浮點運算指令的控制器源文件,因此,fpys.mdb中的匯編語言程序表AsblProgram中每次只能輸入一條浮點運算指令的匯編語言源程序,下文以浮點減法指令FSUB的設(shè)計實現(xiàn)過程為主對其進行闡述。
對設(shè)計實現(xiàn)的浮點運算指令的匯編語言源程序進行分析后發(fā)現(xiàn),可以將匯編指令分成3類,即轉(zhuǎn)換后只生成一條微指令的匯編指令、轉(zhuǎn)換后生成2條微指令的匯編指令、轉(zhuǎn)換后生成多條(超過2條)微指令的匯編指令,如表6所示。
表6 教學機匯編語句與微指令條數(shù)
首先,設(shè)計32 bit浮點運算指令的格式和功能,如表7所示。
表7 浮點運算指令的格式與功能
如圖1所示,在IEEE 754格式的32 bit浮點數(shù)中最高位是數(shù)符,表示浮點數(shù)的正負,階碼用移碼表示,階碼的真值都被加上一個偏移量,對于32 bit浮點數(shù)的偏移量為127。
1位數(shù)符8位階碼7位尾數(shù) 16位尾數(shù)
在IEEE 754格式浮點數(shù)中尾數(shù)部分通常都是規(guī)格化表示的,即非0的有效位最高位總是1,有效位呈如下形式:1.ffff……fff,在實際的表示中,對于32位浮點數(shù),這個整數(shù)位的1被省略,稱為隱藏位。
TEC-XP16教學機中共有16個16位的通用寄存器R0~R15。32 bit浮點數(shù)需要用2個通用寄存器來表示。
下面給出設(shè)計浮點減法指令FSUB的匯編語言源程序的過程。
按32 bit浮點減法指令FSUB的格式與功能,設(shè)計32 bit浮點減法算法,如算法1。
算法1 32 bit浮點減法運算算法。被減數(shù)與減數(shù)都用32 bit IEEE 754浮點數(shù)表示,被減數(shù)存放在R1、R0寄存器,減數(shù)存放在R3、R2寄存器,差為32 bit IEEE 754浮點數(shù),最后,差存放在R1、R0寄存器中。
1)將R3最高位取反,即減數(shù)符號位取反。
2)R3內(nèi)容送R12,R12最高位清為0,R12和R2做或運算,運算結(jié)果為0,即減數(shù)絕對值為2-127,則差近似等于被減數(shù),置不溢出標志C=0,結(jié)束,否則,轉(zhuǎn)步驟3。
3)R1內(nèi)容送R12,R12最高位清為0,R12和R0做或運算,運算結(jié)果為0,即被減數(shù)絕對值為2-127,被減數(shù)近似為0,則R3內(nèi)容送R1,R2內(nèi)容送R0,置不溢出標志C=0,結(jié)束,否則,轉(zhuǎn)步驟4。
4)取被減數(shù)階碼部分,并右移一位,保存在R6寄存器中,R6中結(jié)果為(00JJ JJJJ JJ00 0000)2,其中,J表示階碼部分。
5)取減數(shù)階碼部分,并右移一位,保存在R7寄存器中,R7中結(jié)果為(00JJ JJJJ JJ00 0000)2,其中,J表示階碼部分。
6)如果(R6)≥(R7),則轉(zhuǎn)步驟9,否則,轉(zhuǎn)步驟7。
7)R0與R2相互交換,R1與R3相互交換,即交換被減數(shù)和減數(shù)。
8)R7內(nèi)容送R8,(R8)-(R6)→R8,R8中內(nèi)容為階差×64,R7內(nèi)容送R6,轉(zhuǎn)步驟10。
9)R6內(nèi)容送R8,(R8)-(R7)→R8,R8中內(nèi)容為階差×64。
10)判斷R8中內(nèi)容是否大于(0000 0110 0000 0000)2,即階碼差是否大于24,如果階差大于24,則結(jié)束,否則,轉(zhuǎn)步驟11。
11)R1和R3做異或運算,運算結(jié)果的標志位保存到堆棧。
12)將R1的最高位保存在R7最高位。
13)取得被減數(shù)的尾數(shù)部分,并恢復隱藏位,存放在R1、R0寄存器,R1、R0中結(jié)果為(0000 0000 1WWW WWWW WWWW WWWW WWWW WWWW)2,其中,W表示階碼部分。
14)取得減數(shù)的尾數(shù)部分,并恢復隱藏位,存放在R3、R2寄存器,R3、R2中結(jié)果為(0000 0000 1WWW WWWW WWWW WWWW WWWW WWWW)2,其中,W表示階碼部分。
15)將R9寄存器清為0。
16)判斷R8中內(nèi)容是否大于(0000 0100 0000 0000)2,即階碼差是否大于等于16,如果階差大于等于16,則轉(zhuǎn)步驟17,否則,轉(zhuǎn)步驟19。
17)R2內(nèi)容送R9,R3內(nèi)容送R2,R3清為0,即減數(shù)尾數(shù)右移16位。
18)(R8)-(0000 0100 0000 0000)2→R8,即階碼差減去16。
19)判斷R8內(nèi)容是否為0,如果R8內(nèi)容為0,則轉(zhuǎn)步驟23,否則,轉(zhuǎn)步驟20。
20)R3//R2//R9聯(lián)合右移一位。
21)(R8)-(0000 0000 0100 0000)2→R8,即階碼差減去1。
22)判斷R8是否為0,如果R8不為0,則轉(zhuǎn)步驟20;否則,轉(zhuǎn)步驟23。
23)標志位出棧,恢復標志位,如果標志位S為1,即被減數(shù)與減數(shù)尾數(shù)符號不同,尾數(shù)要做減法運算,轉(zhuǎn)步驟24,否則,轉(zhuǎn)步驟37。
24)R9每一位取反,最低位加1。
25)(R0)-(R2)-C→R0。
26)(R1)-(R3)-C→R1。
27)如果R1//R0//(0000)16≥R3//R2//R9,此時C為1,轉(zhuǎn)步驟30;否則,C為0,轉(zhuǎn)步驟28。
28)R1//R0//R9每一位取反,在R9最低位加1。
29)將R7最高位取反。
30)R0和R1都為0,則置不溢出標志C=0,結(jié)束,否則,轉(zhuǎn)步驟31。
31)判斷尾數(shù)是否規(guī)格化數(shù),如果不是,則轉(zhuǎn)步驟32,否則,轉(zhuǎn)步驟33。
32)R1//R0//R9聯(lián)合左移一位,階碼減去1,轉(zhuǎn)步驟31。
33)進行舍入處理,如果R9最高位為1,則R1//R0+1→R1//R0;否則,R1//R0保持不變。
34)判斷尾數(shù)是否溢出,如果溢出,則R1//R0聯(lián)合右移一位,階碼加1,轉(zhuǎn)步驟35;否則直接轉(zhuǎn)步驟35。
35)如果R6最高位為1,則為下溢,結(jié)果為0,結(jié)束;如果R6次高位為1,則為上溢,令C=1,結(jié)束;如果R6最高兩位為00,則執(zhí)行步驟27。
36)R6最高2位為00表示結(jié)果沒有溢出,令C=0,將R6左移一位,調(diào)整R1寄存器的內(nèi)容,R1最高位即R7最高位,R1次高位開始的8位即R6中階碼部分,R1低7位即高7位尾數(shù)不變,結(jié)束。
37)R1//R0+R3//R2→R1//R0。
38)判斷尾數(shù)是否溢出,如果溢出,則轉(zhuǎn)步驟39;否則轉(zhuǎn)步驟33。
(39)R1//R0//R9聯(lián)合右移一位,階碼加1,轉(zhuǎn)步驟38。
然后,根據(jù)算法1用表6中的教學機匯編語句設(shè)計實現(xiàn)浮點減法指令FSUB的匯編語言源程序。
首先,使用SQLite Expert軟件將fpys.mdb文件轉(zhuǎn)換為SQLite3數(shù)據(jù)庫文件FLOATYS.db。
然后,根據(jù)算法2和算法3,用Python語言編程(記為程序P1),能夠?qū)sblProgram表中的匯編語言源程序自動轉(zhuǎn)換成微程序并寫入MProgram表,根據(jù)算法4為轉(zhuǎn)移類指令更新其微指令中的下地址字段Nadr,根據(jù)算法5為條件轉(zhuǎn)移類指令生成CC表。
Python語言具有簡單易學、免費開源和可擴展移植性好等特性[27],因此,本文選擇Python語言作為程序設(shè)計語言。
算法2 由匯編語言源程序生成微程序算法。
1)從AsblProgram表中查找最大Number字段值,記為maxN,令i=1。
2)查找AsblProgram表中Number字段等于i的記錄,得到第i條匯編指令,記為INSTi。
3)如表6所示,如果INSTi的Iname為MVRR、OR、AND、ADD、SUB等,則只需要轉(zhuǎn)換成一條相應(yīng)的微指令并寫入MProgram表,同時在ISEA表中寫入待轉(zhuǎn)換匯編指令對應(yīng)的第一條微指令的地址start和最后一條微指令地址end,并且start=end。
如果INSTi的Iname為PSHF、POPF,則需要轉(zhuǎn)換成2條相應(yīng)的微指令并寫入MProgram表,同時在ISEA表中寫入start和end,并且end=start+1。
如果INSTi的Iname為MVRD,則根據(jù)算法3轉(zhuǎn)換為多條微指令并寫入MProgram表,同時在ISEA表中寫入待轉(zhuǎn)換MVRD指令對應(yīng)的start和end;
4)i=i+1,重復步驟2和步驟3,直到i>maxN結(jié)束。
在設(shè)計的實現(xiàn)浮點運算指令的匯編語言源程序中,MVRD Ri、DATA指令中,DATA值有十六進制數(shù)7F80、1FC0、8000、007F、0010、0001、0008、0040、0080、0100。根據(jù)DATA中1是連續(xù)的特點,設(shè)計了算法3,算法3的設(shè)計目標是盡量用最少的微指令實現(xiàn)MVRD指令。
算法3 MVRD Ri,DATA指令轉(zhuǎn)換成多條微指令算法。
1)將十六進制數(shù)DATA轉(zhuǎn)換成16位二進制數(shù)D16。
2)計算D16中1的位數(shù),記為S1。
3)如果S1>1,則執(zhí)行步驟4,否則,執(zhí)行步驟12。
4)MVRD指令的第一條微指令為SUB指令對應(yīng)的微指令,該微指令執(zhí)行后得到(1111 1111 1111 1111)2。
5)計算將(1111 1111 1111 1111)2采用先左移后右移的方法得到D16的次數(shù),記為LR(D16)。
6)計算將(1111 1111 1111 1111)2采用先右移后左移的方法得到D16的次數(shù),記為RL(D16)。
7)如果LR(D16)≤RL(D16),則執(zhí)行步驟8,否則,執(zhí)行步驟10。
8)生成16-S1條SHL指令對應(yīng)的微指令。
9)生成LR(D16)+S1-16條SHR指令對應(yīng)的微指令,結(jié)束。
10)生成16-S1條SHR指令對應(yīng)的微指令。
11)生成RL(D16)+S1-16條SHL指令對應(yīng)的微指令,結(jié)束。
12)計算由(0000 0000 0000 0001)2得到D16的次數(shù),記為L(D16),則由DATA得到D16需要L(D16)+2條微指令。
13)計算由(1111 1111 1111 11111)2得到D16的次數(shù),記為L1(D16),則由DATA得到D16需要L1(D16)+1條微指令。
14)如果L(D16)+2≤ L1(D16)+1,則執(zhí)行步驟15,否則執(zhí)行步驟18。
15)生成SUB指令對應(yīng)的微指令,該微指令執(zhí)行后得到(0000 0000 0000 0000)2。
16)生成INC指令對應(yīng)的微指令,該微指令執(zhí)行后得到(0000 0000 0000 0001)2。
17)生成L(D16)條SHL指令對應(yīng)的微指令,結(jié)束。
18)生成SUB指令對應(yīng)的微指令,該微指令執(zhí)行后得到(1111 1111 1111 1111)2。
19)生成L1(D16)條SHL指令對應(yīng)的微指令,結(jié)束。
以MVRD R7,7F80為例,D16=(0111 1111 1000 0000)2,S1=8,LR(D16)=9,RL(D16)=15,LR(D16)=9 算法4 轉(zhuǎn)移類匯編指令生成微指令中的下地址算法。 JRZ、JRNZ、JRC、JRNC、JRS、JRNS和JR都只需要轉(zhuǎn)換成一條微指令即可,但是要根據(jù)轉(zhuǎn)移目標地址更新Nadr字段值。 1)從AsblProgram表中查找Itype為3或4的所有記錄(JRZ、JRNZ、JRC、JRNC、JRS、JRNS指令的Itype為3,JR指令的Itype為4),假設(shè)查詢結(jié)果有n條記錄,令i=1。 2)根據(jù)查詢結(jié)果中記錄i的Number字段值在ISEA表中查找start字段值,并轉(zhuǎn)換成微指令地址,記為JMIadr。 3)在AsblProgram表中查找Label字段等于查詢結(jié)果中記錄i的DstAdr字段值的記錄的Number字段值,記為DNum。 4)在ISEA表中查找Number字段等于DNum的記錄的start字段值,并轉(zhuǎn)換成8位二進制,記為JDMIadr。 5)更新MProgram表中MIadr字段等于JMIadr的記錄的Nadr字段值為JDMIadr。 6)i=i+1,重復步驟2~步驟5,直到i>n結(jié)束。 如圖2所示,以匯編指令JRC FPAdd_no_exchg為例,Number=45,start=108,JMIadr=MA6C,DNum=56,JDMIadr=(01110111)2,因此,將會更新MIadr為MA6C的微指令的Nadr為(01110111)2。 圖2 實現(xiàn)FSUB浮點指令的匯編語言程序片段 算法5 條件轉(zhuǎn)移類指令生成微指令轉(zhuǎn)移判斷條件算法。 1)從AsblProgram表中查找Itype為3的所有記錄,假設(shè)查詢結(jié)果有n條記錄,令i=1。 2)在AsblProgram表中查找Label字段等于查詢結(jié)果中記錄i的DstAdr字段值的記錄的Number字段值,記為DNum。 3)在ISEA表中查找Number字段等于DNum的記錄的start字段值,并轉(zhuǎn)換成8位二進制,記為JDMIadr。 4)如果CC表中還沒有Nadr等于JDMIadr的記錄,則在CC表中插入一條記錄,否則,轉(zhuǎn)步驟5。 5)i=i+1,重復步驟2~步驟4,直到i>n結(jié)束。 如圖3所示,以匯編指令JRC FPAdd_no_exchg為例,DNum=56,JDMIadr=01110111,因此,將會在CC表插入一條記錄“0100,F(xiàn)SUB,01110111,C==1”。 圖3 CC表中插入的記錄 根據(jù)算法6,用Python語言編程(記為程序P2),能夠根據(jù)MPFAdr表以及1.1.4節(jié)的程序P1生成的MProgram表、CC表自動生成實現(xiàn)了32 bit浮點運算指令的控制器源文件m256c6.abl。 算法6 由微程序生成控制器源程序算法。 1)打開控制器源程序文件m256c.abl,讀取m256c.abl文件的所有行存放在list1列表對象中,Python語言代碼如下: with open(′m256c.abl′, ′r′) as f1: list1=f1.readlines() 2)連接數(shù)據(jù)庫,Python語言代碼如下: db=sqlite3.connect(′FLOATYS.db′) 3)從MPFAdr表中讀取所有記錄,將所有記錄的Iname字段值和Opcode字段值組成一個字符串INST_OPCODE。 對于FSUB指令,INST_OPCODE為“FSUB=(IR==[1,1,1,0,1,1,1,0]);”。 在list1列表對象中找到“Expand Instruction here”字符串,將該字符串替換為字符串INST_OPCODE。 4)從CC表中讀取所有記錄,根據(jù)這些記錄的SCC字段值、Iname字段值、Nadr字段值和Condition字段值修改list1列表對象中CC0表達式。 5)對MPFAdr表中的每一條記錄,根據(jù)MPadr字段值,在list1列表對象中找到D0~D7邏輯表達式所在的行并進行修改,例如,F(xiàn)SUB指令的MPadr字段值為0100 0000,則D6表達式中需增加FSUB信號;由于m256c.abl文件中D0~D7表達式出現(xiàn)在CC0表達式后面,因此,在list1列表中查找D0~D7時,可以從CC0表達式的下一行開始查找,這樣可提高查找速度。 6)根據(jù)MProgram表中記錄修改list1列表對象中的下地址、命令碼、微轉(zhuǎn)移條件和控制信號。 7)將list1列表對象寫入一個新文件m256c6.abl,然后,關(guān)閉該文件。 如圖4~圖5所示,為了驗證所設(shè)計的32 bit浮點減法指令FSUB是否正確,設(shè)計了一個包含F(xiàn)SUB的教學機程序。教學機中規(guī)定擴展指令必須用E命令寫入教學機內(nèi)存,F(xiàn)SUB指令的二進制代碼為EE00(用十六進制形式表示),EE為FSUB指令的操作碼,被減數(shù)存放在R1、R0寄存器中,減數(shù)存放在R3、R2寄存器中,最后差保存在R1、R0寄存器中。由于論文篇幅關(guān)系,包含F(xiàn)MUL指令、FDIV指令、FADD指令的教學機程序的運行結(jié)果文中未給出。 圖4 包含F(xiàn)SUB指令的教學機程序1 圖5 包含F(xiàn)SUB指令的教學機程序2 圖4中,被減數(shù)是十六進制數(shù)40700006,即二進制數(shù)0100 0000 0111 0000 0000 0000 0000 0110,減數(shù)是十六進制數(shù)40000003,即二進制數(shù)0100 0000 0000 0000 0000 0000 0000 0011,1.11100000000000000000110×21-1.00000000000000000000011×21,差為1.11000000000 000000000110×20,即二進制數(shù)0011 1111 1110 0000 0000 0000 0000 0110,十六進制數(shù)3FE00006,程序運行結(jié)果驗證了所設(shè)計和實現(xiàn)的32 bit浮點減法指令的功能是正確的。 圖5中,被減數(shù)是十六進制數(shù)40900007,即二進制數(shù)0100 0000 1001 0000 0000 0000 0000 0111,減數(shù)是十六進制數(shù)40000002,即二進制數(shù)0100 0000 0000 0000 0000 0000 0000 0010,1.00100000000000000000111×22-1.00000000000000000000010×21,差為1.01000000000000000001100×21,即二進制數(shù)0100 0000 0010 0000 0000 0000 0000 1100,十六進制數(shù)4020000C,程序運行結(jié)果驗證了所設(shè)計和實現(xiàn)的32 bit浮點減法指令的功能是正確的。 下面分析采用本文方法實現(xiàn)4種浮點運算指令所需要的時間。 首先,按上述方法設(shè)計好數(shù)據(jù)庫表,并在AsblProgram表中輸入事先設(shè)計好的實現(xiàn)4種浮點運算指令的匯編語言源程序。 對于4種浮點運算指令,將能夠自動將AsblProgram表中的匯編語言源程序轉(zhuǎn)換成微程序并寫入MProgram表、CC表和ISEA表的程序P1分別運行50次,將能根據(jù)MPFAdr表和程序P1生成的MProgram、CC表中的內(nèi)容自動修改微程序控制器源程序文件的程序P2分別運行50次。實驗結(jié)果如表8所示。 表8 4種浮點運算指令分析 實驗環(huán)境為:Intel Core i5 CPU M 450 (2.40 GHz),內(nèi)存 4 GB,Windows 10操作系統(tǒng)。 如表8所示,實現(xiàn)浮點運算指令FMUL、FDIV、FADD、FSUB的匯編語言源程序最終分別轉(zhuǎn)換成193條、159條、165條、167條微指令。將AsblProgram表中的匯編語言源程序轉(zhuǎn)換成微程序的平均時間分別為1.95 s、2.16 s、4.26 s、4.39 s。根據(jù)微程序自動生成微程序控制器源程序文件的平均時間分別為0.71 s、1.32 s、1.65 s、1.72 s。 目前,國內(nèi)外還沒有研究在TEC-XP16教學機的微程序控制器中擴展較復雜指令,如32 bit浮點運算指令的文獻。本文對TEC-XP16教學機微程序控制器中擴展32 bit浮點運算指令進行了嘗試,提出了一種通用的32 bit浮點運算指令快速設(shè)計方法。 為解決原來采用人工方式將TEC-XP16教學機匯編程序轉(zhuǎn)換成微程序效率低且容易出錯等問題,設(shè)計了匯編語言程序表和微程序表,并用Python語言設(shè)計了程序,能夠根據(jù)匯編語言源程序直接自動生成微程序。同時,為解決手工修改控制器源程序速度慢及容易出錯等問題,提出了一種能夠根據(jù)微程序自動修改生成微程序控制器源程序的方法。實驗結(jié)果表明,所設(shè)計的32 bit浮點運算指令的功能是正確的,平均在5 s內(nèi)就能根據(jù)匯編語言程序表自動生成微程序表,平均只需在2 s內(nèi)就能根據(jù)微程序表、微指令轉(zhuǎn)移判斷條件表和微程序入口地址表自動修改并生成控制器ABEL語言源程序,極大提高了32 bit浮點運算指令的設(shè)計實現(xiàn)效率。本文提出的方法也可推廣到其他復雜指令的設(shè)計。 下一步將嘗試在TEC-XP16教學機組合邏輯控制器中設(shè)計32 bit浮點數(shù)乘法、除法指令等復雜指令。1.5 根據(jù)微程序等生成控制器源文件
2 實驗分析
3 結(jié)束語