OpenCores
URL https://opencores.org/ocsvn/sudoku/sudoku/trunk

Subversion Repositories sudoku

[/] [sudoku/] [branches/] [zynq/] [rtl/] [minPiece.v] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 dsheffie
`define PIPE_MINPIECE 1
2
 
3
module minPiece(/*AUTOARG*/
4
   // Outputs
5
   minPoss, minIdx,
6
   // Inputs
7
   clk, rst, inGrid
8
   );
9
 
10
   input clk;
11
   input rst;
12
 
13
   input [728:0] inGrid;
14
 
15
   output [3:0]  minPoss;
16
   output [6:0]  minIdx;
17
 
18
   reg [3:0]      r_minPoss;
19
   reg [6:0]      r_minIdx;
20
 
21
   assign minPoss = r_minPoss;
22
   assign minIdx = r_minIdx;
23
 
24
 
25
   wire [8:0]     grid2d [80:0];
26
 
27
   wire [6:0]     gridIndices [80:0];
28
   wire [3:0]     gridPoss [80:0];
29
 
30
   genvar        i;
31
 
32
   /* unflatten */
33
   generate
34
      for(i=0;i<81;i=i+1)
35
        begin: unflatten
36
           assign grid2d[i] = inGrid[(9*(i+1))-1:9*i];
37
           assign gridIndices[i] = i;
38
           countPoss cP (.clk(clk), .rst(rst), .in(grid2d[i]), .out(gridPoss[i]));
39
        end
40
   endgenerate
41
 
42
   wire [6:0]     stage1_gridIndices [39:0];
43
   wire [3:0]     stage1_gridPoss [39:0];
44
 
45
   generate
46
      for(i=0;i<40;i=i+1)
47
        begin: stage1
48
           cmpPiece cP_stage1
49
            (
50
             .outPoss(stage1_gridPoss[i]),
51
             .outIdx(stage1_gridIndices[i]),
52
             .inPoss_0(gridPoss[2*i]),
53
             .inIdx_0(gridIndices[2*i]),
54
             .inPoss_1(gridPoss[2*i+1]),
55
             .inIdx_1(gridIndices[2*i+1])
56
             );
57
        end
58
   endgenerate
59
 
60
   wire [6:0]     stage2_gridIndices [19:0];
61
   wire [3:0]     stage2_gridPoss [19:0];
62
 
63
   generate
64
      for(i=0;i<20;i=i+1)
65
        begin: stage2
66
           cmpPiece cP_stage2
67
            (
68
             .outPoss(stage2_gridPoss[i]),
69
             .outIdx(stage2_gridIndices[i]),
70
             .inPoss_0(stage1_gridPoss[2*i]),
71
             .inIdx_0(stage1_gridIndices[2*i]),
72
             .inPoss_1(stage1_gridPoss[2*i+1]),
73
             .inIdx_1(stage1_gridIndices[2*i+1])
74
             );
75
        end
76
   endgenerate
77
 
78
   wire [6:0]     stage3_gridIndices [9:0];
79
   wire [3:0]     stage3_gridPoss [9:0];
80
 
81
`ifdef PIPE_MINPIECE
82
   wire [6:0]     r_stage3_gridIndices [9:0];
83
   wire [3:0]     r_stage3_gridPoss [9:0];
84
   wire [6:0]     r_gridIndices_80;
85
   wire [3:0]     r_gridPoss_80;
86
 
87
   dff#(.WIDTH(4)) r_poss80
88
     (.clk(clk),
89
      .rst(rst),
90
      .d(gridPoss[80]),
91
      .q(r_gridPoss_80)
92
      );
93
 
94
   dff#(.WIDTH(7)) r_index80
95
     (.clk(clk),
96
      .rst(rst),
97
      .d(gridIndices[80]),
98
      .q(r_gridIndices_80)
99
      );
100
 
101
   generate
102
      for(i=0;i<10;i=i+1)
103
        begin: pipelatch
104
           dff#(.WIDTH(7)) rT_index3
105
           (.clk(clk),
106
            .rst(rst),
107
            .d(stage3_gridIndices[i]),
108
            .q(r_stage3_gridIndices[i])
109
            );
110
 
111
           dff#(.WIDTH(4)) rT_poss3
112
           (.clk(clk),
113
            .rst(rst),
114
            .d(stage3_gridPoss[i]),
115
            .q(r_stage3_gridPoss[i])
116
            );
117
 
118
        end // block: pipelatch
119
   endgenerate
120
`endif
121
 
122
   generate
123
      for(i=0;i<10;i=i+1)
124
        begin: stage3
125
           cmpPiece cP_stage3
126
            (
127
             .outPoss(stage3_gridPoss[i]),
128
             .outIdx(stage3_gridIndices[i]),
129
             .inPoss_0(stage2_gridPoss[2*i]),
130
             .inIdx_0(stage2_gridIndices[2*i]),
131
             .inPoss_1(stage2_gridPoss[2*i+1]),
132
             .inIdx_1(stage2_gridIndices[2*i+1])
133
             );
134
        end
135
   endgenerate
136
 
137
   wire [6:0]     stage4_gridIndices [4:0];
138
   wire [3:0]     stage4_gridPoss [4:0];
139
 
140
   generate
141
      for(i=0;i<5;i=i+1)
142
        begin: stage4
143
           cmpPiece cP_stage4
144
            (
145
             .outPoss(stage4_gridPoss[i]),
146
             .outIdx(stage4_gridIndices[i]),
147
`ifdef PIPE_MINPIECE
148
             .inPoss_0(r_stage3_gridPoss[2*i]),
