VERILOG:使用 4 位全加器进行除法并在需要时调用模块

问题描述

我是 Verilog 的新手,我正在尝试构建 ALU。
我分别使用半加器和半减法器构建了一个 4 位全加器和一个 4 位全减法器。

module fullAdder4bit(output [3:0] sum,output c_out,input [3:0] a,b,input  c_in);
    wire [2:0] c;
    fullAdder FA1(sum[0],c[0],a[0],b[0],c_in);
      ----
      ----
      ----
      ----
endmodule

And Similarly,I wrote for Full Subtractor

使用这些我试图建立一个部门,但我不知道如何使用上述全加器来编写部门。如果有人知道如何为 Division 写作,请告诉我。


用户给出 A+B 或 A-B 时,它应该显示相应的输出。所以我在需要时调用相应的模块,就像这样

module logic(
        output [3:0] AdderSum,output AdderC_out,input [3:0] AdderO1,AdderO2,input AdderC_in,AdderClk
    );
    always@(posedge AdderClk)
    begin
        fullAdder4bit FAbit (AdderSum[3:0],AdderC_out,AdderO1[3:0],AdderO2[3:0],AdderC_in);
    end
endmodule


// 4-bit Full ADDER Syntax
//  module fullAdder4bit(output [3:0] sum,input  c_in);

但它给出了错误

Instantiation is not allowed in sequential area except checker instantiation

解决方法

实例化应该在 always 块之外。在 AdderClk 的每个上升沿,您可以将结果从全加器加载到寄存器中。

module logic(
    output [3:0] AdderSum,output AdderC_out,input [3:0] AdderO1,AdderO2,input AdderC_in,AdderClk
);

reg [3:0] sum_r = 4'd0;
reg       c_r   = 1'b0;

wire [3:0] sum_b;
wire       c_b;

fullAdder4bit FAbit (sum_b,c_b,AdderO1,AdderC_in);

always@(posedge AdderClk)
    begin
        sum_r <= sum_b;
        c_r   <= c_b;
    end

assign AdderSum = sum_r;
assign AdderC_out = c_r;

endmodule

代码可以简化。我想展示它背后的想法。使用 logic described @Math 可以实现除法运算。

PS 我会更改模块名称,因为 logic 是 SystemVerilog 中的关键字。