verilog中的加法器

时间:2012-10-07 02:19:21

标签: verilog

我正在Verilog中设计一个加法器。它将有两个大小为N和两个输出的输入。第一个输出的大小为2N,第二个输出的大小为K.

这是我到目前为止所做的:

module adder(
  out,
  CCR,
  inA,
  inB
);
parameter N=8,CCR_size=8;
parameter M=2*N;
input  [N-1:0]        inA,inB;
output [M-1:0]        out;
output [CCR_size-1:0] CCR;
reg    [N:0]          temp;
always @(inA or inB)
  begin
    temp      = inA+inB;
    CCR[0]    = temp[N];
    out[N-1:0]= temp[N-1:0];
    out[M-1:N]= 'b0;
  end
endmodule

从评论中移出: 但是这没有编译。我在行中有错误

CCR[0],out[N-1:0] and out[M-1:N]

# Error: VCP2858 adder.v : (16, 20): CCR[0] is not a valid left-hand side of a procedural assignment.
# Error: VCP2858 adder.v : (17, 28): out[N-1:0] is not a valid left-hand side of a procedural assignment.
# Error: VCP2858 adder.v : (18, 20): out[M-1:N] is not a valid left-hand side of a procedural assignment.

上述代码有什么问题?

2 个答案:

答案 0 :(得分:6)

寄存器数据类型用作过程块中的变量。 当信号位于程序分配的左侧时,必须使用寄存器数据类型。 由于默认类型的端口为wire,因此会出现错误。 将输出端口更改为reg类型可以解决问题。

output reg[M-1:0] out;
output reg[CCR_size-1:0] CCR;

答案 1 :(得分:1)

包括来自@damage的答案,将输出声明为reg类型,您还将CCR定义为8位宽,然后仅分配LSB。

加法器的位增长比最大输入高1位。

我将实现为:

module adder(
  parameter N       =8,
  parameter CCR_size=8
)(
  input      [N-1:0]        inA,
  input      [N-1:0]        inB,
  output     [2*N-1:0]      out,
  output reg [CCR_size-1:0] CCR,
);
reg [n:0] sum;

always @* begin
  {CCR, sum}      = inA + inB;
end

assign out = sum; //Will Zero pad

endmodule