-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathE1_qadd.sv
105 lines (89 loc) · 2.03 KB
/
E1_qadd.sv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
`timescale 1ps / 1ps
//fixed point adder without ECC, delay = 2
module E1_qadd #(
//Parameterized values
parameter Q = 15,
parameter N = 64
)
(
input clk,
input rst,
input [N-1:0] a,
input a_en,
input [N-1:0] b,
input b_en,
output [N-1:0] c,
output c_valid
);
reg [N-1:0] res;
reg [N-1:0] a_r;
reg [N-1:0] b_r;
wire input_en;
reg input_en_d1;
reg input_en_d2;
assign input_en = a_en & b_en;
assign c_valid = input_en_d2;
always @(posedge clk) begin
if (rst) begin
input_en_d1 <= 0;
input_en_d2 <= 0;
end else begin
input_en_d1 <= input_en;
input_en_d2 <= input_en_d1;
end
end
assign c = res;
always @(posedge clk) begin
if (rst) begin
a_r <= 0;
end else if (a_en) begin
a_r <= a;
end
end
always @(posedge clk) begin
if (rst) begin
b_r <= 0;
end else if (b_en) begin
b_r <= b;
end
end
always @(posedge clk) begin
if (rst) begin
res <= 0;
end else begin
res <= a_r + b_r;
end
end
// always @(posedge clk) begin
// if (rst) begin
// res[N-2:0] = 0;
// res[N-1] = 0;
// end else if(a_r[N-1] == b_r[N-1]) begin
// res[N-2:0] = a_r[N-2:0] + b_r[N-2:0];
// res[N-1] = a_r[N-1];
// end else if(a_r[N-1] == 0 && b_r[N-1] == 1) begin
// // if( a_r[N-2:0] > b_r[N-2:0] ) begin
// // res[N-2:0] = a_r[N-2:0] - b_r[N-2:0];
// // res[N-1] = 0;
// // end else begin
// // res[N-2:0] = b_r[N-2:0] - a_r[N-2:0];
// // if (res[N-2:0] == 0)
// // res[N-1] = 0;
// // else
// // res[N-1] = 1;
// // end
// res = a_r + b_r;
// end else begin
// if( a_r[N-2:0] > b_r[N-2:0] ) begin
// res[N-2:0] = a_r[N-2:0] - b_r[N-2:0];
// if (res[N-2:0] == 0)
// res[N-1] = 0;
// else
// res[N-1] = 1;
// end else begin
// res[N-2:0] = b_r[N-2:0] - a_r[N-2:0];
// res[N-1] = 0;
// end
// end
// end
endmodule