往后几篇文章主要介绍ALU的实现方法。
我们计划设计一个32位的ALU。有两根32位宽的数据输入总线,一根32位宽的数据输出总线。在输入端,我们不准备添加carry in数据输入。
在输出端,我们计划添加四根辅助数据线。四根数据线分别为zero-零标志、carry_out-进位或借位标志、OF-溢出标志、sign-符号标志。
在控制端,我们计划使用4位宽的控制线。控制线的低2位控制ALU在对应模式下的运算方式,2位控制ALU是否处于有符号的运算模式,3位即最高位控制ALU处于四则运算模式还是布尔运算模式。
本篇文章主要介绍ALU的框图、控制和辅助输出。
这是ALU的主框图,各线含义如下:
线名 | 类别 | 位宽 | 功能 |
---|---|---|---|
inputA | 数据线 | 32 | 输入一个被操作数A |
inputB | 数据线 | 32 | 输入一个被操作数B |
operation | 控制线 | 4 | 控制ALU的运算模式和方式 |
output | 数据线 | 32 | 输出ALU的主要运算结果 |
zero | 数据线 | 1 | 标志运算结果为全0 |
carry_out | 数据线 | 1 | 标志运算结果有进位或借位 |
OF | 数据线 | 1 | 标志有符号模式运算结果溢出 |
sign | 数据线 | 1 | 标志有符号模式运算结果的符号 |
备注:
控制线operation对ALU运算模式和方式的控制可由下表确定。
四则或布尔位 | 符号位 | 方式位 | ALU运算法则 |
---|---|---|---|
0 | 0 | 00 | A + B(无符号) |
0 | 0 | 01 | A - B(无符号) |
0 | 0 | 10 | A << B(无符号) |
0 | 0 | 11 | A >> B(无符号) |
0 | 1 | 00 | A + B(有符号) |
0 | 1 | 01 | A - B(有符号) |
0 | 1 | 10 | A << B(有符号) |
0 | 1 | 11 | A >> B(有符号) |
1 | 0 | 00 | A & B |
1 | 0 | 01 | A | B |
1 | 0 | 10 | A < B |
1 | 0 | 11 | A ^ B |
1 | 1 | 00 | A & B |
1 | 1 | 01 | A | B |
1 | 1 | 10 | A < B |
1 | 1 | 11 | A ^ B |
本ALU设置了四根辅助输出数据线,分别为zero-零标志、carry_out-进位或借位标志、OF-溢出标志、sign-符号标志。
以下将详细介绍各辅助输出数据线在ALU不同工作模式、方式下,随输入数据A, B的变化情况。
ALU处于任意工作模式或方式下,当32位主要输出数据总线output各位都为0时,零标志输出高电平,否则输出低电平。
零标志位在ALU处于不同工作模式或方式下代表的意义不同,大致如下表:
四则或布尔位 | 符号位 | 方式位 | 零标志意义 |
0 | 0 | 00 | A == B |
0 | 0 | 01 | |
0 | 0 | 10 | A中有效信息可能全部被移除 |
0 | 0 | 11 | |
0 | 1 | 00 | A == B(无溢出) |
0 | 1 | 01 | |
0 | 1 | 10 | A中有效信息可能全部被移除 且A为正数 |
0 | 1 | 11 | |
1 | 0 | 00 | A与B可以相互屏蔽 |
1 | 0 | 01 | A == B == 32‘b0 |
1 | 0 | 10 | A >= B |
1 | 0 | 11 | A == B |
1 | 1 | 00 | A与B可以相互屏蔽 且A与B不同时为负 |
1 | 1 | 01 | A == B == 32‘b0 |
1 | 1 | 10 | A >= B |
1 | 1 | 11 | A == B |
进位或借位标志carry_out仅在ALU处于如下的工作模式及方式时不被强制置为低电平:
以上四种工作方式中,进位或借位标志carry_out被置为高电平的条件如下表:
ALU 控制码 | carry_out 置1条件 |
0000 | 33位加法器的最高位为1 |
0001 | |
1010 | 整体而言A < B |
1110 |
备注:
溢出标志仅在ALU处于四则有符号工作模式中的加法、减法工作方式时不被强制置为低电平。对应ALU控制码分别为0100、0101.
当ALU控制码为0100时,说明ALU在进行四则有符号加法。OF随输入数据A, B的变化情况如下表:
A 的符号位 | B 的符号位 | output 的符号位 | OF |
0 | 0 | 0 | 0 |
1 | 1 | ||
0 | 1 | 0 | 0 |
1 | |||
1 | 0 | 0 | |
1 | |||
1 | 1 | 0 | 1 |
1 | 0 |
当ALU处于无符号工作模式时,符号标志sign强制置为低电平。当ALU处于有符号工作模式时,符号标志sign与主要数据输出output的最高位电平一致。
当ALU处于四则有符号加法或减法工作方式时,确定sign是不难的。
当ALU处于四则有符号左移或右移工作方式时,A的符号位并不参与位移动操作。
当ALU处于布尔工作模式时,A与B的符号位均参与相关操作。
当ALU处于不同的工作模式或方式时,符号标志sign的意义不尽相同,具体可参考下表:
ALU控制码 | 符号标志意义 |
0100 | 主要输出数据output的符号 |
0101 | |
0110 | 输入数据A的符号 |
0111 | |
1100 | sign为高电平表示A与B均为负数 |
1101 | sign为高电平表示A与B至少一个为负数 |
1110 | sign为高电平表示A为正数,B为负数 |
1111 | sign为高电平表示A与B有一个正数和一个负数 |
本文首先介绍了ALU的模块框图,给出了各输入数据线、输出数据线、控制线的信息。然后介绍了ALU在控制线输入不同控制码时,所处的不同工作模式和方式。最后详细介绍了各辅助输出数据线,包括数据线的含义、随控制码及输入数据A与B的变化方式、数据线输出高或低电平的意义。