1、 扩展的2条指令的格式及功能
ADTW和SWRM指令的格式、功能、寻址方式:
指令 |
格式 |
功能 |
寻址方式 |
ADTW |
ADTW DR |
DR自增2 |
寄存器寻址 |
SWRM |
SWRM DR,[SR] |
DR与[SR]的值互换 |
寄存器间接寻址 |
ADTW和SWRM指令的操作码编码、微程序步数、微程序入口地址:
指令 |
操作码编码 |
微程序步数 |
微程序入口地址 |
ADTW |
10100001(A1) |
2 |
81 |
SWRM |
11101001(E9) |
4 |
8A |
2、 指令所对应的微程序
微指令格式:
图1 微指令格式图
首先,一条微指令由以上几部分组成,首先是微下地址,也就是条件成立时转移的下地址,如果条件不成立,则将顺序执行微指令。
之后判别测试字段CI3到CI0和条件码字段SCC3到SCC0,判别测试字段只有在0011时条件码字段才有效,因此当判别测试字段和条件码字段为(30H)时,微指令执行结束后才会跳转到下地址,也就是前面谈及的条件成立时转移的下地址。当判别测试字段和条件码字段为(20H)时,将会从MAPROM映射入口地址,而当值为(E0)时,程序将顺序执行下一个地址的微指令。
第三部分是内存和IO读写控制MRW用来控制是否读写内存、是否读写串口,而当第一位/MIO的值为1时,无论后两位为任何值,都表示无内存和串口的读写操作。之后的I2到I0代表ALU的数据来源控制,I5到I3代表ALU的运算功能控制,I8到I6代表ALU的运算结果处理控制。
A口和B口代表需要使用的寄存器控制,B口可以作为源寄存器和目标寄存器,而A口则只能作为源寄存器,其中A口为0000表示不使用寄存器,1000是表示取IR的SR,0100或0101 时表示R4(SP)或R5(PC)。B口与A口相似,0000表示不使用寄存器,不同的是1000表示取IR则的DR,0100或0101则是指指R4(SP)或R5(PC)。
SST字段表示设置状态寄存器,它的值为000时表示CZVS不更新,而值为001时则表示CZVS更新,后面的SSH用于设置移位,SCI则设置进位。
最后的DC2用于设置专用寄存器接收控制,而DC1则用于设置内部总线数据来源选择控制。
编写的是第2条和第4条:
序号 |
指令 |
入口地址 |
下址 |
CI3-0 SCC3-0 |
MRW I2-0 |
I8-6 I5-3 |
B口 A口 |
SST SSHSCI |
DC2 DC1 |
2 |
ADTW DR |
81 |
00 |
E0 |
4,3 |
3,0 |
8,0 |
1,1 |
0,0 |
30 |
30 |
4,3 |
3,0 |
8,0 |
1,1 |
0,0 |
|||
4 |
SWRM DR,[SR] |
8A |
00 |
E0 |
4,3 |
0,0 |
8,0 |
0,0 |
0,0 |
00 |
E0 |
4,4 |
1,0 |
0,8 |
0,0 |
3,0 |
|||
00 |
E0 |
1,7 |
3,0 |
8,0 |
0,0 |
0,0 |
|||
30 |
30 |
0,2 |
1,0 |
0,0 |
0,0 |
0,1 |
ADTW指令各字段值的意义:
从这张表中我们可以看出ADTW指令的入口地址为81,有两条微指令组成,分别对应的地址是81和82,MA81中对应的微程序下址字段为00不起作用,因为之后的CI3-0和SCC3-0字段为E0,表示顺序执行MA82,MRW为4表示无内存和串口的读写操作,I2-0为3表示只用到一个寄存器DR。I8-6为3表示将结果送到目标寄存器DR中并输出结果。I5-3为0表示执行的操作为源和目标寄存器相加,因为没有源寄存器,因此不起作用。之后的B口为8表示取目标寄存器,A口为0则是不取寄存器。SST字段为1、SSHSCI字段也为1表示进位输入信号为1可以实现自增的效果,而DC2和DC1全为0则表示不操作并且送开关到内部总线。
MA82中对应的大多数字段值与MA81相同,不同的是MA82中对应的微程序下址字段为30指向判中断,代表指令执行结束,之后的CI3-0和SCC3-0字段为30,表示将会跳转到下地址,也就是30地址。其余部分均与MA81一致。
SWRM指令各字段值的意义:
SWRM指令的入口地址为8A,有四条微指令组成,分别对应的地址是8A、8B、8C和8D,MA8A中对应的微程序下址字段为00不起作用,因为之后的CI3-0和SCC3-0字段为E0,表示顺序执行MA8B,MRW为4表示无内存和串口的读写操作,I2-0为3表示用到了寄存器DR。I8-6为0表示将结果直接输出到Q寄存器当中。I5-3为0表示执行的操作为源和目标寄存器相加。之后的B口为8表示取目标寄存器,A口为0则是不取寄存器。SST字段和SSHSCI字段全为0表示进位输入信号为0吧并且不修改CZVS,而DC2和DC1全为0则表示不操作并且送开关到内部总线。
MA8B中字段值与MA8A不同的是I2-I0为4表示取另一个寄存器,同时I8-I6为1表示不作保存,直接输出F。A口为8表示取源寄存器,DC2为3则表示地址寄存器接收。MA8C中字段值不同的是MRW字段为1,,表示需要进行读内存的操作,I2-I0为7则表示源寄存器送外部输入的D数据。MA8D中微程序下址字段为30指向判中断,代表指令执行结束,之后的CI3-0和SCC3-0字段为30,表示将会跳转到下地址,也就是30地址。I2-0的值为2,表示将Q寄存器作为源寄存器;DC1的值为1表示送ALU输出到内部总线。
微程序控制器的组成框图:
图4 微程序控制器的组成框图
通过该图我们可以发现微指令寄存器中存放着当前正在执行的微指令,微指令寄存器将控制字段的微命令信号发出去执行。同时将判别字段的判别测试字段CI3到CI0和条件码字段SCC3到SCC0分别发送到微程序定义器Am2910和微指令转移控制条件SCC Gal当中,微程序定义器根据控制条件判断是跳转到下地址还是顺序执行或者是通过MAPROM映射入口地址。
3、ABEL语言源程序编辑以及JED文件生成
在烧写之前要制做一份扩展名为.JED的文件,中文名称叫熔丝图文件。
(1)在指令操作码定义处添加上需要添加的两条指令及其操作码:
ADTW = (IR==[1,0,1,0,0,0,0,1]);
SWRM = (IR==[1,1,1,0,1,0,0,1]);
(2)在微指令定义处定义微指令所用到的地址:
如 MA81 = (Y==[1,0,0,0,0,0,0,1]);
(3)在微指令入口地址定义处添加上微指令的入口地址,分别D0到D7分别代表8位的入口地址,注意需要使用指令名称。
(4)在指令下地址定义处添加该条指令对应的每条微程序执行完后所需要跳转到的下地址位置,注意要使用地址来添加,如:MA81。
(5)在判别测试字段处添加上微指令所使用到的判别测试字段CI3到CI0和条件码字段SCC3到SCC0,同样要用微指令的地址来添加。
(6)在主存读写字段处添加微指令对应的MRW编码。
(7)在运算器控制码处添加微指令所对应的数据来源控制、运算功能控制和运算结果处理控制。
(8)需要对微指令B口、A口进行编码,也就是微指令需要使用的寄存器控制,注意修改的是B30、B20..A00,而不是B300、B200..A000。
(9)添加对应微指令所需要的运算器SST、SSHSCI编码。
(10)最后需要对微指令所涉及的DC2与DC1字段编码进行添加。
4、MACH编程
从编辑ABEL源程序到烧写到MACH芯片,整个流程为:
图5 MACH芯片烧写流程图
操作步骤简要概况如下:
(1)将“C:\XP+DATA\XP_MACH\2A70504组基微全”下面的源文件目录复制到E盘。
(2)双击工程项目文件lc4256.syn,启动ispLEVER;
(3)双击.abl文件,进行编辑并保存;
(4)双击Compile Logic进行编译;
(5)双击JEDEC File,生成.jed文件;
(6)双击启动ispVM System;
(7) SCAN找到器件并双击;
(8) Browse找到.jed文件,OK;
(9) GO。将文件下载到MACH芯片。
五、编程验证及结果分析
(1)ADTW指令编程验证及实验结果:
图6 ANTW指令实验结果图
由于ADTW指令实现的功能是DR自增2,因此只需要一个寄存器D0,将R0作为DR并为其赋上初值3,使用ADTW指令并执行,可以发现R0变成了5,自增了2。
(2)SWRM指令编程验证及实验结果:
图7 SWRM指令实验结果图
图8 SWRM指令内存结果图
SWRM指令实现的功能是将DR寄存器中的值与以SR寄存器中的值为地址的地址空间中的值进行交换,因此需要一个寄存器D0,将R0作为DR并为其赋上初值3,需要一个寄存器D1,将R1作为SR并为其赋上初值2019。
之后需要为地址2019的地址空间赋上值为5,以便观察两个值是否交换。
使用SWRM指令并执行,执行过程中R0为目标寄存器,R1为源寄存器,执行结束后可以发现寄存器R0处的值已经变成了5,而与此同时使用D 2019查看内存的变化,可以发现内存中2019的位置已经变成了3,两者发生了互换。