• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      一種快速的浮點(diǎn)乘法指令設(shè)計(jì)方法

      2021-07-16 08:12:58宗德才王康康
      關(guān)鍵詞:浮點(diǎn)數(shù)乘法指令

      宗德才 王康康

      1(常熟理工學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院 江蘇 常熟 215500) 2(江蘇科技大學(xué)數(shù)理學(xué)院 江蘇 鎮(zhèn)江 212003)

      0 引 言

      目前,國內(nèi)很多高校計(jì)算機(jī)組成原理實(shí)驗(yàn)教學(xué)內(nèi)容主要是基于清華大學(xué)計(jì)算機(jī)系研制的TEC-XP16 教學(xué)計(jì)算機(jī)而開展的。為了使學(xué)生更好地掌握計(jì)算機(jī)的各個(gè)組成部件的工作原理,理解指令的執(zhí)行流程,系統(tǒng)地建立計(jì)算機(jī)整機(jī)概念,迫切需要開發(fā)一些設(shè)計(jì)性實(shí)驗(yàn),如在CPU的控制器中設(shè)計(jì)一些新指令。

      文獻(xiàn)[1]設(shè)計(jì)了一種4位乘法指令和一種8位除4位除法指令,文獻(xiàn)[2]、文獻(xiàn)[3]將EDA 軟件Proteus 應(yīng)用于教學(xué)實(shí)驗(yàn)中,缺點(diǎn)是很難形成對計(jì)算機(jī)硬件的直觀理解,并且都未設(shè)計(jì)浮點(diǎn)乘法等復(fù)雜指令。文獻(xiàn)[4]設(shè)計(jì)了一個(gè)8位模型機(jī),設(shè)計(jì)了14條指令,但未設(shè)計(jì)浮點(diǎn)乘法等復(fù)雜指令。文獻(xiàn)[5]設(shè)計(jì)了加法等指令,但并未設(shè)計(jì)浮點(diǎn)乘法指令等復(fù)雜指令。文獻(xiàn)[6]要求學(xué)生至少設(shè)計(jì)實(shí)現(xiàn)7條指令,但并未要求設(shè)計(jì)浮點(diǎn)乘法等復(fù)雜指令。

      文獻(xiàn)[7]介紹了TH-union 教學(xué)機(jī)微程序控制器的原理及實(shí)驗(yàn)步驟,沒有擴(kuò)展新指令。文獻(xiàn)[8]在TEC-2000教學(xué)機(jī)微程序控制器中設(shè)計(jì)實(shí)現(xiàn)了4條簡單的擴(kuò)展指令。文獻(xiàn)[9]在TEC-2000教學(xué)機(jī)微程序控制器中設(shè)計(jì)實(shí)現(xiàn)了2條簡單的擴(kuò)展指令。文獻(xiàn)[8]和文獻(xiàn)[9]在TEC-2000教學(xué)機(jī)微程序控制器中擴(kuò)展的指令都比較簡單。文獻(xiàn)[10]研究了在TEC-XP16組合邏輯控制器中擴(kuò)展簡單指令的方法。文獻(xiàn)[11]提出一種微程序控制器中8位無符號(hào)乘法指令與8位無符號(hào)除法指令的設(shè)計(jì)方法,均需要二十多條微指令組成的微程序來實(shí)現(xiàn),設(shè)計(jì)好微程序后都采用手工方式修改控制器源程序,其效率低、速度慢且容易出錯(cuò)。

      本文基于TEC-XP16教學(xué)機(jī),提出微程序控制器中32位浮點(diǎn)乘法指令的一種快速的設(shè)計(jì)方法。為解決人工方式將每條匯編指令轉(zhuǎn)換成一條或多條微指令速度慢且容易出錯(cuò)等問題,設(shè)計(jì)了匯編程序表和微程序表,并設(shè)計(jì)了一個(gè)Python程序,能夠根據(jù)匯編程序直接自動(dòng)生成微程序。同時(shí),為解決手工修改控制器ABEL語言源程序速度慢及容易出錯(cuò)等問題,提出一種能夠自動(dòng)修改控制器的ABEL語言源程序的方法。實(shí)驗(yàn)結(jié)果表明,所設(shè)計(jì)的32位浮點(diǎn)乘法指令的功能是正確的,平均只需要1.9 s就能根據(jù)匯編程序表自動(dòng)生成微程序表,平均只需0.7 s就能根據(jù)微程序表、微指令轉(zhuǎn)移判斷條件表和微程序入口地址表自動(dòng)修改并生成控制器ABEL語言源程序,極大提高了浮點(diǎn)乘法指令的設(shè)計(jì)速度。該方法也可推廣到其他復(fù)雜指令的設(shè)計(jì)過程上。

      1 在微程序控制器中設(shè)計(jì)浮點(diǎn)乘法指令

      在TEC-XP16教學(xué)機(jī)微程序控制器中擴(kuò)展指令時(shí),首先,設(shè)計(jì)新指令對應(yīng)的微程序,根據(jù)微程序修改描述 MACH 芯片功能的 ABEL語言源程序[12],然后將修改后的ABEL語言程序用ISP LEVER軟件編譯成.jed文件,接著將.jed文件下載到MACH芯片中,最后,在教學(xué)機(jī)上調(diào)試運(yùn)行包含新指令的教學(xué)機(jī)程序。

      在現(xiàn)有的 TEC-XP16 教學(xué)機(jī)中,微程序控制器只能執(zhí)行29條基本指令。本文在TEC-XP16 教學(xué)機(jī)微程序控制器中設(shè)計(jì)實(shí)現(xiàn)了一種32位浮點(diǎn)數(shù)乘法指令。

      在TEC-XP16教學(xué)機(jī)的微程序控制器中設(shè)計(jì)浮點(diǎn)乘法指令的主要過程如下:

      1) 首先,確定32位浮點(diǎn)乘法指令FMUL的格式和功能,如表1所示。

      表1 FMUL指令的指令格式與功能

      2) 按32位浮點(diǎn)乘法指令的功能和格式,設(shè)計(jì)32位浮點(diǎn)乘法算法,如算法1所示。

      算法132位浮點(diǎn)數(shù)乘法運(yùn)算算法

      被乘數(shù)與乘數(shù)都用32位IEEE 754浮點(diǎn)數(shù)表示,被乘數(shù)存放在R1、R0寄存器,乘數(shù)存放在R3、R2寄存器,乘積為32位IEEE 754浮點(diǎn)數(shù),最后,乘積存放在R1、R0寄存器中。

      (1) 如果R1和R0都是0,即被乘數(shù)近似為0,則結(jié)果近似為0,否則,轉(zhuǎn)步驟(2)。

      (2) 如果R3和R2都是0,即乘數(shù)近似為0,則結(jié)果近似為0,否則,轉(zhuǎn)步驟(3)。

      (3) 取被乘數(shù)階碼部分,并右移一位,保存在R6寄存器中,R6中結(jié)果為 00JJ JJJJ JJ00 0000,其中J表示階碼部分。

      (4) 取乘數(shù)階碼部分,并右移一位,保存在R7寄存器中,R7中結(jié)果為 00JJ JJJJ JJ00 0000。

      (5) 階碼求和:(R6)+(R7)→R6。

      (6) 浮點(diǎn)數(shù)中階碼用移碼表示,移碼是在階碼真值基礎(chǔ)上加127,階碼相加時(shí),127被加了2次,因此,需要把階碼和減去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。

      (10) 將R9、R8清為0,R9、R8存放部分積。

      (11) 如果R2為0,只需移位8次,則令R15為1,R10為8,將R3內(nèi)容傳送到R2,R3清為0;如果R2為非0,則令R15為0,R10為16。

      (12) 將R2右移一位,R2最低位移入C觸發(fā)器。

      (13) 如果C=1,則 R1//R0 + R9//R82→ R9//R8;如果C=0,則轉(zhuǎn)移到步驟(15)。

      (14) 如果R10不等于1,則執(zhí)行步驟(15);如果R10為1,并且R15為1,則轉(zhuǎn)移到步驟(18)(尾數(shù)最高位為整數(shù)1,所以不需要右移);如果R10為1,且R15為0,則執(zhí)行步驟(15)。

      (15) 將R9//R8//R2聯(lián)合右移一位。

      (16) R10減1。

      (17) 如果R10為0,則執(zhí)行步驟(18),否則轉(zhuǎn)步驟(13)。

      (18) 如果R3為0,則執(zhí)行步驟(19);否則,令R15為1,R10為8,將R3內(nèi)容傳送到R2,R3清為0,轉(zhuǎn)步驟(12)。

      (19) 將R9、R8內(nèi)容分別送到R1、R0,將R2內(nèi)容送到R9。

      (20) 如果R1中尾數(shù)最高位為0,則執(zhí)行步驟(21),否則,執(zhí)行步驟(22)。

      (21) 將R1//R0//R9聯(lián)合右移一位,階碼加1,轉(zhuǎn)步驟(20)。

      (22) 如果R9最高位為1,則R1//R0 +1 → R1//R0,否則,R1//R0不變。

      (23) 如果R1中尾數(shù)最高位的左邊一位為1,則執(zhí)行步驟(24),否則,執(zhí)行步驟(25)。

      (24) 將R1//R0//R9聯(lián)合右移一位,階碼加1。

      (25) 如果R6最高位為1,則為下溢,結(jié)果為0,結(jié)束;如果R6次高位為1,則為上溢,令C=1,結(jié)束;如果R6最高兩位為00,則執(zhí)行步驟(26)。

      (26) R6最高兩位為00表示結(jié)果沒有溢出,令C=0,將R6左移一位,調(diào)整R1寄存器的內(nèi)容,R1最高位即R7最高位,R1次高位開始的8位即R6中階碼部分,R1低7位即高7位尾數(shù)不變,結(jié)束。

      如圖1所示,在IEEE 754格式的32位浮點(diǎn)數(shù)中最高位是數(shù)符,表示浮點(diǎn)數(shù)的正負(fù),階碼用移碼表示,階碼的真值都被加上一個(gè)偏移量,對于32位浮點(diǎn)數(shù)的偏移量為127。

      1位數(shù)符8位階碼7位尾數(shù) 16位尾數(shù)

      在IEEE 754格式浮點(diǎn)數(shù)中尾數(shù)部分通常都是規(guī)格化表示的,即非0的有效位最高位總是1,有效位呈如下形式:1.ffff…fff,在實(shí)際的表示中,對于32位浮點(diǎn)數(shù),這個(gè)整數(shù)位的1被省略,稱為隱藏位。

      TEC-XP16教學(xué)機(jī)中共有16個(gè)16位的通用寄存器R0~R15。32位浮點(diǎn)數(shù)需要用兩個(gè)通用寄存器來表示。

      3) 根據(jù)算法1,用TEC-XP16教學(xué)機(jī)的匯編指令編寫程序?qū)崿F(xiàn)算法1。同時(shí),設(shè)計(jì)數(shù)據(jù)庫表。

      Python語言具有簡單易學(xué)、免費(fèi)開源和可擴(kuò)展移植性好等特性[13],因此,選擇Python語言作為程序設(shè)計(jì)語言。

      如圖2所示,TEC-XP16教學(xué)機(jī)中,一條微指令由16位的下地址字段和32位的控制命令字段共同組成[14]。

      下地址命令碼微轉(zhuǎn)移條件MRWI2-I0I8-I6I5-I3B口地址A口地址SSTSSHSCIDC2DC116位下地址字段32位控制命令字段

      根據(jù)TEC-XP16教學(xué)機(jī)微指令的格式,設(shè)計(jì)了微程序表MProgram,如表2所示,用于保存32位浮點(diǎn)數(shù)乘法指令對應(yīng)的由微指令組成的微程序。

      表2 MProgram微程序表

      為了實(shí)現(xiàn)根據(jù)匯編程序自動(dòng)生成微程序這一功能,設(shè)計(jì)了匯編程序表AsblProgram,如表3所示,用于保存根據(jù)32位浮點(diǎn)數(shù)乘法運(yùn)算算法編寫的100條匯編指令組成的匯編程序。

      表3 AsblProgram匯編程序表

      圖2中,命令碼用于控制微指令的執(zhí)行順序,命令碼CI3-CI0為1110時(shí),順序執(zhí)行。命令碼CI3-CI0為0010時(shí),根據(jù)指令的操作碼確定該指令對應(yīng)的微程序的入口地址。設(shè)計(jì)了微程序入口地址表MPFAdr,如表4所示,用于保存32位浮點(diǎn)數(shù)乘法指令對應(yīng)的微程序的第一條微指令的地址。

      表4 MPFAdr微程序入口地址表

      命令碼CI3-CI0為0011時(shí),用于條件微轉(zhuǎn)移控制,如表5所示,微轉(zhuǎn)移條件SCC3-SCC0用于條件微轉(zhuǎn)移時(shí)給出轉(zhuǎn)移依據(jù)的條件,條件滿足時(shí)發(fā)生轉(zhuǎn)移,下一條微指令的地址為當(dāng)前微指令中下地址字段的內(nèi)容;條件不滿足,順序執(zhí)行[15]。

      表5 條件微指令轉(zhuǎn)移所依據(jù)的判斷條件表

      根據(jù)表5設(shè)計(jì)了CC微指令轉(zhuǎn)移判斷條件表,用于保存微指令轉(zhuǎn)移的條件,如表6所示。

      表6 CC微指令轉(zhuǎn)移判斷條件表

      由于每一條匯編指令轉(zhuǎn)換后的微指令數(shù)目不同,設(shè)計(jì)了ISEA表(如表7所示)用于存儲(chǔ)每一條匯編指令轉(zhuǎn)換成為微指令后,對應(yīng)的第一條微指令地址start和最后一條微指令的地址end。

      表7 ISEA匯編指令微指令地址表

      4) 在匯編程序表AsblProgram中輸入實(shí)現(xiàn)32位浮點(diǎn)數(shù)乘法運(yùn)算算法的匯編程序,共有100條匯編指令,在微程序入口地址表MPFAdr 中輸入FMUL指令的操作碼1110 1100,微程序入口地址為0011 1100。

      5) 根據(jù)算法2和算法3,用Python語言編程(記為程序1),能夠自動(dòng)將AsblProgram表中的匯編程序轉(zhuǎn)換成微程序并寫入MProgram表,根據(jù)算法4為JRZ/JRNZ/JRC/JRNC/JRS/JRNS/JR轉(zhuǎn)移類指令更新其微指令中的下地址字段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)換成微指令并寫入MProgram表,同時(shí)在ISEA表中寫入MVRD指令對應(yīng)的第一條微指令的地址start和最后一條微指令地址end;如果記錄AsbInsti的Itype為1,即為MVRR指令,則只需轉(zhuǎn)換成一條相應(yīng)的微指令并寫入MProgram表,同時(shí)在ISEA表中寫入MVRR指令對應(yīng)的第一條微指令的地址start和最后一條微指令地址end;如果記錄AsbInsti的Iname為OR、AND、ADD、SUB、XOR、TEST、ADC、CMP、SHR、RCR、SHL、INC、DEC、JR、JRZ、JRNZ、JRC、JRNC、JRS、JRNS、CLC、RET指令,則只需要轉(zhuǎn)換成一條相應(yīng)的微指令并寫入MProgram表,同時(shí)在ISEA表中寫入待轉(zhuǎn)換匯編指令對應(yīng)的第一條微指令的地址start和最后一條微指令地址end;如果記錄AsbInsti的Iname為PSHF、POPF指令,則需要轉(zhuǎn)換成兩條相應(yīng)的微指令并寫入MProgram表,同時(shí)在ISEA表中寫入待轉(zhuǎn)換匯編指令對應(yīng)的第一條微指令的地址start和最后一條微指令地址end。

      (4)i=i+1,重復(fù)步驟(2)和步驟(3),直到i>maxNum結(jié)束。

      在本文設(shè)計(jì)的實(shí)現(xiàn)FMUL指令的匯編程序中,用到的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位二進(jìn)制數(shù)a。

      (2) 計(jì)算a中1的位數(shù),記為num_1(a)。

      (3) 如果num_1(a)大于1,則執(zhí)行步驟(4),否則,執(zhí)行步驟(12)。

      (4) MVRD指令的第一條微指令為SUB指令對應(yīng)的微指令,該微指令執(zhí)行后得到 1111 1111 1111 1111。

      (5) 計(jì)算將1111 1111 1111 1111采用先左移后右移的方法得到a的次數(shù),記為shiftlr(a)。

      (6) 計(jì)算將1111 1111 1111 1111采用先右移后左移的方法得到a的次數(shù),記為shiftrl(a)。

      (7) 如果shiftlr(a)小于等于shiftrl(a),則執(zhí)行步驟(8),否則,執(zhí)行步驟(10)。

      (8) 生成16-num_1(a)條SHL指令對應(yīng)的微指令。

      (9) 生成shiftlr(a)+num_1(a)-16條SHR指令對應(yīng)的微指令,結(jié)束。

      (10) 生成16-num_1(a)條SHR指令對應(yīng)的微指令。

      (11) 生成shiftrl(a)+num_1(a)-16條SHL指令對應(yīng)的微指令,結(jié)束。

      (12) 計(jì)算由0000 0000 0000 00001得到a的次數(shù),記為leftshift2(a),則由DATA得到a需要leftshift2(a)+2條微指令。

      (13) 計(jì)算由1111 1111 1111 11111得到a的次數(shù),記為shiftlr(a),則由DATA得到a需要shiftlr(a)+1條微指令。

      (14) 如果leftshift2(a)+2小于等于shiftlr(a)+1,則執(zhí)行步驟(15),否則執(zhí)行步驟(18)。

      (15) 生成SUB指令對應(yīng)的微指令,該微指令執(zhí)行后得到0000 0000 0000 0000。

      (16) 生成INC指令對應(yīng)的微指令,該微指令執(zhí)行后得到0000 0000 0000 0001。

      (17) 生成leftshift2(a)條SHL指令對應(yīng)的微指令,結(jié)束。

      (18) 生成SUB指令對應(yīng)的微指令,該微指令執(zhí)行后得到 1111 1111 1111 1111。

      (19) 生成shiftlr(a)條SHL指令對應(yīng)的微指令,結(jié)束。

      算法4為JRZ/JRNZ/JRC/JRNC/JRS/JRNS/JR轉(zhuǎn)移類指令生成微指令中的下地址字段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è)查詢結(jié)果有n條記錄,令i=1。

      (2) 根據(jù)查詢結(jié)果中記錄i的Number字段值在ISEA表中查找start字段值,并轉(zhuǎn)換成微指令地址,記為kkk。

      (3) 在AsblProgram表中查找Label字段等于查詢結(jié)果中記錄i的DstAdr字段值的記錄的Number字段值,記為number。

      (4) 在ISEA表中查找Number字段等于number的記錄的start字段值,并轉(zhuǎn)換成8位二進(jìn)制,記為start66。

      (5) 更新MProgram表中MIadr字段等于kkk的記錄的Nadr字段值為start66。

      (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è)查詢結(jié)果有n條記錄,令i=1。

      (2) 在AsblProgram表中查找Label字段等于查詢結(jié)果中記錄i的DstAdr字段值的記錄的Number字段值,記為number。

      (3) 在ISEA表中查找Number字段等于number的記錄的start字段值,并轉(zhuǎn)換成8位二進(jìn)制,記為start66。

      (4) 如果CC表中還沒有Nadr等于start66的記錄,則在CC表中插入一條記錄,否則,轉(zhuǎn)步驟(5)。

      (5)i=i+1,重復(fù)步驟(2)-步驟(4),直到i>n結(jié)束。

      6) 根據(jù)算法6和算法7,用Python語言編程(記為程序2),能夠根據(jù)MPFAdr表以及程序1生成的MProgram表、CC表自動(dòng)生成實(shí)現(xiàn)了32位浮點(diǎn)乘法指令的控制器源文件m256c6.abl。

      算法6自動(dòng)修改并生成微程序控制器源程序的Python語言實(shí)現(xiàn)的算法

      (1) 打開控制器源程序文件m256c.abl,讀取m256c.abl文件的所有行存放在list1列表對象中。

      with open('m256c.abl', 'r') as f1:

      list1 = f1.readlines()

      (2) 連接mpdatabase.db數(shù)據(jù)庫。

      db=sqlite3.connect('mpdatabase.db')

      (3) 從MPFAdr表中讀取所有記錄,將所有記錄的Iname字段值和Opcode字段值組成一個(gè)字符串a(chǎn),字符串a(chǎn)為:FMUL=(IR==[1,1,1,0,1,1,0,0]);在list1列表對象中找到“Expand Instruction here ”字符串,將該字符串替換為字符串a(chǎn)。

      (4) 從CC表中讀取所有記錄,根據(jù)這些記錄的SCC字段值、Iname字段值、Nadr字段值和Condition字段值修改CC0表達(dá)式,如圖3所示,圖3中黑底部分為增加的部分。

      圖3 修改后的CC0表達(dá)式

      (5) 對MPFAdr表中的每一條記錄,根據(jù)MPadr字段值,在list1列表對象中找到D0-D7邏輯表達(dá)式所在的行并進(jìn)行修改,例如,F(xiàn)MUL指令的MPadr字段值為0011 1100,則D2、D3、D4、D5表達(dá)式中需增加FMUL信號(hào);由于m256c.abl文件中D0-D7表達(dá)式出現(xiàn)在CC0表達(dá)式后面,因此,在list列表中查找D0-D7時(shí),可以從CC0表達(dá)式的下一行開始查找,這樣可提高查找速度。

      (6) 根據(jù)算法7,由MProgram表中記錄修改list1列表對象。

      (7) 將list1列表對象寫入一個(gè)新文件m256c6.abl,然后,關(guān)閉該文件。

      算法7根據(jù)MProgram表中記錄修改list1列表對象的算法

      (1) 從MProgram表中讀取所有記錄,假設(shè)有n條記錄。

      (2) 令i=1。

      (3) 根據(jù)記錄i的Nadr字段值,在list1列表對象中找到NADR7-NADR0邏輯表達(dá)式所在的行并進(jìn)行修改。

      (4) 根據(jù)記錄i的Cmd字段值,在list1列表對象中找到CI3-CI0邏輯表達(dá)式所在的行并進(jìn)行修改。

      (5) 根據(jù)記錄i的SCC字段值,在list1列表對象中找到SCC3-SCC0邏輯表達(dá)式所在的行并進(jìn)行修改。

      (6) 根據(jù)記錄i的MRW字段值,在list1列表對象中找到!_MIO00、REQ00、_WE00邏輯表達(dá)式所在的行并進(jìn)行修改。

      (7) 根據(jù)記錄i的I2-I0字段值,在list1列表對象中找到I200、I100、!I000邏輯表達(dá)式所在的行并進(jìn)行修改。

      (8) 根據(jù)記錄i的I5-I3字段值,在list1列表對象中找到I500、I400、I300邏輯表達(dá)式所在的行并進(jìn)行修改。

      (9) 根據(jù)記錄i的I8-I6字段值,在list1列表對象中找到I800、I700、!I600邏輯表達(dá)式所在的行并進(jìn)行修改。

      (10) 根據(jù)記錄i的SST字段值,在list1列表對象中找到SST200、SST100、SST000邏輯表達(dá)式所在的行并進(jìn)行修改。

      (11) 根據(jù)記錄i的SSHSCI字段值,在list1列表對象中找到SSH00、SCI100、SCI000邏輯表達(dá)式所在的行并進(jìn)行修改。

      (12) 根據(jù)記錄i的DC2字段值,在list1列表對象中找到DC2_200、DC2_100、DC2_000邏輯表達(dá)式所在的行并進(jìn)行修改。

      (13) 根據(jù)記錄i的DC1字段值,在list1列表對象中找到DC1_200、DC1_100、DC1_000邏輯表達(dá)式所在的行并進(jìn)行修改。

      (14) 如果記錄i的Bp字段值為“DR”,則list1列表對象的B30表達(dá)式增加當(dāng)前記錄的MIadr字段值;如果記錄i的Bp字段值為“SR”,則list1列表對象的B301表達(dá)式增加當(dāng)前記錄的MIadr字段值;如果記錄i的Bp字段值為數(shù)字字符,則修改list1列表對象的B300、B20、B10、B00邏輯表達(dá)式的值。

      (15) 如果記錄i的Ap字段值為“DR”,則list1列表對象的A301表達(dá)式增加當(dāng)前記錄的MIadr字段值;如果記錄i的Ap字段值為“SR”,則list1列表對象的A30表達(dá)式增加當(dāng)前記錄的MIadr字段值;如果記錄i的Ap字段值為數(shù)字字符,則修改list1列表對象的A300、A20、A10、A00邏輯表達(dá)式的值。

      (16)i=i+1,若i≤n,則轉(zhuǎn)到步驟(3),否則,結(jié)束。

      2 實(shí) 驗(yàn)

      按照上述方法在Access 2010中設(shè)計(jì)好數(shù)據(jù)庫表后,為了方便Python語言編程,使用SQLite Expert工具將Access數(shù)據(jù)庫轉(zhuǎn)換成SQLite數(shù)據(jù)庫。

      用Python語言編寫兩個(gè)程序,程序1能夠自動(dòng)將AsblProgram表中的匯編程序轉(zhuǎn)換成微程序并寫入MProgram表、CC表和ISEA表;程序2能根據(jù)MPFAdr表和程序1生成的MProgram、CC表中的內(nèi)容自動(dòng)修改微程序控制器源程序文件,根據(jù)MPFAdr表在控制器源程序中自動(dòng)添加擴(kuò)展指令的操作碼與匯編語句的關(guān)系表達(dá)式以及自動(dòng)添加擴(kuò)展指令的微程序入口地址,根據(jù)CC表在控制器源程序中CC信號(hào)的邏輯表達(dá)式中自動(dòng)添加擴(kuò)展指令的條件微指令轉(zhuǎn)移所依據(jù)的判斷條件,根據(jù)MProgram表在控制器源程序中16位下地址字段與32位控制信號(hào)的邏輯表達(dá)式中自動(dòng)添加相應(yīng)的微指令地址。先后運(yùn)行這兩個(gè)程序后,會(huì)自動(dòng)生成一個(gè)名為m256c6.abl的包括了FMUL指令的控制器源程序文件。

      將能夠自動(dòng)把AsblProgram表中的匯編程序轉(zhuǎn)換成微程序并寫入MProgram表、CC表和ISEA表的程序1運(yùn)行50次,結(jié)果如圖4所示,最快只需1.8 s,平均需要1.945 s;將能根據(jù)MPFAdr表和程序1生成的MProgram、CC表中的內(nèi)容自動(dòng)修改微程序控制器源程序文件的程序2運(yùn)行50次,結(jié)果如圖5所示,最快只需0.67 s,平均需要0.71 s。

      圖4 由AsblProgram表自動(dòng)生成MProgram表的時(shí)間

      圖5 由MProgram表、CC表等自動(dòng)產(chǎn)生abl文件的時(shí)間

      在TEC-XP16教學(xué)機(jī)微程序控制器中擴(kuò)展FMUL指令的完整過程如下:

      (1) 在Access 2010數(shù)據(jù)庫中創(chuàng)建AsblProgram匯編程序表、MProgram微程序表、CC微指令轉(zhuǎn)移判斷條件表、MPFAdr微程序入口地址表和匯編指令微指令地址表ISEA,并且在AsblProgram表輸入實(shí)現(xiàn)32位浮點(diǎn)乘法指令FUML的100條匯編指令,在MPFAdr表中輸入FMUL指令對應(yīng)的微程序入口地址0011 1100。

      (2) 使用SQLite Expert工具將Access數(shù)據(jù)庫轉(zhuǎn)換成SQLite數(shù)據(jù)庫。

      (3) 用Python語言編寫程序1,該程序能從SQLite數(shù)據(jù)庫自動(dòng)讀取AsblProgram表中的匯編指令并自動(dòng)生成微程序、微指令轉(zhuǎn)移條件、每條匯編指令的微指令起始地址并分別寫入MProgram表、CC表和ISEA表。

      (4) 用Python語言編寫程序2,該程序能從SQLite3數(shù)據(jù)庫自動(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)了FMUL指令的控制器源程序文件。

      (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芯片中。方法詳見文獻(xiàn)[11]。

      (8) 啟動(dòng)WinPcec16軟件,然后啟動(dòng)教學(xué)機(jī)監(jiān)控程序。

      (9) 在WinPcec16軟件中編寫一個(gè)實(shí)現(xiàn)2個(gè)32位浮點(diǎn)數(shù)乘法的教學(xué)機(jī)程序,如圖6-圖7所示,教學(xué)機(jī)中規(guī)定擴(kuò)展指令必須用E命令寫入教學(xué)機(jī)內(nèi)存,F(xiàn)MUL指令的二進(jìn)制代碼為EC00(十六進(jìn)制形式),EC為FMUL指令的操作碼,被乘數(shù)存放在R1、R0寄存器中,乘數(shù)存放在R3、R2寄存器中,乘積保存在R1、R0寄存器中。

      圖6中,被乘數(shù)和乘數(shù)都是0100 0000 0000 0000 0000 0000 0000 0000,即1.0×21,乘積為0100 0000 1000 0000 0000 0000 0000 0000,即1.0×22,程序運(yùn)行結(jié)果驗(yàn)證了本文所設(shè)計(jì)和實(shí)現(xiàn)的32位浮點(diǎn)乘法指令的功能是正確的。

      圖7中,被乘數(shù)和乘數(shù)都是0100 0000 0001 0000 0000 0000 0000 0000,即1.001×21,乘積為0100 0000 1010 0010 0000 0000 0000 0000,即1.010 001×22,程序運(yùn)行結(jié)果驗(yàn)證了本文所設(shè)計(jì)和實(shí)現(xiàn)的32位浮點(diǎn)乘法指令的功能是正確的。

      3 結(jié) 語

      目前國內(nèi)外還沒有研究在TEC-XP16教學(xué)機(jī)的微程序控制器中擴(kuò)展較復(fù)雜指令,如32位浮點(diǎn)數(shù)乘法指令的文獻(xiàn)。本文對TEC-XP16 教學(xué)機(jī)微程序控制器中擴(kuò)展32位浮點(diǎn)數(shù)乘法指令進(jìn)行了嘗試,設(shè)計(jì)一種32位IEEE 754浮點(diǎn)數(shù)乘法指令,測試結(jié)果表明,采用本文方法在TEC-XP16教學(xué)機(jī)上設(shè)計(jì)的32位浮點(diǎn)數(shù)乘法指令的功能是正確的。

      為解決原來采用人工方式將TEC-XP16教學(xué)機(jī)匯編程序轉(zhuǎn)換成微程序速度慢、效率低且容易出錯(cuò)等問題,設(shè)計(jì)匯編程序表和微程序表,并設(shè)計(jì)一個(gè)Python程序,能夠根據(jù)匯編程序直接自動(dòng)生成微程序。同時(shí),為解決手工修改控制器源程序速度慢及容易出錯(cuò)等問題,提出一種能夠根據(jù)微程序自動(dòng)修改微程序控制器源程序的方法。實(shí)驗(yàn)結(jié)果表明,所設(shè)計(jì)的32位浮點(diǎn)乘法指令的功能是正確的,平均只需要1.9 s就能根據(jù)匯編程序表自動(dòng)生成微程序表,平均只需0.7 s就能根據(jù)微程序表、微指令轉(zhuǎn)移判斷條件表和微程序入口地址表自動(dòng)修改并生成控制器ABEL語言源程序,極大提高了32位浮點(diǎn)乘法指令的設(shè)計(jì)速度。本文方法也可推廣到其他復(fù)雜指令的設(shè)計(jì)上。

      下一步將嘗試在TEC-XP16教學(xué)機(jī)微程序控制器中設(shè)計(jì)32位浮點(diǎn)數(shù)除法指令等復(fù)雜指令,以及進(jìn)一步研究在TEC-XP16教學(xué)機(jī)組合邏輯控制器中設(shè)計(jì)復(fù)雜指令的方法。

      猜你喜歡
      浮點(diǎn)數(shù)乘法指令
      聽我指令:大催眠術(shù)
      算乘法
      我們一起來學(xué)習(xí)“乘法的初步認(rèn)識(shí)”
      四種Python均勻浮點(diǎn)數(shù)生成方法
      《整式的乘法與因式分解》鞏固練習(xí)
      把加法變成乘法
      ARINC661顯控指令快速驗(yàn)證方法
      LED照明產(chǎn)品歐盟ErP指令要求解讀
      電子測試(2018年18期)2018-11-14 02:30:34
      在C語言中雙精度浮點(diǎn)數(shù)線性化相等比較的研究
      非精確浮點(diǎn)數(shù)乘法器設(shè)計(jì)
      镇江市| 出国| 冀州市| 耒阳市| 永城市| 田林县| 贡觉县| 泸西县| 五大连池市| 上林县| 九寨沟县| 石首市| 罗田县| 涟源市| 永嘉县| 通许县| 新化县| 吴江市| 靖边县| 台南市| 加查县| 祥云县| 双流县| 桦甸市| 石嘴山市| 太白县| 灵山县| 永和县| 区。| 陇川县| 岳西县| 长顺县| 茌平县| 敦煌市| 浮山县| 阜南县| 娄烦县| 渝北区| 满城县| 光山县| 油尖旺区|