Verilog 中带溢出的 8 位 ALU
8 Bit ALU with Overflow in Verilog
创建一个名为 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 的新手,所以我不确定这是否正确或者我应该如何处理溢出值。任何 tips/suggestions?
如果将加法器的输出长度延长一个额外的位,则在执行进位时将设置该位。以下片段被合成(至少由 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
创建一个名为 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 的新手,所以我不确定这是否正确或者我应该如何处理溢出值。任何 tips/suggestions?
如果将加法器的输出长度延长一个额外的位,则在执行进位时将设置该位。以下片段被合成(至少由 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