-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtools.v
167 lines (121 loc) · 2.63 KB
/
tools.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
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
module decoder_2_4(
input [ 1:0] in,
output [ 3:0] out
);
genvar i;
generate for (i=0; i<4; i=i+1) begin : gen_for_dec_2_4
assign out[i] = (in == i);
end endgenerate
endmodule
module encoder_4_2(
input [3:0] in,
output [1:0] out
);
assign out = {2{in[0]}} & 2'd0 |
{2{in[1]}} & 2'd1 |
{2{in[2]}} & 2'd2 |
{2{in[3]}} & 2'd3 ;
endmodule
module decoder_4_16(
input [ 3:0] in,
output [15:0] out
);
genvar i;
generate for (i=0; i<16; i=i+1) begin : gen_for_dec_4_16
assign out[i] = (in == i);
end endgenerate
endmodule
module encoder_16_4(
input [15:0] in,
output [ 3:0] out
);
wire [1:0] out_0, out_1, out_2, out_3;
encoder_4_2 one (.in(in[ 3: 0]), .out(out_0));
encoder_4_2 two (.in(in[ 7: 4]), .out(out_1));
encoder_4_2 thr (.in(in[11: 8]), .out(out_2));
encoder_4_2 fou (.in(in[15:12]), .out(out_3));
assign out = {4{|in[ 3: 0]}} & {2'd0, out_0} |
{4{|in[ 7: 4]}} & {2'd1, out_1} |
{4{|in[11: 8]}} & {2'd2, out_2} |
{4{|in[15:12]}} & {2'd3, out_3} ;
endmodule
module decoder_5_32(
input [ 4:0] in,
output [31:0] out
);
genvar i;
generate for (i=0; i<32; i=i+1) begin : gen_for_dec_5_32
assign out[i] = (in == i);
end endgenerate
endmodule
module encoder_32_5(
input [31:0] in,
output [ 4:0] out
);
wire [3:0] out_0, out_1;
encoder_16_4 one (.in(in[15: 0]), .out(out_0));
encoder_16_4 two (.in(in[31:16]), .out(out_1));
assign out = {5{|in[15: 0]}} & {1'd0, out_0} |
{5{|in[31:16]}} & {1'd1, out_1} ;
endmodule
module decoder_6_64(
input [ 5:0] in,
output [63:0] out
);
genvar i;
generate
for (i=0; i<64; i=i+1)
begin : gen_for_dec_6_64 //bug7
assign out[i] = (in == i);
end
endgenerate
endmodule
module one_valid_n #(
parameter n = 16
)(
input [n-1:0] in,
output [n-1:0] out,
output nozero
);
wire [n-1:0] one_in;
assign one_in[0] = in[0];
genvar i;
generate
for (i=1; i<n; i=i+1)
begin: sel_one
assign one_in[i] = in[i] && ~|in[i-1:0];
end
endgenerate
assign out = one_in;
assign nozero = |out;
endmodule
module one_valid_16 (
input [15:0] in,
output [ 3:0] out_en
);
wire [15:0] one_in;
assign one_in[0] = in[0];
genvar i;
generate
for (i=1; i<16; i=i+1)
begin: sel_one
assign one_in[i] = in[i] && ~|in[i-1:0];
end
endgenerate
encoder_16_4 coder (.in(one_in), .out(out_en));
endmodule
module one_valid_32 (
input [31:0] in,
output [ 4:0] out_en
);
wire [31:0] one_in;
assign one_in[0] = in[0];
genvar i;
generate
for (i=1; i<32; i=i+1)
begin: sel_one
assign one_in[i] = in[i] && ~|in[i-1:0];
end
endgenerate
encoder_32_5 coder (.in(one_in), .out(out_en));
endmodule