设计一个简单的ALU


8

我需要设计一个具有两个8位输入A和B以及控制输入x,y和z的ALU,它们支持以下操作:

x  y  z  |  operation

0  0  0  |  S = A-B
0  0  1  |  S = A+B
0  1  0  |  S = A*8
0  1  1  |  S = A/8
1  0  0  | S = A NAND B (bitwise)
1  0  1  | S = A XOR B (bitwise)
1  1  0  | s = reverse the bits of A
1  1  1  | S = NOT A (bitwise)

应该使用8位加法器和算术逻辑扩展器来完成。通读我的教科书,我发现AL扩展器的目的是改变输入位,以便可以使用加法器(而不是很多额外的组件)来完成所有事情(或者至少我从中了解到) )。例如,AL扩展器可以将这些位放在二进制补码中,以便加法器进行减法运算。同样,对于按位逻辑运算,可以适当地更改位,并且加法器输入之一只能为零,以便正确通过结果。

但是我到底要怎么做呢?我的书含糊不清,所以我不确定AL扩展程序是否需要我做一些聪明的事情来使加法器完成工作(在我的情况下只需加8次?...哈哈),或者我是否可以在那里放一个乘数 我必须阅读除法知识,但我敢打赌,这与乘法相似。

好吧,无论如何,最重要的是,AL扩展程序“允许”包含/可以包含什么?其唯一目的是更改输入以便可以将其馈入加法器吗?

*编辑:好吧,它是8的乘法/除法,因此可以通过向左或向右移动3来轻松执行。如果在其中添加了一些移位器,我是否还会有一个真正的/适当的AL扩展器?(也许我是一个完整的初学者,对它的想法过高……)


1
什么是00011111 * 8?什么是00000000-00000111?如果您的AL扩展器向左移动3次以获取“ 010”操作码,则可以将B分配给0,然后在ALU中调用“ 001”或“ 000”操作码。
托尼·恩尼斯

Answers:


5

最简单的方法是将xyz输入解码为八行。然后,通过这些逻辑,实现驱动芯片选择线的逻辑,以启用处理输入的适当单元以及所需的任何转换,以便该单元执行正确的操作。

我认为您不能在逻辑操作中使用加法器,因为加法器会携带(除非它有一些输入会禁用进位传播的行为)。但是您可以有一个单元来完成所有逻辑。

也许有理由将它们称为ALU,并使用单独的A和L。:)

乘以8只是意味着在最低的三个输入线上驱动零,而忽略高的三个线,并将0映射到3,将1映射到4,依此类推。就像是铁路开关。


6

(作弊)
最简单但功能最强大的解决方案是使用闪存作为结果的查找表。8位A输入+ 8位B输入+ 3位操作码为19位。选择一个512千×16位Flash(约合2美元),使用19条输入线作为地址,并对每个输入组合的结果进行编程。这样,您可以进行任何所需的操作。你想犯罪吗?只需添加一个256字正弦查找表,您甚至可以得到16位精确结果。您不限于乘以8;您可以将A乘以B。同样,可以将A除以B,得到​​8位的商 8位的余数。对于乘法和除法,您将使用64 kword块中的所有位,但是例如,位反转会降低其使用效率:它不依赖于B的值,因此您将拥有256个相同的值每个A输入,甚至不使用高位字节。所以你只需要256× 8 = 2048位用于反转,您将使用65536 ×16 = 1048576位;那不是很有效。您可以将其称为Flash解决方案的严重缺陷,但我希望看到您实现了8× 使用基本逻辑门的8乘法器,价格为$ 2。

好吧,也许你不想要那个。逻辑门更具挑战性。就像Kaz所说的那样,从3到8解码器开始,以使每个操作码具有唯一的信号。您可以使用基本的门来做到这一点,但我建议先使用74HC238。当ALU工作时,您仍然可以用一组门代替HC238。

不需要乘法器的是一个向左移位3次的移位寄存器。这是一个需要时钟的注册函数,而不是需要立即产生结果的组合函数。(请注意,Flash也会以纳秒为单位产生任何结果,尽管比组合逻辑要慢。)具有从A0到Y3,从A1到Y4等的路径,可以使用“ 010”解码的操作码启用该路径。同样,如果“ 011”信号有效(除法),Y3将连接到A6,而当opcoe为“ 110”(位反转)时,Y3将连接到A4。这意味着很多复用。

要返回到Flash,您还可以结合组合逻辑来实现简单的操作,例如NAND,NOR,左移,右移(),并且仅将Flash用于乘法和除法。您可以使用较小的Flash(128 kword而不是512 kword),添加更多高级功能,例如我作为示例给出的正弦波(可能不是最好的,但我敢肯定您会想到一些)。



()您为什么要乘以8,而不是再左移?任何ALU都必须具有向左/向右移位,向左/向右旋转(通过进位和不通过),并且可以使用3个移位权将其除以8,而不能将其除以2。位反转是典型的DSP功能,但您不想构建DSP来开始,对吗?我将功能更改为

x  y  z  |  operation

0  0  0  |  S = A - B
0  0  1  |  S = A + B
0  1  0  |  S = shift left A by 1 bit
0  1  1  |  S = shift right A by 1 bit
1  0  0  |  S = A NAND B (bitwise)
1  0  1  |  S = A XOR B (bitwise)
1  1  0  |  S = rotate left A
1  1  1  |  S = NOT A (bitwise)

1

我从同一本书中陷入了同样的问题。幸运的是,我偶然发现了这个线程,这让我知道了该怎么做。Kaz关于驱动零点和映射线有一个很好的观点。本书中的ALU扩展器由n个(n表示要操作的位数),相同但分离的组合组件和一个不同的输入组件设计而成。这些组件有5个输入和2个输出。这五个输入是:“ X”,“ Y”,“ Z”(用于选择操作)以及“ a”,“ b”(A和B的各个位具有相同的含义)。我想这里的想法是将问题分成较小的块,以便有一个合理的大小真值表。如果扩展器接受来自A和B的所有位以及控制输入,则为5输入vs 8 + 8 + 3 = 19输入。现在,如果扩展器以这种方式(19个输入)组成,我认为可以在单个组件中实现乘法逻辑,但是为此编写一个真值表是不可能的。因此,无论如何,我的解决方案是在处理a和b各个位的每个组件之后使用多路复用器,假设该组件已经设计成输入XYZ = 010传递不变的“ a”位并过滤掉“ b”,即'b'=0。多路复用器应该有两个输入,一个来自上述组件,一个来自组件的三个位置。最右边的三个多路复用器应将零作为第二个输入。当XYZ = 010时,具有AND门和两个反相器的简单组合逻辑可以设置多路复用器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.