0

我知道如何使用行为风格编写 ALU,但我完全不知道如何使用结构设计来编写 ALU。我需要一个 8 功能位片结构 ALU,因此我可以通过传递的参数更改字长,并且它仍然有效。我找到了一个 2 功能 ALU 的示意图,但有人能告诉我如何将它翻译成 8 功能,或者可能将我链接到 Verilog 示例吗?这是 2 功能 ALU 原理图:

在此处输入图像描述

我对真值表、k-maps 等的记忆太远了,甚至无法自己尝试找出其中的逻辑。甚至不知道从哪里开始。非常感谢任何帮助,谢谢!

4

1 回答 1

1

除非您试图将逻辑简化为最小形式(这确实是浪费精力,因为综合工具本身非常擅长这样做,至少在组合术语以获得更小的功能等效逻辑时),您可以打破这个问题再往下。在编写行为 Verilog 时,您通常应该以这种方式思考,因为这样做会使您的设计更有可能综合成一个可行的、可靠的网表。

你有一个原理图,所以从设计的主要部分开始,并实现模块来完成这些功能。例如,您的设计中有许多 2x1 多路复用器。因此,我们应该实现从正确输入中进行选择的逻辑。现在,什么是多路复用器?嗯,它是一个基本的组合函数,如下所示:

S  A  B  O
----------
0  0  x  0
0  1  x  1
1  x  0  0
1  x  1  1

即,如果S是 0,O = A,如果S是 1,O = B。因此,我们可以将这些重新格式化为逻辑表达式:(O = ~S & A | S & B注意,如果S = 0,我们将通过A并且该B术语将被 0 输出,反之亦然,如果S是 1)。

现在只需在 Verilog 门原语中实现它:

module mux2x1(input A,
              input B,
              input S,
              output O);

  wire AO, BO, NOT_S;

  not n1(NOT_S, S);     // NOT_S = ~S;
  and a1(AO, A, NOT_S), // AO = A & ~S;
      a2(BO, B, S);     // BO = B & S;
  or  o1(O, BO, AO);    // O = (A & ~S) | (B & S);

endmodule

现在,为了增加 , 和 的宽度AB我们只需要为,和O的每一位制作一堆这样的多路复用器。我们可以这样做,但会生成大量的 mux 模块,或者对模块内部的逻辑进行如下操作:ABO

module mux2x1 #(parameter W = 1)
             (input [W-1:0] A,
              input [W-1:0] B,
              input S,
              output [W-1:0] O);

  wire [W-1:0] AO, BO;
  wire NOT_S;
  genvar i;

  not n1(NOT_S, S);     // NOT_S = ~S;
  generate begin
    for (i = 0; i < W; i = i + 1) begin : mux_w
      and a1(AO[i], A[i], NOT_S),    // AO[i] = A[i] & ~S;
          a2(BO[i], B[i], S);        // BO[i] = B[i] & S;
      or  o1(O[i], BO[i], AO[i]);    // O[i] = (A[i] & ~S) | (B[i] & S);
    end
  end

endmodule

现在您看到了一个完整的示例,我希望您可以以相同的方式完成其他模块(例如加法器和 4x1 多路复用器)。这确实不是一种正式的方式,但它有助于思考问题。另请注意,如果您无法弄清楚逻辑,在线上有很多加法器架构。

于 2015-10-10T13:03:19.560 回答