Home Articles

Verilog中溢出的8位ALU

Asked
Viewed 1564 times
-2

创建一个名为eightbit palu的Verilog模块,它有两个8位输入,a和b,以及一个2位输入,sel . 该模块的输出是8位信号f和1位信号ovf . 这些输出的值应根据确定操作的sel信号值而改变 .

**s[1:0]   f[7:0]         ovf           Description**

 0 0     a + b (add)    overflow         a plus b

 0 1     b (inv)           0             Bitwise inversion of b

 1 0     a · b (and)       0             Bitwise AND of a and b

 1 1      a | b (or)       0             Bitwise OR of a and b

我有上述任务,这是我迄今为止在verilog中所拥有的:

module eightbit_palu(input [7:0]a,
                     input [7:0]b,
                     input [1:0]sel,
                     output [7:0]f,
                     output ovf);
     reg (f, ovf);
     always @ (a, b, sel);
     case(sel)
         2’b00: f = a + b;
         2’b01: f = ~b;
         2’b10: f = a & b;
         2’b11: f = a | b;
     endcase
endmodule

我是verilog的新手,所以我不确定这是否正确或我应该怎么做溢出值 . 有什么提示/建议吗?

1 Answer

  • 0

    如果将加法器输出的长度延长一个额外的位,则在执行进位时将设置该位 . 以下代码段(至少通过XST)合成为8位进位加法器:

    2'b00: {ovf, f} = a + b;
    

    这是溢出的串联,并导致LHS和分配到该串联 .

    不要忘记将默认值设置为ovf,以防止合成锁存器(这几乎不合适):

    always @ (a, b, sel) begin
         ovf = 0; // default
         case(sel)
             2'b00: {ovf, f} = a + b;
             2'b01: f = ~b;
             2'b10: f = a & b;
             2'b11: f = a | b;
         endcase
    end
    

Related