149
             .inIdx_0(r_stage3_gridIndices[2*i]),
150
             .inPoss_1(r_stage3_gridPoss[2*i+1]),
151
             .inIdx_1(r_stage3_gridIndices[2*i+1])
152
`else
153
             .inPoss_0(stage3_gridPoss[2*i]),
154
             .inIdx_0(stage3_gridIndices[2*i]),
155
             .inPoss_1(stage3_gridPoss[2*i+1]),
156
             .inIdx_1(stage3_gridIndices[2*i+1])
157
`endif
158
 
159
             );
160
        end
161
   endgenerate
162
 
163
   wire [6:0]     stage5_gridIndices [1:0];
164
   wire [3:0]     stage5_gridPoss [1:0];
165
 
166
 
167
   generate
168
      for(i=0;i<2;i=i+1)
169
        begin: stage5
170
           cmpPiece cP_stage5
171
            (
172
             .outPoss(stage5_gridPoss[i]),
173
             .outIdx(stage5_gridIndices[i]),
174
             .inPoss_0(stage4_gridPoss[2*i]),
175
             .inIdx_0(stage4_gridIndices[2*i]),
176
             .inPoss_1(stage4_gridPoss[2*i+1]),
177
             .inIdx_1(stage4_gridIndices[2*i+1])
178
             );
179
        end
180
   endgenerate
181
 
182
 
183
   wire [6:0] stage6_gridIndices_A;
184
   wire [3:0] stage6_gridPoss_A;
185
 
186
   cmpPiece cP_stage6_A
187
     (
188
      .outPoss(stage6_gridPoss_A),
189
      .outIdx(stage6_gridIndices_A),
190
      .inPoss_0(stage5_gridPoss[0]),
191
      .inIdx_0(stage5_gridIndices[0]),
192
      .inPoss_1(stage5_gridPoss[1]),
193
      .inIdx_1(stage5_gridIndices[1])
194
      );
195
 
196
   wire [6:0] stage6_gridIndices_B;
197
   wire [3:0] stage6_gridPoss_B;
198
 
199
   cmpPiece cP_stage6_B
200
     (
201
      .outPoss(stage6_gridPoss_B),
202
      .outIdx(stage6_gridIndices_B),
203
      .inPoss_0(stage4_gridPoss[4]),
204
      .inIdx_0(stage4_gridIndices[4]),
205
`ifdef PIPE_MINPIECE
206
      .inPoss_1(r_gridPoss_80),
207
      .inIdx_1(r_gridIndices_80)
208
`else
209
      .inPoss_1(gridPoss[80]),
210
      .inIdx_1(gridIndices[80])
211
`endif
212
      );
213
 
214
   wire [6:0] stage7_gridIndices;
215
   wire [3:0] stage7_gridPoss;
216
 
217
   cmpPiece cP_stage7
218
     (
219
      .outPoss(stage7_gridPoss),
220
      .outIdx(stage7_gridIndices),
221
      .inPoss_0(stage6_gridPoss_A),
222
      .inIdx_0(stage6_gridIndices_A),
223
      .inPoss_1(stage6_gridPoss_B),
224
      .inIdx_1(stage6_gridIndices_B)
225
      );
226
 
227
   always@(posedge clk)
228
     begin
229
        if(rst)
230
          begin
231
             r_minIdx <= 7'd0;
232
             r_minPoss <= 4'hf;
233
          end
234
        else
235
          begin
236
             r_minIdx <= stage7_gridIndices;
237
             r_minPoss <= stage7_gridPoss;
238
          end
239
     end // always@ (posedge clk)
240
 
241
endmodule
242
 
243
module cmpPiece(/*AUTOARG*/
244
   // Outputs
245
   outPoss, outIdx,
246
   // Inputs
247
   inPoss_0, inIdx_0, inPoss_1, inIdx_1
248
   );
249
   input [3:0] inPoss_0;
250
   input [6:0] inIdx_0;
251
 
252
   input [3:0] inPoss_1;
253
   input [6:0] inIdx_1;
254
 
255
   output [3:0] outPoss;
256
   output [6:0] outIdx;
257
 
258
   wire         w_cmp = (inPoss_0 < inPoss_1);
259
 
260
   assign outPoss = w_cmp ? inPoss_0 : inPoss_1;
261
   assign outIdx = w_cmp ? inIdx_0 : inIdx_1;
262
 
263
endmodule // cmpPiece
264
 
265
module countPoss(clk,rst,in,out);
266
   input [8:0] in;
267
   input       clk;
268
   input       rst;
269
 
270
   output [3:0] out;
271
   reg [3:0]     r_out;
272
   assign out = r_out;
273
 
274
   wire [3:0]    w_cnt;
275
 
276
   one_count9 c0(in, w_cnt);
277
   wire [3:0] w_out = (w_cnt == 4'd1) ? 4'd15 : w_cnt;
278
 
279
   always@(posedge clk)
280
     begin
281
        r_out <= rst ? 4'd15 : w_out;
282
     end
283
 
284
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.