-2

创建一个名为 8 位 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的新手,所以我不确定这是否正确或者我应该如何处理溢出值。任何提示/建议?

4

1 回答 1

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
于 2016-01-31T18:33:03.657 回答