x393  1.0
FPGAcodeforElphelNC393camera
index_max_16.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
41 module index_max_16 #(
42  parameter width=16
43  ) (
44  input clk,
45  input [16*width-1:0] values,
46  input [15:0] mask,
47  input need_in, // at least one of the channels needs access
48  output [ 3:0] index,
49  output valid,
50  output need_out // need_in with matching delay
51 );
56 
59 
63  reg [3:0] valid_dly;
64  reg [3:0] need_dly;
65  reg [15:0] mask_prev; // previous value of mask (invalidate if mask changes)
67 // assign mask_changed= mask!=mask_prev;
68  assign mask_changed= |(~mask &mask_prev); // only invalidate if any bit goes off (granted)
69 
70 // 1-st layer
71  masked_max_reg #(width) i_masked_max_reg0001(
72  .clk(clk),
73  .a(values[width*0 +: width]),
74  .mask_a(mask[0]),
75  .b(values[width*1 +: width]),
76  .mask_b(mask[1]),
77  .max(max0001),
78  .s(sel0001),
79  .valid(msk0001));
80  masked_max_reg #(width) i_masked_max_reg0203(
81  .clk(clk),
82  .a(values[width*2 +: width]),
83  .mask_a(mask[2]),
84  .b(values[width*3 +: width]),
85  .mask_b(mask[3]),
86  .max(max0203),
87  .s(sel0203),
88  .valid(msk0203));
89  masked_max_reg #(width) i_masked_max_reg0405(
90  .clk(clk),
91  .a(values[width*4 +: width]),
92  .mask_a(mask[4]),
93  .b(values[width*5 +: width]),
94  .mask_b(mask[5]),
95  .max(max0405),
96  .s(sel0405),
97  .valid(msk0405));
98  masked_max_reg #(width) i_masked_max_reg0607(
99  .clk(clk),
100  .a(values[width*6 +: width]),
101  .mask_a(mask[6]),
102  .b(values[width*7 +: width]),
103  .mask_b(mask[7]),
104  .max(max0607),
105  .s(sel0607),
106  .valid(msk0607));
107  masked_max_reg #(width) i_masked_max_reg0809(
108  .clk(clk),
109  .a(values[width*8 +: width]),
110  .mask_a(mask[8]),
111  .b(values[width*9 +: width]),
112  .mask_b(mask[9]),
113  .max(max0809),
114  .s(sel0809),
115  .valid(msk0809));
116  masked_max_reg #(width) i_masked_max_reg1011(
117  .clk(clk),
118  .a(values[width*10 +: width]),
119  .mask_a(mask[10]),
120  .b(values[width*11 +: width]),
121  .mask_b(mask[11]),
122  .max(max1011),
123  .s(sel1011),
124  .valid(msk1011));
125  masked_max_reg #(width) i_masked_max_reg1213(
126  .clk(clk),
127  .a(values[width*12 +: width]),
128  .mask_a(mask[12]),
129  .b(values[width*13 +: width]),
130  .mask_b(mask[13]),
131  .max(max1213),
132  .s(sel1213),
133  .valid(msk1213));
134  masked_max_reg #(width) i_masked_max_reg1415(
135  .clk(clk),
136  .a(values[width*14 +: width]),
137  .mask_a(mask[14]),
138  .b(values[width*15 +: width]),
139  .mask_b(mask[15]),
140  .max(max1415),
141  .s(sel1415),
142  .valid(msk1415));
143 
144 // 2-nd layer
145  masked_max_reg #(width) i_masked_max_reg00010203(
146  .clk(clk),
147  .a(max0001),
148  .mask_a(msk0001),
149  .b(max0203),
150  .mask_b(msk0203),
151  .max(max00010203),
152  .s(sel00010203),
153  .valid(msk00010203));
154  masked_max_reg #(width) i_masked_max_reg04050607(
155  .clk(clk),
156  .a(max0405),
157  .mask_a(msk0405),
158  .b(max0607),
159  .mask_b(msk0607),
160  .max(max04050607),
161  .s(sel04050607),
162  .valid(msk04050607));
163  masked_max_reg #(width) i_masked_max_reg08091011(
164  .clk(clk),
165  .a(max0809),
166  .mask_a(msk0809),
167  .b(max1011),
168  .mask_b(msk1011),
169  .max(max08091011),
170  .s(sel08091011),
171  .valid(msk08091011));
172  masked_max_reg #(width) i_masked_max_reg12131415(
173  .clk(clk),
174  .a(max1213),
175  .mask_a(msk1213),
176  .b(max1415),
177  .mask_b(msk1415),
178  .max(max12131415),
179  .s(sel12131415),
180  .valid(msk12131415));
181 // 3-nd layer
182  masked_max_reg #(width) i_masked_max_reg0001020304050607(
183  .clk(clk),
184  .a(max00010203),
186  .b(max04050607),
191  masked_max_reg #(width) i_masked_max_reg0809101112131415(
192  .clk(clk),
193  .a(max08091011),
195  .b(max12131415),
200 // 4-th layer
201  masked_max_reg #(width) i_masked_max_reg(
202  .clk(clk),
207  .max(),
208  .s(sel),
209  .valid()); //msk));
210  always @ (posedge clk) begin
225  valid_dly[3:0] <= {valid_dly[2:0],|mask[15:0] & ~mask_changed}; // invalidate when mask changed (or only if new is zero?
226  need_dly[3:0] <= {need_dly[2:0],need_in};
227  mask_prev <= mask;
228  end
229 assign index[3:0]={
230  sel,
232 
233 //assign valid=valid_dly[3];
234 assign valid=&valid_dly; // need && |mask ?
235 assign need_out=need_dly[3];
236 endmodule
237 
10594msk0607wire
Definition: index_max_16.v:57
10604msk0809101112131415wire
Definition: index_max_16.v:58
10601msk08091011wire
Definition: index_max_16.v:58
10574max0001020304050607wire[width-1:0]
Definition: index_max_16.v:53
10592msk0203wire
Definition: index_max_16.v:57
10584sel00010203wire
Definition: index_max_16.v:54
i_masked_max_reg masked_max_reg
Definition: index_max_16.v:201
10573max12131415wire[width-1:0]
Definition: index_max_16.v:52
10613sel00010203_rreg[1:0]
Definition: index_max_16.v:61
10619valid_dlyreg[3:0]
Definition: index_max_16.v:63
10595msk0809wire
Definition: index_max_16.v:57
10588sel0001020304050607wire
Definition: index_max_16.v:55
10581sel1011wire
Definition: index_max_16.v:54
10570max00010203wire[width-1:0]
Definition: index_max_16.v:52
[16*width-1:0] 10556values
Definition: index_max_16.v:45
[width-1:0] 10656max
10585sel04050607wire
Definition: index_max_16.v:54
[width-1:0] 10654b
10591msk0001wire
Definition: index_max_16.v:57
10598msk1415wire
Definition: index_max_16.v:57
10596msk1011wire
Definition: index_max_16.v:57
10569max1415wire[width-1:0]
Definition: index_max_16.v:52
10603msk0001020304050607wire
Definition: index_max_16.v:58
10583sel1415wire
Definition: index_max_16.v:54
10568max1213wire[width-1:0]
Definition: index_max_16.v:52
10565max0607wire[width-1:0]
Definition: index_max_16.v:52
10618sel0809101112131415_rreg[2:0]
Definition: index_max_16.v:62
10562max0001wire[width-1:0]
Definition: index_max_16.v:52
10599msk00010203wire
Definition: index_max_16.v:57
10586sel08091011wire
Definition: index_max_16.v:55
10563max0203wire[width-1:0]
Definition: index_max_16.v:52
10564max0405wire[width-1:0]
Definition: index_max_16.v:52
10597msk1213wire
Definition: index_max_16.v:57
10572max08091011wire[width-1:0]
Definition: index_max_16.v:52
10616sel12131415_rreg[1:0]
Definition: index_max_16.v:61
10575max0809101112131415wire[width-1:0]
Definition: index_max_16.v:53
10614sel04050607_rreg[1:0]
Definition: index_max_16.v:61
10621mask_prevreg[15:0]
Definition: index_max_16.v:65
10617sel0001020304050607_rreg[2:0]
Definition: index_max_16.v:62
10580sel0809wire
Definition: index_max_16.v:54
10578sel0405wire
Definition: index_max_16.v:54
10577sel0203wire
Definition: index_max_16.v:54
[width-1:0] 10652a
10600msk04050607wire
Definition: index_max_16.v:57
10587sel12131415wire
Definition: index_max_16.v:55
10615sel08091011_rreg[1:0]
Definition: index_max_16.v:61
10589sel0809101112131415wire
Definition: index_max_16.v:55
10622mask_changedwire
Definition: index_max_16.v:66
10567max1011wire[width-1:0]
Definition: index_max_16.v:52
10579sel0607wire
Definition: index_max_16.v:54
10620need_dlyreg[3:0]
Definition: index_max_16.v:64
10593msk0405wire
Definition: index_max_16.v:57
10571max04050607wire[width-1:0]
Definition: index_max_16.v:52
10576sel0001wire
Definition: index_max_16.v:54
[15:0] 10557mask
Definition: index_max_16.v:46
10582sel1213wire
Definition: index_max_16.v:54
10602msk12131415wire
Definition: index_max_16.v:58
[ 3:0] 10559index
Definition: index_max_16.v:48
10566max0809wire[width-1:0]
Definition: index_max_16.v:52