【问题标题】:Creating a 32 bit ALU in Structural Verilog and I'm not quite sure how to implement opcodes在结构 Verilog 中创建 32 位 ALU,我不太确定如何实现操作码
【发布时间】:2016-11-20 23:11:09
【问题描述】:

我必须使用 AND(000)、OR(001)、ADD(010)、SUB(110)、SLT(111) 和 BEQ(100) 的操作码在结构 verilog 中创建一个 32 位 ALU。我了解这些中的每一个如何在门级单独工作我只是对如何使用操作码来获得我想要的输出感到困惑。例如,如果它是一种高级语言,我会写一些类似 if opcode == 100 {output = branch} 的东西。如果这是一个愚蠢的问题,我深表歉意,我只是 verilog 的新手,网上的许多答案要么使用行为 verilog,要么非常令人困惑。

【问题讨论】:

  • 我没有 Verilog 方面的专业知识,但我对 VHDL 有一些了解。通常,“if”语句表示多路复用器。所以,看看这里(如果你还没有的话):doulos.com/knowhow/verilog_designers_guide/if_statement 你可以使用多个 if-else 或 case-statement。

标签: verilog iverilog


【解决方案1】:

您可以使用您在 Verilog 中描述的相同技术...使用 if 语句,它们必须位于 always 块中,如下所示:

always @ (*) begin
  if (operation == 3'b000) begin
    alu_result = and_result;
  end else if (operation == 3'b001) begin
    alu_result = or_result;
  end else if (operation == 3'b010) begin
    alu_result = add_result;
  // ...repeat this pattern for the other operations except BEQ...
  end else begin
    alu_result = beq_result;
  end
end

在此示例中,*_result 连线是各个操作的结果值。代码将合成到一个多路复用器,该多路复用器在各个结果值之间进行选择(取决于operation)并驱动作为最终 ALU 输出的alu_result

对于这个应用程序,最好使用case,而不是使用if 语句,如下所示:

always @ (*) begin
  case (operation)
    3'b000: alu_result = and_result;
    3'b001: alu_result = or_result;
    3'b010: alu_result = add_result;
    // ...repeat this pattern for the other operations except BEQ...
    default: alu_result = beq_result;
  endcase
end

如您所见,它更紧凑且易于阅读。如果编写正确,两种变体都应导致完全相同的多路复用器逻辑。请注意,在这两种变体中,alu_result 必须是 reg [31:0] 类型,因为我们在 always 块内进行分配,但如果您愿意,可以使用 wire

alu_result = operation == 3'b000 ? and_result
           : operation == 3'b001 ? or_result
           : operation == 3'b010 ? add_result
           // ...repeat this pattern for the other operations except BEQ...
           : beq_result;

编辑

OP 指出他需要一个位级的结构化多路复用器代码。

可以用 AND、OR 和 NOT 门创建一个非常简单的多路复用器。例如,可以按如下方式创建 2 路多路复用器:

not(select_inv,select);
and(selected_signal_a,signal_a,select_inv);
and(selected_signal_b,signal_b,select);
or(selected_result,selected_signal_a,selected_signal_b);

在此示例中,select 确定 signal_asignal_b 中的哪一个通过最终输出 selected_result

您可以对多个选择位(提示:您需要三个)使用相同的模式,例如串联堆叠多个多路复用器。

【讨论】:

  • 感谢您的回复!正如我所说,我对 verilog 还很陌生,不太确定结构和行为之间的区别,我的印象是 if 语句和 always 语句是行为而不是结构。
  • @AlexImp 你是对的,我给出的例子是行为 Verilog 代码。当然,您可以使用 Verilog 的内置原始门,例如 andorxor,并且根据您想要的多路复用器类型,您还可以使用例如bufif1,但是如果不添加另一个层次结构会有点痛苦......它需要有多低级?
  • 必须做到门级。根据我与教授和其他同学交谈所收集到的信息,应该使用两个多路复用器来完成。一个处理 Sub op 的 2x1 多路复用器和一个处理其他所有事情的 4x1 多路复用器。我添加了一张图片来更详细地解释我的问题。
  • @AlexImp 我在我的答案中添加了一个简单的结构化 2 路复用器......如果有帮助,请告诉我。
  • 抱歉回复晚了。这有助于理解多路复用器的工作原理,但我仍然对 2x1 多路复用器中的 0 或 1 如何成为操作码其余部分的一部分感到困惑。我的计划是,如果我在标记为 sub 的 2x1 多路复用器中输入 1,那么它会否定 b 值,但是我不明白该 1 如何成为 sub 的整体操作码的一部分,即 110。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2016-08-24
  • 2012-03-02
  • 1970-01-01
  • 2019-09-18
相关资源
最近更新 更多