mirror of
https://github.com/aolofsson/oh.git
synced 2025-01-17 20:02:53 +08:00
44 lines
1.3 KiB
Verilog
44 lines
1.3 KiB
Verilog
module oh_add (/*AUTOARG*/
|
|
// Outputs
|
|
sum, cout, zero, neg, overflow,
|
|
// Inputs
|
|
a, b, opt_sub, cin
|
|
);
|
|
|
|
|
|
//###############################################################
|
|
//# Parameters
|
|
//###############################################################
|
|
parameter DW = 64;
|
|
|
|
//###############################################################
|
|
//# Interface
|
|
//###############################################################
|
|
|
|
//inputs
|
|
input [DW-1:0] a; //first operand
|
|
input [DW-1:0] b; //second operand
|
|
input opt_sub; //subtraction option
|
|
input cin; //carry in
|
|
|
|
//outputs
|
|
output [DW-1:0] sum; //sum
|
|
output cout; //cary out
|
|
output zero; //zero flag
|
|
output neg; //negative flag
|
|
output overflow; //overflow indication
|
|
|
|
//###############################################################
|
|
//# BODY
|
|
//###############################################################
|
|
wire [DW-1:0] b_sub;
|
|
|
|
assign b_sub[DW-1:0] = {(DW){opt_sub}} ^ b[DW-1:0];
|
|
|
|
assign {cout,sum[DW-1:0]} = a[DW-1:0] +
|
|
b_sub[DW-1:0] +
|
|
opt_sub +
|
|
cin;
|
|
|
|
endmodule // oh_add
|