搜索
写经验 领红包
 > 动物

什么叫非指令(plc非指令)

导语:CPU系列-非ALU指令编码及解析

如何实现和指令

前面说了,当指令的第一位为1时,是ALU相关指令。接下来我们就看看当第一位不为1时的指令情况,见下图:

最高位0表示非ALU指令,接下来三位为000表示加载数据,001表示存储数据。指令后四位和ALU指令一致,表示寄存器的编码。实现逻辑为:

当前四位为0000时:

Step 4:Reg A的数据存储到RAM中(地址为MAR);

Step 5: RAM中地址为MAR的数据存储到Reg A;

当前四位为0001时:

Step 4:Reg A的数据存储到MAR;

Step 5: Reg B中的数据存储到RAM中(地址为MAR);

助记符如下:

如何实现指令

当指令前四位为0010时,代表的是数据指令。与之前不同的是,这个指令有2个字节,后面紧跟的字节为要写入寄存器的数据,如下图所示:

实现方式为:

Step 4:读取IAR中的数据,存储到MAR中;bus 1使能,将IAR+1的结果存到ACC中;

Step 5:读取RAM中的数据(地址为IAR),存储到Reg B中;

Step 6:读取ACC中的数据(此时为IAR+1),更新到IAR中;

注意:由于IAR在step 1的时候已经+1了,在step 4又+1,因此,下一条指令将跳过紧邻的后一条指令(为需要载入的数据),从而实现将后一条紧邻的输入读入的功能。

助记符如下:

如何实现指令

当指令前四位为0011时,代表的是跳转指令,如下图所示:

实现方式为:

Step 4:Reg B中的数据存储到IAR中,意味着下一次的指令将从IAR(目前为Reg B寄存器中存储的数据),从而实现跳转功能。

助记符如下:

如何实现指令

当指令前四位为0100时,代表的是跳转到指令,注意,这也是一条2字节指令,紧邻的后1字节代表要跳转到的地址,如下图所示:

实现方式为:

Step 4:将IAR中的数据存储到MAR;

Step 5:将RAM中地址为IAR的数据存储到IAR;

也就是IAR中的内容变成了RAM[IAR+1],实现到“跳转到”功能。

助记符如下:

如何实现指令

当然还可以实现更复杂的跳转指令,比如说有条件跳转,如下图所示:

前面我们说了,ALU计算会输出四个标志位,分别为:carry out、a larger、equal和zero。如下图所示:

我们可以把这四个标志位作为判断条件,实现有条件跳转,实现方式如下:

Step 4:IAR传输至MAR,IAR+ 1传输至ACC;

Step 5:ACC传输至IAR;

Step 6:若carry out、a larger、equal或zero其中之一为真,则RAM [IAR] 传输至IAR。

也就是说,新的IAR有两种情况,正常情况下,程序将顺序执行(跳过紧邻的“地址”字节);当carry out、a larger、equal或zero之一为真时,程序跳转到紧邻字节所存储的地址。

助记符如下:

如果我们把指令某个位置1,这样就可以进行组合标志条件跳转,因为我们有4个标志位,共计有16种组合,当然,4个标志位都off时,就不需要跳转,所以我们只对剩下的15个标志位组合感兴趣,其机器语言如下:

两个标志位组合:

三个或四个标志位组合:

如何实现指令

当我们去做加法或者移位运算时,可能会用到carry进位标志位,比如在有条件跳转时,就会用到这个标志位。

Carry标志位还会作为加法和移位运算的输入,这就带来一个问题:Carry标志位是存在寄存器里面的,会一直保存之前的记录,当我们的运算不需要这个进位的时候,也会被ALU使用,这就可能会出现2+2=5的情况。

有很多种方式可以处理这个问题,现在我们采用一种比较简单的方式来清除标志位,如下图所示:

看着很简洁,但是还是很有技巧的。首先,并没有使能任何寄存器往BUS写数据,这样ALU的输入A就是0000 0000。在Step 4的时候,使能Bus 1,所以此时ALU的输入B为0000 0001。这时并没有任何操作码发送至ALU,因为默认的是ADD操作,这时ALU就会执行0000 0000+0000 0001=0000 0001,此时还可能有进位carry in,所以总的结果可能是0000 0001,也可能是0000 0010,但是肯定不会产生进位carry out。注意此时carry 标志位为off;结果不是零,所以zero标志位也为off;B比A大,所以和也为off。也就是说,所有标志位都清零了。

助记符如下:

如何实现指令

当然,我们还需要相关的指令实现CPU和RAM与外部的数据交换,如下图所示:

I/O总线包括数据总线和一些关键的内部信号,包括输入/输出标志位、数据/地址标志位、使能标志位、使能标志位,具体如下:

其指令格式如下,前四位为0111就表示该指令为I/O指令。后四位第一位表示是输入/输出标志,第二位表示数据/地址标志位,最后两位表示地址/数据的内容(存在Reg B中)。

具体实现方式如下:

Step 4:input/output标志位为1,指令前4位为0111时,Reg B寄存器“读”使能,Reg B寄存器内容传输至BUS;I/O clk s标志位为on;

Step 5:input/output标志位为0,指令前4位为0111时,Reg B寄存器“写”使能,BUS数据传输至Reg B寄存器;I/O clk e标志位为on;

助记符如下:

免责声明:本站部份内容由优秀作者和原创用户编辑投稿,本站仅提供存储服务,不拥有所有权,不承担法律责任。若涉嫌侵权/违法的,请反馈,一经查实立刻删除内容。本文内容由快快网络小滢创作整理编辑!