-
Notifications
You must be signed in to change notification settings - Fork 2
/
sigmoid.v
executable file
·55 lines (42 loc) · 1.15 KB
/
sigmoid.v
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
`ifndef sigmoid
`define sigmoid
`ifndef TEST_BENCH
`include "config.v"
`endif
module sigmoid
(input [15:0] sum,
output reg[7:0] s);
wire sign;
reg [15:0] abs;
assign sign = sum[15];
reg [8:0] tmp;
always @(sum) begin
if (sign) begin
abs = ~sum + 16'b0000_0000_0000_0001;
end else begin
abs = sum;
end
if (abs > 16'b0000_0101_0000_0000) begin //5
tmp = 9'b0_1111_1111;
end else if (abs > 16'b0000_0010_0110_0000) begin //right 3bits, 216
tmp = abs[13:5] + 9'b0_1101_1000;
end else if (abs > 16'b0000_0001_0000_0000) begin // 5bits, 160
tmp = abs[11:3] + 9'b0_1010_0000;
end else begin // 8 bits, 128
tmp = abs[10:2] + 9'b0_1000_0000;
end
if (sign) begin
tmp = 9'b0_1111_1111 - tmp; // 256(1) - tmp
end
if (tmp[8] == 1) // overflow
s = 8'b1111_1111;
else
s = tmp[7:0];
end
endmodule
`endif
// y = ((xp >= 5) + ...
// (xp < 5 & xp >= 2.375) .* (0.03125 * xp + 0.84375) + ...
// (xp < 2.375 & xp >= 1) .* (0.125 * xp + 0.625) + ...
// (xp < 1 ) .* (0.25 * xp + 0.5)) ...
// .* sign(x) + (-sign(x) + 1)/2;