宗德才, 王康康
(1.常熟理工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院,江蘇常熟215500;2.江蘇科技大學(xué)數(shù)理學(xué)院,江蘇鎮(zhèn)江212003)
目前,國(guó)內(nèi)很多高校計(jì)算機(jī)組成原理實(shí)驗(yàn)教學(xué)內(nèi)容主要是基于TEC-XP16 教學(xué)計(jì)算機(jī)而開(kāi)展的。為使學(xué)生更好地掌握計(jì)算機(jī)各個(gè)組成部件的工作原理,理解指令的執(zhí)行流程,系統(tǒng)地建立計(jì)算機(jī)整機(jī)概念,需要開(kāi)發(fā)一些設(shè)計(jì)性實(shí)驗(yàn),如在TEC-XP16 教學(xué)計(jì)算機(jī)中設(shè)計(jì)一些浮點(diǎn)運(yùn)算指令。
文獻(xiàn)[1]中設(shè)計(jì)了一種4 bit 乘法指令與除法指令,文獻(xiàn)[2-3]中將EDA 軟件Proteus 應(yīng)用于教學(xué)實(shí)驗(yàn)中,缺點(diǎn)是很難形成對(duì)計(jì)算機(jī)硬件的直觀了解,文獻(xiàn)[4]中設(shè)計(jì)了一個(gè)8 bit模型機(jī),設(shè)計(jì)了14 條指令,文獻(xiàn)[5]中設(shè)計(jì)了加法等指令,文獻(xiàn)[6]中要求學(xué)生至少設(shè)計(jì)實(shí)現(xiàn)7 條指令,文獻(xiàn)[1-6]中都未設(shè)計(jì)浮點(diǎn)除法等復(fù)雜指令。
文獻(xiàn)[7]中介紹了TH-union 教學(xué)機(jī)微程序控制器的原理及實(shí)驗(yàn)步驟,沒(méi)有擴(kuò)展新指令。文獻(xiàn)[8]中在TEC-2000 教學(xué)機(jī)微程序控制器中設(shè)計(jì)實(shí)現(xiàn)了4 條簡(jiǎn)單的擴(kuò)展指令。文獻(xiàn)[9]中在TEC-2000 教學(xué)機(jī)微程序控制器中設(shè)計(jì)實(shí)現(xiàn)了兩條簡(jiǎn)單的擴(kuò)展指令。文獻(xiàn)[8-9]中在TEC-2000 教學(xué)機(jī)微程序控制器中擴(kuò)展的指令都比較簡(jiǎn)單。文獻(xiàn)[10]中研究了在TEC-XP16 組合邏輯控制器中擴(kuò)展簡(jiǎn)單指令的方法。文獻(xiàn)[11]中提出一種微程序控制器中8 bit 無(wú)符號(hào)乘法指令與8 bit無(wú)符號(hào)除法指令的設(shè)計(jì)方法,均需要20 多條微指令組成的微程序來(lái)實(shí)現(xiàn),文獻(xiàn)[8-9,11]中設(shè)計(jì)好微程序后都采用手工方式修改控制器源程序,效率低、速度慢且容易出錯(cuò)。
基于TEC-XP16 教學(xué)機(jī),設(shè)計(jì)了一種32 bit IEEE 754 格式的浮點(diǎn)數(shù)除法指令以及實(shí)現(xiàn)32 bit 浮點(diǎn)數(shù)除法運(yùn)算的算法。用TEC-XP16 教學(xué)機(jī)的匯編指令設(shè)計(jì)了實(shí)現(xiàn)浮點(diǎn)數(shù)除法算法的匯編語(yǔ)言程序。為解決人工方式設(shè)計(jì)微程序和修改微程序控制器源程序效率低且容易出錯(cuò)等問(wèn)題,提出了一種能夠由匯編語(yǔ)言程序自動(dòng)生成微程序以及能夠由微程序自動(dòng)修改控制器ABEL 語(yǔ)言源程序的方法。實(shí)驗(yàn)結(jié)果表明,所設(shè)計(jì)的32 bit浮點(diǎn)除法指令的功能是正確的,平均只需要2.16 s就能根據(jù)匯編語(yǔ)言程序表自動(dòng)生成微程序表,平均只需1.3 s 就能根據(jù)微程序表、微指令轉(zhuǎn)移判斷條件表和微程序入口地址表自動(dòng)修改并生成控制器ABEL語(yǔ)言源程序,極大提高了浮點(diǎn)除法指令的設(shè)計(jì)效率。該方法也可推廣到其他復(fù)雜指令的設(shè)計(jì)過(guò)程。
在TEC-XP16 教學(xué)機(jī)微程序控制器中擴(kuò)展指令時(shí),首先,設(shè)計(jì)新指令對(duì)應(yīng)的微程序,根據(jù)微程序修改描述MACH 芯片功能的ABEL 語(yǔ)言源程序[12],然后將修改后的ABEL 語(yǔ)言程序用ISP LEVER 軟件編譯成.jed文件,接著將.jed 文件下載到MACH 芯片中,最后,在教學(xué)機(jī)上調(diào)試運(yùn)行包含新指令的教學(xué)機(jī)程序。
本文在TEC-XP16 教學(xué)機(jī)微程序控制器中設(shè)計(jì)實(shí)現(xiàn)了一種32 bit浮點(diǎn)數(shù)除法指令。
在TEC-XP16 教學(xué)機(jī)微程序控制器中設(shè)計(jì)浮點(diǎn)除法指令的主要過(guò)程如下:
(1)確定32 bit浮點(diǎn)除法指令FDIV 的格式和功能,見(jiàn)表1。
表1 FDIV的指令格式與功能
(2)按32 bit 浮點(diǎn)除法指令的功能和格式,設(shè)計(jì)32 bit浮點(diǎn)除法算法,如算法1。
圖1 32 bit IEEE754浮點(diǎn)數(shù)格式
如圖1 所示,在IEEE 754 格式的32 bit浮點(diǎn)數(shù)中最高位是數(shù)符,表示浮點(diǎn)數(shù)的正負(fù),階碼用移碼表示,階碼的真值都被加上一個(gè)偏移量,對(duì)于32 bit 浮點(diǎn)數(shù)的偏移量為127。
在IEEE 754 格式浮點(diǎn)數(shù)中尾數(shù)部分通常都是規(guī)格化表示的,即非0 的有效位最高位總是1,有效位呈如下形式:1.ffff……fff,在實(shí)際的表示中,對(duì)于32 bit浮點(diǎn)數(shù),這個(gè)整數(shù)位的1 被省略,稱(chēng)為隱藏位。
TEC-XP16 教學(xué)機(jī)中共有16 個(gè)16 bit的通用寄存器R0 ~R15。32 bit浮點(diǎn)數(shù)需要用兩個(gè)通用寄存器來(lái)表示。
算法132 bit 浮點(diǎn)數(shù)除法運(yùn)算算法。被除數(shù)與除數(shù)都用32 bit IEEE 754 浮點(diǎn)數(shù)表示,被除數(shù)存放在R1、R0 寄存器,除數(shù)存放在R3、R2 寄存器,商為32 bit IEEE 754 浮點(diǎn)數(shù),商存放在R1、R0 寄存器中。
(1)如果R2和R3都是0,即除數(shù)近似為0,則置除數(shù)為0標(biāo)記,否則,轉(zhuǎn)(2);
(2)如果R1和R0都是0,即被除數(shù)近似為0,則結(jié)果近似為0,結(jié)束,否則,轉(zhuǎn)(3);
(3)取被除數(shù)階碼部分,并右移一位,保存在R6 寄存器中,R6中結(jié)果為00JJ JJJJ JJ00 0000,其中,J表示階碼部分;
(4)取除數(shù)階碼部分,并右移一位,保存在R7 寄存器中,R7中結(jié)果為00JJ JJJJ JJ00 0000,其中,J表示階碼部分;
(5)階碼相減:(R6)-(R7)→R6;
(6)浮點(diǎn)數(shù)中階碼用移碼表示,移碼是在階碼真值基礎(chǔ)上加127,階碼相減時(shí),127 被減去了,因此,需要把階碼差加上127。即(R6)+(0001 1111 1100 0000)2→R6;
(7)將除法的符號(hào)位保存在R7最高位;
(8)取被除數(shù)的尾數(shù)部分,并恢復(fù)隱藏位,存放在R1、R0寄存器,R1、R0 中結(jié)果為0000 0000 1WWW WWWW WWWW WWWW WWWW WWWW,其中,W表示階碼部分;
(9)取得除數(shù)的尾數(shù)部分,并恢復(fù)隱藏位,存放在R3、R2寄存器,R3、R2 中結(jié)果為0000 0000 1WWW WWWW WWWW WWWW WWWW WWWW,其中,W表示階碼部分;
(10)將R9、R8寄存器清為0,R9、R8寄存器存放商;
(11)令R10寄存器為24,24為相除的次數(shù);
(12)比較R1和R3,相等,轉(zhuǎn)(13),否則,轉(zhuǎn)(14);
(13)比較R0和R2,如果(R0)≥(R2),C為1,轉(zhuǎn)(15);否則,C為0,轉(zhuǎn)(16)
(14)如果(R1)≥(R3),則C 為1,轉(zhuǎn)(15),否則,C 為0,轉(zhuǎn)(16)
(15)R1/ /R0-R3/ /R2→R1/ /R0,
(16)帶進(jìn)位C循環(huán)左移R9、R8,即R9←R8←C
(17)R10減1;
(18)如果R10為0,則執(zhí)行(20),否則轉(zhuǎn)(19);
(19)余數(shù)R1/ /R0聯(lián)合左移一位,轉(zhuǎn)(12);
(20)此時(shí),R9 和R8 中商為24 位,考慮到被除數(shù)小于除數(shù)的情形,商要左移一位進(jìn)行規(guī)格化,因此,商要多取一位,取25位,若第25商為1,則令R15為1,否則令R15為0;
(21)將R9、R8內(nèi)容分別送R1、R0,將R9清0;
(22)如果R1中尾數(shù)部分最高位為0,則執(zhí)行(23),否則,執(zhí)行(26);
(23)將R15右移一位,R15最低位移入C觸發(fā)器;
(24)帶進(jìn)位C循環(huán)左移R1、R0,即R1←R0←C;
(25)階碼減1,即00JJ JJJJ JJ00 0000-0000 0000 0100 0000,其中,J表示階碼部分;
(26)如果R6最高位為1,則為下溢,結(jié)果為0,結(jié)束;如果R6次高位為1,則為上溢,令C =1,結(jié)束;如果R6 最高兩位為00,則執(zhí)行(27);
(27)R6最高兩位為00 表示結(jié)果沒(méi)有溢出,令C =0,將R6左移一位,調(diào)整R1寄存器的內(nèi)容,R1最高位即R7 最高位,R1 次高位開(kāi)始的8位即R6中階碼部分,R1低7位即高7位尾數(shù)不變,結(jié)束。
(3)根據(jù)算法1,用TEC-XP16 教學(xué)機(jī)的匯編指令編寫(xiě)程序?qū)崿F(xiàn)算法1。同時(shí),設(shè)計(jì)數(shù)據(jù)庫(kù)表。
Python語(yǔ)言具有簡(jiǎn)單易學(xué)、免費(fèi)開(kāi)源和可擴(kuò)展移植性好等特性[13],選擇Python 語(yǔ)言作為程序設(shè)計(jì)語(yǔ)言。
如圖2 所示,TEC-XP16 教學(xué)機(jī)中,一條微指令由16 bit 的下地址字段和32 bit 的控制命令字段共同組成[14]。
圖2 TEC-XP16教學(xué)機(jī)的微指令格式
根據(jù)TEC-XP16 教學(xué)機(jī)微指令的格式,設(shè)計(jì)了微程序表MProgram,如表2 所示,用于保存32 bit浮點(diǎn)數(shù)除法指令對(duì)應(yīng)的由微指令組成的微程序。
為實(shí)現(xiàn)根據(jù)匯編程序自動(dòng)生成微程序這一功能,設(shè)計(jì)了匯編程序表AsblProgram,見(jiàn)表3,用于保存根據(jù)32 bit浮點(diǎn)數(shù)除法運(yùn)算算法編寫(xiě)的90 條匯編指令組成的匯編程序。
表2 MProgram微程序表
表3 AsblProgram匯編程序表
圖2 中,命令碼用于控制微指令的執(zhí)行順序,命令碼CI3 ~CI0 為1110 時(shí),順序執(zhí)行。命令碼CI3 ~CI0為0010 時(shí),根據(jù)指令的操作碼確定該指令對(duì)應(yīng)的微程序的入口地址。設(shè)計(jì)微程序入口地址表MPFAdr,見(jiàn)表4,用于保存32 bit浮點(diǎn)數(shù)除法指令對(duì)應(yīng)的微程序的第一條微指令的地址。
表4 MPFAdr微程序入口地址表
命令碼CI3 ~CI0 為0011 時(shí),用于條件微轉(zhuǎn)移控制,見(jiàn)表5,微轉(zhuǎn)移條件SCC3 ~SCC0 用于條件微轉(zhuǎn)移時(shí)給出轉(zhuǎn)移依據(jù)的條件,條件滿(mǎn)足時(shí)發(fā)生轉(zhuǎn)移,下一條微指令的地址為當(dāng)前微指令中下地址字段的內(nèi)容;條件不滿(mǎn)足,順序執(zhí)行[15]。
根據(jù)表5,設(shè)計(jì)了微指令轉(zhuǎn)移判斷條件表CC,見(jiàn)表6,用于保存微指令轉(zhuǎn)移的條件。
表5 條件微指令轉(zhuǎn)移所依據(jù)的判斷條件表
表6 CC微指令轉(zhuǎn)移判斷條件表
由于每一條匯編指令轉(zhuǎn)換后的微指令數(shù)目不同,設(shè)計(jì)了ISEA表(見(jiàn)表7)用于存儲(chǔ)每一條匯編指令轉(zhuǎn)換成為微指令后,對(duì)應(yīng)的第一條微指令地址start 和最后一條微指令的地址end。(4)在匯編程序表AsblProgram中輸入實(shí)現(xiàn)32 bit浮點(diǎn)數(shù)除法運(yùn)算算法的匯編程序,共有90 條匯編指令,在微程序入口地址表MPFAdr 中輸入FDIV指令的操作碼1110 1101,微程序入口地址為0100 0000。
表7 ISEA匯編指令微指令地址表
(5)根據(jù)算法2,用Python 語(yǔ)言編程(記為程序1),能夠自動(dòng)將AsblProgram 表中的匯編程序轉(zhuǎn)換成微程序并寫(xiě)入MProgram表,根據(jù)算法4 為JRZ/JRNZ/JRC/JRNC/JRS/JRNS/JR轉(zhuǎn)移類(lèi)指令更新其微指令中的下地址字段Nadr,根據(jù)算法5 為JRZ/JRNZ/JRC/JRNC/JRS/JRNS指令生成CC表。
算法2根據(jù)AsblProgram 表中的匯編程序生成MProgram表和ISEA表算法。
(1)從AsblProgram表中查找所有記錄的最大Number 字段值,記為maxNum,令i =1;
(2)查找AsblProgram表中Number字段等于i的記錄,記為AsbInsti;
(3)如果記錄AsbInsti 的Itype 為2,即為MVRD 指令,則根據(jù)算法3 將MVRD Ri,DATA 指令轉(zhuǎn)換成微指令并寫(xiě)入MProgram表,同時(shí)在ISEA表中寫(xiě)入MVRD指令對(duì)應(yīng)的第一條微指令的地址start和最后一條微指令地址end;
如果記錄AsbInsti 的Itype 為1,即為MVRR 指令,則只需轉(zhuǎn)換成一條相應(yīng)的微指令并寫(xiě)入MProgram表,同時(shí)在ISEA表中寫(xiě)入MVRR指令對(duì)應(yīng)的第一條微指令的地址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 指令,則只需要轉(zhuǎn)換成一條相應(yīng)的微指令并寫(xiě)入MProgram表,同時(shí)在ISEA表中寫(xiě)入待轉(zhuǎn)換匯編指令對(duì)應(yīng)的第一條微指令的地址start和最后一條微指令地址end;
如果記錄AsbInsti的Iname為PSHF、POPF指令,則需要轉(zhuǎn)換成兩條相應(yīng)的微指令并寫(xiě)入MProgram表,同時(shí)在ISEA表中寫(xiě)入待轉(zhuǎn)換匯編指令對(duì)應(yīng)的第一條微指令的地址start和最后一條微指令地址end;
(4)i =i +1,重復(fù)(2),(3),直到i >maxNum結(jié)束。
在設(shè)計(jì)的實(shí)現(xiàn)FDIV 指令的匯編程序中,用到的MVRD Ri,DATA 指令中,DATA 值有7F80、1FC0、8000、007F、0010、0001、0008、0040、0080、0100。根據(jù)DATA值的特點(diǎn),設(shè)計(jì)了算法3,算法3 的設(shè)計(jì)目標(biāo)是盡量用最少的微指令實(shí)現(xiàn)MVRD指令。
算法3MVRD Ri,DATA 指令轉(zhuǎn)換成微指令算法。
(1)將DATA轉(zhuǎn)換成16 bit二進(jìn)制數(shù)data16;
(2)計(jì)算data16中1的位數(shù),記為num_1(data16);
(3)如果num_1(data16)>1,則執(zhí)行(4),否則,執(zhí)行(12);
(4)MVRD指令的第一條微指令為SUB指令對(duì)應(yīng)的微指令,該微指令執(zhí)行后得到1111 1111 1111 1111;
(5)計(jì)算將1111 1111 1111 1111 采用先左移后右移的方法得到data16的次數(shù),記為shiftlr(data16);
(6)計(jì)算將1111 1111 1111 1111 采用先右移后左移的方法得到data16的次數(shù),記為shiftrl(data16);
(7)如果shiftlr(data16)小于等于shiftrl(data16),則執(zhí)行(8),否則,執(zhí)行(10);
(8)生成16-num_1(data16)條SHL指令對(duì)應(yīng)的微指令;
(9)生成shiftlr(data16)+num_1(data16)-16條SHR指令對(duì)應(yīng)的微指令,結(jié)束。
(10)生成16-num_1(data16)條SHR指令對(duì)應(yīng)的微指令;
(11)生成shiftrl(data16)+num_1(data16)- 16 條SHL指令對(duì)應(yīng)的微指令,結(jié)束。
(12)計(jì)算由0000 0000 0000 00001得到data16的次數(shù),記為leftshift2(data16),則由DATA 得到data16 需要leftshift2(data16)+2條微指令;
(13)計(jì)算由1111 1111 1111 11111得到data16的次數(shù),記為shiftlr(data16),則由DATA 得到data16 需要shiftlr(data16)+1條微指令;
(14)如果leftshift2(data16)+2 小于等于shiftlr(data16)+1,則執(zhí)行(15),否則執(zhí)行(18);
(15)生成SUB指令對(duì)應(yīng)的微指令,該微指令執(zhí)行后得到0000 0000 0000 0000;
(16)生成INC指令對(duì)應(yīng)的微指令,該微指令執(zhí)行后得到0000 0000 0000 0001;
(17)生成leftshift2(data16)條SHL 指令對(duì)應(yīng)的微指令,結(jié)束。
(18)生成SUB指令對(duì)應(yīng)的微指令,該微指令執(zhí)行后得到1111 1111 1111 1111;
(19)生成shiftlr(data16)條SHL 指令對(duì)應(yīng)的微指令,結(jié)束。
算法4為JRZ/JRNZ/JRC/JRNC/JRS/JRNS/JR轉(zhuǎn)移類(lèi)指令生成微指令中的下地址字段Nadr算法。
JRZ、JRNZ、JRC、JRNC、JRS、JRNS 都只需要轉(zhuǎn)換成一條微指令即可,但是要根據(jù)轉(zhuǎn)移目標(biāo)地址更新Nadr字段值。
(1)從AsblProgram 表中查找Itype 為3 或4 的所有記錄(JRZ、JRNZ、JRC、JRNC、JRS、JRNS指令的Itype為3,JR指令的Itype為4),假設(shè)查詢(xún)結(jié)果有n條記錄,令i =1;
(2)根據(jù)查詢(xún)結(jié)果中記錄i的Number字段值在ISEA表中查找start字段值,并轉(zhuǎn)換成微指令地址,記為JIstart;
(3)在AsblProgram 表中查找Label 字段等于查詢(xún)結(jié)果中記錄i的DstAdr字段值的記錄的Number字段值,記為number;
(4)在ISEA表中查找Number字段等于number的記錄的start字段值,并轉(zhuǎn)換成8bit二進(jìn)制,記為JDstart;
(5)更新MProgram表中MIadr 字段等于JIstart 的記錄的Nadr字段值為JDstart;
(6)i =i +1,重復(fù)(2)~(5),直到i >n結(jié)束。
算法5為JRZ/JRNZ/JRC/JRNC/JRS/JRNS 指令生成CC表算法。
(1)從AsblProgram 表中查找Iname 為JRZ/JRNZ/JRC/JRNC/JRS/JRNS的所有記錄,假設(shè)查詢(xún)結(jié)果有n 條記錄,令i =1;
(2)在AsblProgram 表中查找Label 字段等于查詢(xún)結(jié)果中記錄i的DstAdr字段值的記錄的Number字段值,記為number;
(3)在ISEA表中查找Number字段等于number的記錄的start字段值,并轉(zhuǎn)換成8 bit二進(jìn)制,記為JDstart;
(4)如果CC 表中還沒(méi)有Nadr 等于JDstart 的記錄,則在CC表中插入一條記錄,否則,轉(zhuǎn)(5);
(5)i =i +1,重復(fù)2 ~4步驟,直到i >n結(jié)束。
(6)根據(jù)算法6,用Python 語(yǔ)言編程(記為程序2),能夠根據(jù)MPFAdr表以及程序1 生成的MProgram表、CC表自動(dòng)生成實(shí)現(xiàn)了32 bit浮點(diǎn)除法指令的控制器源文件m256c6.abl。
算法6自動(dòng)修改并生成微程序控制器源程序的Python語(yǔ)言實(shí)現(xiàn)的算法。
(1)打開(kāi)控制器源程序文件m256c.abl,讀取m256c.abl文件的所有行存放在list1列表對(duì)象中;
with open('m256c.abl','r')as f1:
list1 =f1.readlines()
(2)連接FLOATDIV.db數(shù)據(jù)庫(kù);
db =sqlite3.connect('FLOATDIV.db')
(3)從MPFAdr表中讀取所有記錄,將所有記錄的Iname字段值和Opcode字段值組成一個(gè)字符串a(chǎn),
字符串a(chǎn)為:FDIV =(IR ==[1,1,1,0,1,1,0,1]);
在list1列表對(duì)象中找到“Expand Instruction here”字符串,將該字符串替換為字符串a(chǎn);
(4)從CC表中讀取所有記錄,根據(jù)這些記錄的SCC字段值、Iname字段值、Nadr字段值和Condition 字段值修改CC0 表達(dá)式;
(5)對(duì)MPFAdr表中的每一條記錄,根據(jù)MPadr字段值,在list1列表對(duì)象中找到D0 ~D7 邏輯表達(dá)式所在的行并進(jìn)行修改,例如,F(xiàn)DIV指令的MPadr 字段值為0100 0000,則D6 表達(dá)式中需增加FDIV信號(hào);由于m256c.abl文件中D0 ~D7表達(dá)式出現(xiàn)在CC0表達(dá)式后面,因此,在list1列表中查找D0 ~D7 時(shí),可以從CC0表達(dá)式的下一行開(kāi)始查找,這樣可提高查找速度;
(6)根據(jù)算法7,由MProgram 表中記錄修改list1 列表對(duì)象;
(7)將list1列表對(duì)象寫(xiě)入一個(gè)新文件m256c6.abl,然后,關(guān)閉該文件。
算法7根據(jù)MProgram 表中記錄修改list1 列表對(duì)象的算法。
(1)從MProgram表中讀取所有記錄,假設(shè)有n條記錄;
(2)令i =1;
(3)根據(jù)記錄i 的Nadr 字段值,在list1 列表對(duì)象中找到NADR7 ~NADR0邏輯表達(dá)式所在的行并進(jìn)行修改;
(4)根據(jù)記錄i 的Cmd 字段值,在list1 列表對(duì)象中找到CI3 ~CI0邏輯表達(dá)式所在的行并進(jìn)行修改;
(5)根據(jù)記錄i 的SCC 字段值,在list1 列表對(duì)象中找到SCC3 ~SCC0邏輯表達(dá)式所在的行并進(jìn)行修改;
(6)根據(jù)記錄i的MRW字段值,在list1列表對(duì)象中找到!_M(jìn)IO00、REQ00、_WE00邏輯表達(dá)式所在的行并進(jìn)行修改;
(7)根據(jù)記錄i 的I2-0 字段值,在list1 列表對(duì)象中找到I200、I100、!I000邏輯表達(dá)式所在的行并進(jìn)行修改;
(8)根據(jù)記錄i 的I5-3 字段值,在list1 列表對(duì)象中找到I500、I400、I300邏輯表達(dá)式所在的行并進(jìn)行修改;
(9)根據(jù)記錄i 的I8-6 字段值,在list1 列表對(duì)象中找到I800、I700、!I600邏輯表達(dá)式所在的行并進(jìn)行修改;
(10)根據(jù)記錄i 的SST 字段值,在list1 列表對(duì)象中找到SST200、SST100、SST000邏輯表達(dá)式所在的行并進(jìn)行修改;
(11)根據(jù)記錄i的SSHSCI字段值,在list1 列表對(duì)象中找到SSH00、SCI100、SCI000邏輯表達(dá)式所在的行并進(jìn)行修改;
(12)根據(jù)記錄i的DC2 字段值,在list1 列表對(duì)象中找到DC2_200、DC2_100、DC2_000 邏輯表達(dá)式所在的行并進(jìn)行修改;
(13)根據(jù)記錄i的DC1 字段值,在list1 列表對(duì)象中找到DC1_200、DC1_100、DC1_000 邏輯表達(dá)式所在的行并進(jìn)行修改;
(14)如果記錄i的Bp 字段值為“DR”,則list1 列表對(duì)象的B30表達(dá)式增加當(dāng)前記錄的MIadr字段值;如果記錄i的Bp字段值為“SR”,則list1 列表()對(duì)象的B301 表達(dá)式增加當(dāng)前記錄的MIadr字段值;如果記錄i的Bp字段值為數(shù)字字符,則修改list1列表對(duì)象的B300、B20、B10、B00邏輯表達(dá)式的值;
(15)如果記錄i的Ap 字段值為“DR”,則list1 列表對(duì)象的A301表達(dá)式增加當(dāng)前記錄的MIadr 字段值;如果記錄i 的Ap字段值為“SR”,則list1列表對(duì)象的A30 表達(dá)式增加當(dāng)前記錄的MIadr字段值;如果記錄i 的Ap 字段值為數(shù)字字符,則修改list1列表對(duì)象的A300、A20、A10、A00邏輯表達(dá)式的值;
(16)i =i +1,若i <=n,則轉(zhuǎn)到(3),否則,結(jié)束。
SQLite3 數(shù)據(jù)庫(kù)模塊是Python 2.5 之后的內(nèi)置模塊[16],使用時(shí)不用安裝,直接導(dǎo)入即可。為方便python語(yǔ)言編程,按照上述方法在Access 2010 中設(shè)計(jì)好數(shù)據(jù)庫(kù)表后,使用SQLite Expert工具將Access數(shù)據(jù)庫(kù)轉(zhuǎn)換成SQLite數(shù)據(jù)庫(kù)。
用Python語(yǔ)言編寫(xiě)兩個(gè)程序,程序1 能夠自動(dòng)將AsblProgram表中的匯編程序轉(zhuǎn)換成微程序并寫(xiě)入MProgram表、CC表和ISEA表,程序2 能根據(jù)MPFAdr表和程序1 生成的MProgram、CC 表中的內(nèi)容自動(dòng)修改微程序控制器源程序文件,根據(jù)MPFAdr 表在控制器源程序中自動(dòng)添加擴(kuò)展指令的操作碼與匯編語(yǔ)句的關(guān)系表達(dá)式以及自動(dòng)添加擴(kuò)展指令的微程序入口地址,根據(jù)CC表在控制器源程序中CC信號(hào)的邏輯表達(dá)式中自動(dòng)添加擴(kuò)展指令的條件微指令轉(zhuǎn)移所依據(jù)的判斷條件,根據(jù)MProgram表在控制器源程序中16 bit下地址字段與32 bit控制信號(hào)的邏輯表達(dá)式中自動(dòng)添加相應(yīng)的微指令地址。先后運(yùn)行這兩個(gè)程序后,會(huì)自動(dòng)生成一個(gè)名為m256c6.abl的包括了FDIV指令的控制器源程序文件。
實(shí)驗(yàn)環(huán)境為:Intel Core i5 CPU M 450 (2.40 GHz),內(nèi)存4 GB,Windows 10 操作系統(tǒng)。
將能夠自動(dòng)將AsblProgram 表中的匯編程序轉(zhuǎn)換成微程序并寫(xiě)入MProgram表、CC表和ISEA表的程序1 運(yùn)行50 次,結(jié)果如圖3 所示,最快只需1.9 s,平均需要2.166 s;將能根據(jù)MPFAdr 表和程序1 生成的MProgram、CC表中的內(nèi)容自動(dòng)修改微程序控制器源程序文件的程序2 運(yùn)行50 次,結(jié)果如圖4 所示,最快只需1.1 s,平均需要1.3 s。
圖3 由AsblProgram表自動(dòng)生成MProgram表時(shí)間
圖4 由MProgram表、CC表等自動(dòng)產(chǎn)生abl文件時(shí)間
在TEC-XP16 教學(xué)機(jī)微程序控制器中擴(kuò)展FDIV指令的完整過(guò)程如下:
(1)在Access 2010 數(shù)據(jù)庫(kù)中創(chuàng)建AsblProgram 匯編程序表、MProgram微程序表、CC微指令轉(zhuǎn)移判斷條件表、MPFAdr微程序入口地址表和匯編指令微指令地址表ISEA,并且在AsblProgram表輸入實(shí)現(xiàn)32 bit 浮點(diǎn)除法指令FDIV 的90 條匯編指令,在MPFAdr表中輸入FDIV 指令對(duì)應(yīng)的微程序入口地址0100 0000。
(2)使用SQLite Expert 工具將Access 數(shù)據(jù)庫(kù)轉(zhuǎn)換成SQLite數(shù)據(jù)庫(kù)。
(3)用Python語(yǔ)言編寫(xiě)程序1,該程序能從SQLite數(shù)據(jù)庫(kù)自動(dòng)讀取AsblProgram表中的匯編指令并自動(dòng)生成微程序、微指令轉(zhuǎn)移條件、每條匯編指令的微指令起始地址并分別寫(xiě)入MProgram表、CC表和ISEA表。
(4)用Python語(yǔ)言編寫(xiě)程序2,該程序能從SQLite3 數(shù)據(jù)庫(kù)自動(dòng)讀取并根據(jù)MProgram表、CC 表和MPFAdr 表中的內(nèi)容自動(dòng)修改m256c.abl文件并生成一個(gè)新的微程序控制器源程序文件。
(5)先后運(yùn)行程序1 和程序2,會(huì)自動(dòng)生成一個(gè)名為m256c6.abl的實(shí)現(xiàn)了FDIV指令的控制器源程序文件。
(6)將m256c6.abl文件重命名為m256c.abl。
(7)啟動(dòng)Lattice ispLEVER Classic Project Navigator 軟件,新建一個(gè)名為lc4256 的項(xiàng)目文件,將m256c.abl 添加到項(xiàng)目中,然后,將m256c.abl編譯后生成名為lc4256.jed 的文件,將lc4256.jed下載到教學(xué)機(jī)MACH芯片中。方法詳見(jiàn)文獻(xiàn)[11]。
(8)啟動(dòng)WinPcec16軟件,然后啟動(dòng)教學(xué)機(jī)監(jiān)控程序。
(9)在WinPcec16軟件中編寫(xiě)一個(gè)實(shí)現(xiàn)2個(gè)32 bit浮點(diǎn)數(shù)除法的教學(xué)機(jī)程序,如圖5 ~6所示,教學(xué)機(jī)中規(guī)定擴(kuò)展指令必須用E命令寫(xiě)入教學(xué)機(jī)內(nèi)存,F(xiàn)DIV指令的二進(jìn)制代碼為ED00(十六進(jìn)制形式),ED 為FDIV 指令的操作碼,被除數(shù)存放在R1、R0寄存器中,除數(shù)存放在R3、R2 寄存器中,最后商保存在R1、R0寄存器中。
圖5 中,被除數(shù)和除數(shù)分別是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,程序運(yùn)行結(jié)果驗(yàn)證了所設(shè)計(jì)和實(shí)現(xiàn)的32 bit浮點(diǎn)除法指令的功能是正確的。
圖5 包含F(xiàn)DIV指令的教學(xué)機(jī)程序1
圖6 包含F(xiàn)DIV指令的教學(xué)機(jī)程序2
圖6 中,被除數(shù)和除數(shù)分別是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,程序運(yùn)行結(jié)果驗(yàn)證了所設(shè)計(jì)和實(shí)現(xiàn)的32 bit浮點(diǎn)除法指令的功能是正確的。
目前國(guó)內(nèi)外還沒(méi)有研究在TEC-XP16 教學(xué)機(jī)的微程序控制器中擴(kuò)展較復(fù)雜指令,如32 bit 浮點(diǎn)數(shù)除法指令的文獻(xiàn)。本文對(duì)TEC-XP16 教學(xué)機(jī)微程序控制器中擴(kuò)展32 bit浮點(diǎn)數(shù)除法指令進(jìn)行了嘗試,設(shè)計(jì)實(shí)現(xiàn)了一種32 bit IEEE 754 浮點(diǎn)數(shù)除法指令,測(cè)試結(jié)果表明,采用本文方法在TEC-XP16 教學(xué)機(jī)上設(shè)計(jì)的32 bit浮點(diǎn)數(shù)除法指令的功能是正確的。
為解決原來(lái)采用人工方式將TEC-XP16 教學(xué)機(jī)匯編程序轉(zhuǎn)換成微程序效率低且容易出錯(cuò)等問(wèn)題,設(shè)計(jì)了匯編程序表和微程序表,并設(shè)計(jì)了一個(gè)python 程序,能夠根據(jù)匯編程序直接自動(dòng)生成微程序,同時(shí),為解決手工修改控制器源程序速度慢及容易出錯(cuò)等問(wèn)題,提出了一種能夠根據(jù)微程序自動(dòng)修改微程序控制器源程序的方法。實(shí)驗(yàn)結(jié)果表明,所設(shè)計(jì)的32 bit 浮點(diǎn)除法指令功能是正確的,平均只需要2.16 s就能根據(jù)匯編程序表自動(dòng)生成微程序表,平均只需1.3 s 就能根據(jù)微程序表、微指令轉(zhuǎn)移判斷條件表和微程序入口地址表自動(dòng)修改并生成控制器ABEL 語(yǔ)言源程序,極大提高了32 bit浮點(diǎn)除法指令的設(shè)計(jì)實(shí)現(xiàn)效率。本文提出的方法也可推廣到其他復(fù)雜指令的設(shè)計(jì)。
下一步將嘗試在TEC-XP16 教學(xué)機(jī)微程序控制器中設(shè)計(jì)32 bit浮點(diǎn)數(shù)加減法指令等復(fù)雜指令,以及進(jìn)一步研究在TEC-XP16 教學(xué)機(jī)組合邏輯控制器中設(shè)計(jì)復(fù)雜指令的方法。