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

Subversion Repositories i650

[/] [i650/] [trunk/] [rtl/] [operator_ctl.v] - Blame information for rev 12

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 eightycc
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3
// IBM 650 Reconstruction in Verilog (i650)
4
// 
5
// This file is part of the IBM 650 Reconstruction in Verilog (i650) project
6
// http:////www.opencores.org/project,i650
7
//
8
// Description: Operator console and external control interface.
9
// 
10
// Additional Comments: See US 2959351, Fig. 75, 76, 76 and 77. Also implements
11
//  a simple command-based control interface.
12
//
13
// Copyright (c) 2015 Robert Abeles
14
//
15
// This source file is free software; you can redistribute it
16
// and/or modify it under the terms of the GNU Lesser General
17
// Public License as published by the Free Software Foundation;
18
// either version 2.1 of the License, or (at your option) any
19
// later version.
20
//
21
// This source is distributed in the hope that it will be
22
// useful, but WITHOUT ANY WARRANTY; without even the implied
23
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
24
// PURPOSE.  See the GNU Lesser General Public License for more
25
// details.
26
//
27
// You should have received a copy of the GNU Lesser General
28
// Public License along with this source; if not, download it
29
// from http://www.opencores.org/lgpl.shtml
30
//////////////////////////////////////////////////////////////////////////////////
31
`include "defines.v"
32
 
33
module operator_ctl (
34 11 eightycc
      input rst, clk,
35 7 eightycc
      input ap, dp,
36
      input dx, d0, d1, d2, d3, d4, d5, d6, d10,
37
      input wu, hp,
38
      input [0:3] early_idx, ontime_idx,
39
 
40 11 eightycc
      input [0:6] cmd_digit_in, io_buffer_in, gs_in,
41 7 eightycc
      input [0:5] command,
42
 
43 11 eightycc
      output reg[0:6] data_out, addr_out, console_out,
44 7 eightycc
      output reg console_to_addr,
45
      output reg[0:14] gs_ram_addr,
46 10 eightycc
      output reg read_gs, write_gs,
47 7 eightycc
      output reg pgm_start, pgm_stop, err_reset, err_sense_reset,
48
      output run_control, half_or_pgm_stop, ri_storage, ro_storage,
49
             storage_control,
50
      output reg man_pgm_reset, man_acc_reset, set_8000, reset_8000,
51 11 eightycc
                 hard_reset,
52 7 eightycc
 
53
      output reg[0:6] cmd_digit_out,
54
      output reg busy, digit_ready,
55
      output reg punch_card, read_card, card_digit_ready
56
   );
57
 
58
   //-----------------------------------------------------------------------------
59 12 eightycc
   // Operator console switch settings and their control signals.
60 7 eightycc
   //-----------------------------------------------------------------------------
61
   reg pgm_sw_stop, pgm_sw_run,
62
       half_cycle_sw_run, half_cycle_sw_half,
63
       ctl_sw_addr_stop, ctl_sw_run, ctl_sw_manual,
64
       disp_sw_lacc, disp_sw_uacc, disp_sw_dist, disp_sw_pgm,
65
       disp_sw_ri, disp_sw_ro,
66
       ovflw_sw_stop, ovflw_sw_sense, err_sw_stop, err_sw_sense;
67
   reg [0:6] storage_entry_sw [0:15];
68
   reg [0:6] addr_sel_sw [0:3];
69
   assign run_control = disp_sw_lacc | disp_sw_uacc | disp_sw_dist | disp_sw_pgm;
70
   assign half_or_pgm_stop = half_cycle_sw_half | pgm_stop;
71
   assign ri_storage = disp_sw_ri;
72
   assign ro_storage = disp_sw_ro;
73
   assign storage_control = run_control | disp_sw_ro;
74
 
75 12 eightycc
   //-----------------------------------------------------------------------------
76
   // Calculate the RAM address of the general storage word at address gs_addr_.
77
   //-----------------------------------------------------------------------------
78 7 eightycc
   reg [0:6] gs_addr_th, gs_addr_h, gs_addr_t, gs_addr_u;
79 9 eightycc
   wire [0:14] gs_band_addr;
80 10 eightycc
   wire [0:9] gs_word_offset;
81 9 eightycc
   ram_band_addr rba(gs_addr_th, gs_addr_h, gs_addr_t, gs_band_addr);
82 7 eightycc
   ram_word_offset rwo(gs_addr_t, gs_addr_u, gs_word_offset);
83
   wire [0:14] gs_word_addr = gs_band_addr + gs_word_offset;
84
 
85 12 eightycc
   //-----------------------------------------------------------------------------
86
   // Operator console state machine
87
   //-----------------------------------------------------------------------------
88
   reg do_power_on_reset, do_reset_console, do_err_reset, do_err_sense_reset,
89
       do_pgm_reset, do_acc_reset, do_hard_reset, do_clear_drum;
90
   reg [0:5] state;
91
 
92 7 eightycc
   `define state_idle                  6'd0
93
 
94
   `define state_reset_console_1       6'd1
95
   `define state_reset_console_2       6'd2
96
   `define state_pgm_reset_1           6'd3
97
   `define state_pgm_reset_2           6'd4
98
   `define state_acc_reset_1           6'd5
99
   `define state_acc_reset_2           6'd6
100
   `define state_err_reset_1           6'd7
101
   `define state_err_reset_2           6'd8
102
   `define state_err_sense_reset_1     6'd9
103
   `define state_err_sense_reset_2     6'd10
104 11 eightycc
   `define state_hard_reset_1          6'd11
105 7 eightycc
 
106 11 eightycc
   `define state_storage_entry_sw_1    6'd12
107
   `define state_storage_entry_sw_2    6'd13
108
   `define state_addr_sel_sw_1         6'd14
109
   `define state_addr_sel_sw_2         6'd15
110 7 eightycc
 
111 11 eightycc
   `define state_xfer_key_1            6'd16
112
   `define state_xfer_key_2            6'd17
113
   `define state_pgm_start_key_1       6'd18
114
   `define state_pgm_start_key_2       6'd19
115
   `define state_pgm_stop_key_1        6'd20
116
   `define state_pgm_stop_key_2        6'd21
117 7 eightycc
 
118 11 eightycc
   `define state_read_gs_1             6'd30
119
   `define state_read_gs_2             6'd31
120
   `define state_read_gs_3             6'd32
121
   `define state_read_gs_4             6'd33
122
   `define state_read_gs_5             6'd34
123 12 eightycc
   `define state_read_gs_6             6'd35
124 7 eightycc
 
125 11 eightycc
   `define state_clear_drum_1          6'd50
126
   `define state_clear_drum_2          6'd51
127
   `define state_clear_drum_3          6'd52
128
 
129
   always @(posedge clk) begin
130 7 eightycc
      if (rst) begin
131
         console_to_addr  <= 0;
132
         pgm_start        <= 0;
133
         pgm_stop         <= 0;
134
         err_reset        <= 0;
135
         err_sense_reset  <= 0;
136
         man_pgm_reset    <= 0;
137
         man_acc_reset    <= 0;
138
         set_8000         <= 0;
139
         reset_8000       <= 0;
140 11 eightycc
         hard_reset       <= 0;
141 7 eightycc
 
142
         // reset console switches
143
         pgm_sw_stop      <= 0;
144
         pgm_sw_run       <= 1;
145 11 eightycc
         half_cycle_sw_run <= 1;
146
         half_cycle_sw_half <= 0;
147 7 eightycc
         ctl_sw_addr_stop <= 0;
148
         ctl_sw_run       <= 1;
149
         ctl_sw_manual    <= 0;
150
         disp_sw_lacc     <= 0;
151
         disp_sw_uacc     <= 0;
152
         disp_sw_dist     <= 1;
153
         disp_sw_pgm     <= 0;
154
         disp_sw_ri       <= 0;
155
         disp_sw_ro       <= 0;
156
         ovflw_sw_stop    <= 1;
157
         ovflw_sw_sense   <= 0;
158
         err_sw_stop      <= 1;
159
         err_sw_sense     <= 0;
160
 
161
         state         <= `state_idle;
162
         busy          <= 1;
163
         digit_ready   <= 0;
164
         cmd_digit_out <= `biq_blank;
165
 
166
         do_power_on_reset  <= 1;
167
         do_reset_console   <= 0;
168
         do_err_reset       <= 0;
169
         do_err_sense_reset <= 0;
170
         do_pgm_reset       <= 0;
171
         do_acc_reset       <= 0;
172 11 eightycc
         do_hard_reset      <= 0;
173
         do_clear_drum      <= 0;
174 7 eightycc
 
175
         gs_ram_addr        <= 15'd0;
176 9 eightycc
         read_gs            <= 0;
177 10 eightycc
         write_gs           <= 0;
178 11 eightycc
         console_out        <= `biq_blank;
179
      end else if (dp) begin
180 7 eightycc
         case (state)
181
            `state_idle: begin
182
               case (command)
183
                  `cmd_none: begin
184
                     if (do_power_on_reset) begin
185
                        do_power_on_reset  <= 0;
186
                        do_reset_console   <= 1;
187
                        do_pgm_reset       <= 1;
188
                        do_acc_reset       <= 1;
189
                        do_err_reset       <= 1;
190
                        do_err_sense_reset <= 1;
191 11 eightycc
                        do_hard_reset      <= 1;
192
                        do_clear_drum      <= 1;
193
                     end else if (do_hard_reset) begin
194
                        do_hard_reset <= 0;
195
                        hard_reset <= 1;
196
                        state <= `state_hard_reset_1;
197 7 eightycc
                     end else if (do_reset_console) begin
198
                        do_reset_console   <= 0;
199
                        state <= `state_reset_console_1;
200 11 eightycc
                     end else if (do_clear_drum) begin
201
                        do_clear_drum <= 0;
202
                        gs_ram_addr <= 15'd0;
203
                        state <= `state_clear_drum_1;
204 7 eightycc
                     end else if (do_pgm_reset) begin
205
                        do_pgm_reset       <= 0;
206
                        state <= `state_pgm_reset_1;
207
                     end else if (do_acc_reset) begin
208
                        do_acc_reset       <= 0;
209
                        man_acc_reset      <= 1;
210
                        state <= `state_acc_reset_1;
211
                     end else if (do_err_reset) begin
212
                        do_err_reset       <= 0;
213
                        err_reset          <= 1;
214
                        state <= `state_err_reset_1;
215
                     end else if (do_err_sense_reset) begin
216
                        do_err_sense_reset <= 0;
217
                        err_sense_reset <= 1;
218
                        state <= `state_err_sense_reset_1;
219
                     end else begin
220
                        busy <= 0;
221
                        digit_ready <= 0;
222
                     end
223
                  end
224
 
225
                  `cmd_pgm_sw_stop: begin
226
                     busy <= 1;
227
                     pgm_sw_stop <= 1;
228
                     pgm_sw_run  <= 0;
229
                  end
230
 
231
                  `cmd_pgm_sw_run: begin
232
                     busy <= 1;
233
                     pgm_sw_stop <= 0;
234
                     pgm_sw_run  <= 1;
235
                  end
236
 
237
                  `cmd_half_cycle_sw_run: begin
238
                     busy <= 1;
239
                     half_cycle_sw_run  <= 1;
240
                     half_cycle_sw_half <= 0;
241
                  end
242
 
243
                  `cmd_half_cycle_sw_half: begin
244
                     busy <= 1;
245
                     half_cycle_sw_run  <= 0;
246
                     half_cycle_sw_half <= 1;
247
                  end
248
 
249
                  `cmd_ctl_sw_addr_stop: begin
250
                     busy <= 1;
251
                     ctl_sw_addr_stop <= 1;
252
                     ctl_sw_run       <= 0;
253
                     ctl_sw_manual    <= 0;
254
                  end
255
 
256
                  `cmd_ctl_sw_run: begin
257
                     busy <= 1;
258
                     ctl_sw_addr_stop <= 0;
259
                     ctl_sw_run       <= 1;
260
                     ctl_sw_manual    <= 0;
261
                  end
262
 
263
                  `cmd_ctl_sw_manual: begin
264
                     busy <= 1;
265
                     ctl_sw_addr_stop <= 0;
266
                     ctl_sw_run       <= 0;
267
                     ctl_sw_manual    <= 1;
268
                  end
269
 
270
                  `cmd_disp_sw_lacc: begin
271
                     busy <= 1;
272
                     disp_sw_lacc <= 1;
273
                     disp_sw_uacc <= 0;
274
                     disp_sw_dist <= 0;
275
                     disp_sw_pgm <= 0;
276
                     disp_sw_ri   <= 0;
277
                     disp_sw_ro   <= 0;
278
                  end
279
 
280
                  `cmd_disp_sw_uacc: begin
281
                     busy <= 1;
282
                     disp_sw_lacc <= 0;
283
                     disp_sw_uacc <= 1;
284
                     disp_sw_dist <= 0;
285
                     disp_sw_pgm <= 0;
286
                     disp_sw_ri   <= 0;
287
                     disp_sw_ro   <= 0;
288
                  end
289
 
290
                  `cmd_disp_sw_dist: begin
291
                     busy <= 1;
292
                     disp_sw_lacc <= 0;
293
                     disp_sw_uacc <= 0;
294
                     disp_sw_dist <= 1;
295
                     disp_sw_pgm <= 0;
296
                     disp_sw_ri   <= 0;
297
                     disp_sw_ro   <= 0;
298
                  end
299
 
300
                  `cmd_disp_sw_prog: begin
301
                     busy <= 1;
302
                     disp_sw_lacc <= 0;
303
                     disp_sw_uacc <= 0;
304
                     disp_sw_dist <= 0;
305
                     disp_sw_pgm <= 1;
306
                     disp_sw_ri   <= 0;
307
                     disp_sw_ro   <= 0;
308
                  end
309
 
310
                  `cmd_disp_sw_ri: begin
311
                     busy <= 1;
312
                     disp_sw_lacc <= 0;
313
                     disp_sw_uacc <= 0;
314
                     disp_sw_dist <= 0;
315
                     disp_sw_pgm <= 0;
316
                     disp_sw_ri   <= 1;
317
                     disp_sw_ro   <= 0;
318
                  end
319
 
320
                  `cmd_disp_sw_ro: begin
321
                     busy <= 1;
322
                     disp_sw_lacc <= 0;
323
                     disp_sw_uacc <= 0;
324
                     disp_sw_dist <= 0;
325
                     disp_sw_pgm <= 0;
326
                     disp_sw_ri   <= 0;
327
                     disp_sw_ro   <= 1;
328
                  end
329
 
330
                  `cmd_ovflw_sw_stop: begin
331
                     busy <= 1;
332
                     ovflw_sw_stop  <= 1;
333
                     ovflw_sw_sense <= 0;
334
                  end
335
 
336
                  `cmd_ovflw_sw_sense: begin
337
                     busy <= 1;
338
                     ovflw_sw_stop  <= 0;
339
                     ovflw_sw_sense <= 1;
340
                  end
341
 
342
                  `cmd_err_sw_stop: begin
343
                     busy <= 1;
344
                     err_sw_stop  <= 1;
345
                     err_sw_sense <= 0;
346
                  end
347
 
348
                  `cmd_err_sw_sense: begin
349
                     busy <= 1;
350
                     err_sw_stop  <= 0;
351
                     err_sw_sense <= 1;
352
                  end
353
 
354
                  `cmd_storage_entry_sw: begin
355
                     busy <= 1;
356
                     state <= `state_storage_entry_sw_1;
357
                  end
358
 
359
                  `cmd_addr_sel_sw: begin
360
                     busy <= 1;
361
                     state <= `state_addr_sel_sw_1;
362
                  end
363
 
364
                  `cmd_xfer_key: begin
365
                     if (ctl_sw_manual) begin
366
                        busy <= 1;
367
                        state <= `state_xfer_key_1;
368
                     end
369
                  end
370
 
371
                  `cmd_pgm_start_key: begin
372
                     busy <= 1;
373
                     state <= `state_pgm_start_key_1;
374
                  end
375
 
376
                  `cmd_pgm_stop_key: begin
377
                     busy <= 1;
378
                     pgm_stop <= 1;
379
                     state <= `state_pgm_stop_key_1;
380
                  end
381
 
382
                  `cmd_pgm_reset_key: begin
383 11 eightycc
                     busy <= 1;
384 7 eightycc
                     do_pgm_reset <= 1;
385
                     do_err_reset <= 1;
386
                  end
387
 
388
                  `cmd_comp_reset_key: begin
389 11 eightycc
                     busy <= 1;
390 7 eightycc
                     do_pgm_reset <= 1;
391
                     do_acc_reset <= 1;
392
                     do_err_reset <= 1;
393
                  end
394
 
395
                  `cmd_acc_reset_key: begin
396 11 eightycc
                     busy <= 1;
397 7 eightycc
                     do_acc_reset <= 1;
398
                     do_err_reset <= 1;
399
                  end
400
 
401
                  `cmd_err_reset_key: begin
402 11 eightycc
                     busy <= 1;
403 7 eightycc
                     do_err_reset <= 1;
404
                  end
405
 
406
                  `cmd_err_sense_reset_key: begin
407 11 eightycc
                     busy <= 1;
408 7 eightycc
                     do_err_sense_reset <= 1;
409
                  end
410
 
411
                  //--------------------------------------------------------------
412
                  // Read from general storage:
413
                  //    --> 4 digits address, little-endian
414
                  //    <-- 1 digit sign, 10 digits, little-endian
415
                  // 0 : Ignore if CPU not stopped
416
                  //     Accept low-order address digit
417
                  // 1 : Accept remaining address digits
418
                  // 2 : Calculate word origin in gs RAM
419
                  //     Validate address
420
                  //     console_read_gs <= 1;
421
                  // 3 : Send gs-early digit to out
422
                  //     digit_ready <= 1;
423
                  // 4 : digit_ready <= 0;
424
                  //--------------------------------------------------------------
425
                  `cmd_read_gs: begin
426
                     if (ctl_sw_manual) begin
427
                        busy <= 1;
428
                        state <= `state_read_gs_1;
429
                     end
430
                  end
431 10 eightycc
 
432 9 eightycc
 
433
                  `cmd_write_gs: begin
434 10 eightycc
                  end
435
 
436 9 eightycc
                  `cmd_read_acc: begin
437 10 eightycc
                  end
438
 
439 9 eightycc
                  `cmd_read_dist: begin
440 10 eightycc
                  end
441
 
442 9 eightycc
                  `cmd_read_prog: begin
443 10 eightycc
                  end
444
 
445
                  // 0 : Ignore if not in manual
446
                  //     Clear gs_ram_addr
447
                  // 1 : Synchronize with d10
448
                  //     Turn on console_write_gs
449
                  // 2 : Put a digit:
450
                  //     dx: blank
451
                  //     d0: minus
452
                  //     d1-d10: zero
453
                  //     gs_ram_addr++
454 9 eightycc
                  `cmd_clear_gs: begin
455 11 eightycc
                     if (ctl_sw_manual) begin
456
                        busy <= 1;
457
                        do_clear_drum <= 1;
458
                     end
459 10 eightycc
                  end
460
 
461 9 eightycc
                  `cmd_load_gs: begin
462 10 eightycc
                  end
463
 
464 9 eightycc
                  `cmd_dump_gs: begin
465 10 eightycc
                  end
466
 
467 9 eightycc
                  `cmd_power_on_reset: begin
468 10 eightycc
                  end
469
 
470 9 eightycc
                  `cmd_reset_console: begin
471 10 eightycc
                  end
472 7 eightycc
 
473 11 eightycc
                  `cmd_hard_reset: begin
474
                     busy <= 1;
475
                     do_hard_reset <= 1;
476
                  end
477
 
478 7 eightycc
               endcase;
479
            end
480
 
481
            // Reset console            
482
            `state_reset_console_1: begin
483
               if (d10) state <= `state_reset_console_2;
484
            end
485
 
486
            `state_reset_console_2: begin
487 11 eightycc
               storage_entry_sw[ontime_idx] <= dx? `biq_blank
488
                                             : d0? `biq_plus : `biq_0;
489 7 eightycc
               addr_sel_sw[ontime_idx[2:3]] <= `biq_0;
490
               if (d10) state <= `state_idle;
491
            end
492
 
493
            // Program reset key press
494
            `state_pgm_reset_1: begin
495
               if (wu & d10) begin
496
                  man_pgm_reset <= 1;
497
                  state <= `state_pgm_reset_2;
498
               end
499
            end
500
 
501
            `state_pgm_reset_2: begin
502
               if (wu & d10) begin
503
                  man_pgm_reset <= 0;
504
                  state <= `state_idle;
505
               end
506
            end
507
 
508
            // Accumulator reset key press
509
            `state_acc_reset_1: begin
510
               if (wu & d10) begin
511
                  man_acc_reset <= 1;
512
                  state <= `state_acc_reset_2;
513
               end
514
            end
515
 
516
            `state_acc_reset_2: begin
517
               if (wu & d10) begin
518
                  man_acc_reset <= 0;
519
                  state <= `state_idle;
520
               end
521
            end
522
 
523
            // Error reset key press
524
            `state_err_reset_1: begin
525
               if (wu & d10) begin
526
                  err_reset <= 1;
527
                  state <= `state_err_reset_2;
528
               end
529
            end
530
 
531
            `state_err_reset_2: begin
532
               if (wu & d10) begin
533
                  err_reset <= 0;
534
                  state <= `state_idle;
535
               end
536
            end
537
 
538
            // Error sense reset key press
539
            `state_err_sense_reset_1: begin
540
               if (wu & d10) begin
541
                  err_sense_reset <= 1;
542
                  state <= `state_err_sense_reset_2;
543
               end
544
            end
545
 
546
            `state_err_sense_reset_2: begin
547
               if (wu & d10) begin
548
                  err_sense_reset <= 0;
549
                  state <= `state_idle;
550
               end
551
            end
552
 
553 11 eightycc
            // Hard reset
554
            `state_hard_reset_1: begin
555
               hard_reset <= 0;
556
               state <= `state_idle;
557
            end
558
 
559 7 eightycc
            // Set storage entry switches
560
            `state_storage_entry_sw_1: begin
561
               if (d0) begin
562
                  state <= `state_storage_entry_sw_2;
563
                  digit_ready <= 1;
564
                  storage_entry_sw[ontime_idx] <= cmd_digit_in;
565
               end
566
            end
567
 
568
            `state_storage_entry_sw_2: begin
569
               storage_entry_sw[ontime_idx] <= cmd_digit_in;
570
               if (d10) begin
571
                  state <= `state_idle;
572
                  digit_ready <= 0;
573
               end
574
            end
575
 
576
            // Set address selection switches
577
            `state_addr_sel_sw_1: begin
578
               if (dx) begin
579
                  state <= `state_addr_sel_sw_2;
580
                  digit_ready <= 1;
581
                  addr_sel_sw[ontime_idx[2:3]] <= cmd_digit_in;
582
               end
583
            end
584
 
585
            `state_addr_sel_sw_2: begin
586
               addr_sel_sw[ontime_idx[2:3]] <= cmd_digit_in;
587
               if (d2) begin
588
                  state <= `state_idle;
589
                  digit_ready <= 0;
590
               end
591
            end
592
 
593
            // Transfer key press
594
            `state_xfer_key_1: begin
595
               if (d10) begin
596
                  console_to_addr <= 1;
597
                  state <= `state_xfer_key_2;
598
               end
599
            end
600
 
601
            `state_xfer_key_2: begin
602
               if (d10) begin
603
                  console_to_addr <= 0;
604
                  state <= `state_idle;
605
               end
606
            end
607
 
608
            // Start key press
609
            `state_pgm_start_key_1: begin
610
               if (wu & d10) begin
611
                  pgm_start <= 1;
612
                  state <= `state_pgm_start_key_2;
613
               end
614
            end
615
 
616
            `state_pgm_start_key_2: begin
617
               if (wu & d10) begin
618
                  pgm_start <= 0;
619
                  state <= `state_idle;
620
               end
621
            end
622
 
623
            // Stop key press
624
            `state_pgm_stop_key_1: begin
625
               if (hp) state <= `state_pgm_stop_key_2;
626
            end
627
 
628
            `state_pgm_stop_key_2: begin
629
               if (hp) begin
630
                  pgm_stop <= 0;
631
                  state <= `state_idle;
632
               end
633
            end
634
 
635
            // Read word from general storage
636
            //    --> 4 digits address, little-endian
637
            //    <-- 1 digit sign, 10 digits, little-endian
638
            // 0 : Ignore if CPU not stopped
639 12 eightycc
            // 1 : Accept first address digit
640
            // 2 : Accept remaining address digits
641 7 eightycc
            // 2 : Calculate word origin in gs RAM
642
            //     Validate address
643
            //     console_read_gs <= 1;
644
            // 3 : Send gs-early digit to out
645
            //     digit_ready <= 1;
646
            // 4 : digit_ready <= 0;
647
            `state_read_gs_1: begin
648
               if (dx) begin
649
                  state <= `state_read_gs_2;
650
                  digit_ready <= 1;
651
                  gs_addr_u <= cmd_digit_in;
652
               end
653
            end
654
 
655
            `state_read_gs_2: begin
656
               if (d0) gs_addr_t <= cmd_digit_in;
657
               else if (d1) gs_addr_h <= cmd_digit_in;
658
               else if (d2) begin
659
                  gs_addr_th <= cmd_digit_in;
660
                  state <= `state_read_gs_3;
661
                  digit_ready <= 0;
662
               end
663
            end
664
 
665
            `state_read_gs_3: begin
666 12 eightycc
               if (d10) begin
667
                  gs_ram_addr <= gs_word_addr;
668
                  read_gs <= 1;
669
                  state <= `state_read_gs_4;
670
               end
671 7 eightycc
            end
672
 
673 10 eightycc
            `state_read_gs_4: begin
674
               state <= `state_read_gs_5;
675 12 eightycc
               gs_ram_addr <= gs_ram_addr + 1;
676 10 eightycc
            end
677 12 eightycc
 
678
            `state_read_gs_5: begin
679
               digit_ready <= 1;
680
               cmd_digit_out <= gs_in;
681
               gs_ram_addr <= gs_ram_addr + 1;
682
               if (dx) begin
683
                  state <= `state_read_gs_6;
684
                  read_gs <= 0;
685
               end
686
            end
687
 
688
            `state_read_gs_6: begin
689
               digit_ready <= 0;
690
               state <= `state_idle;
691
            end
692 11 eightycc
 
693
            // 0 : Ignore if not in manual
694
            //     Clear gs_ram_addr
695
            // 1 : Synchronize with d10
696
            //     Turn on console_write_gs
697
            // 2 : Put a digit:
698
            //     dx: blank
699
            //     d0: minus
700
            //     d1-d10: zero
701
            //     gs_ram_addr++
702
            `state_clear_drum_1: begin
703
               if (d10) begin
704
                  state <= `state_clear_drum_2;
705
               end
706
            end
707 10 eightycc
 
708 11 eightycc
            `state_clear_drum_2: begin
709
               write_gs <= 1;
710
               console_out <= dx? `biq_blank
711
                            : d0? `biq_minus
712
                            : `biq_0;
713
               if (write_gs)
714
                  gs_ram_addr <= gs_ram_addr + 1;
715
               if (gs_ram_addr == 15'd23999) begin
716
                  write_gs <= 0;
717
                  state <= `state_idle;
718
               end
719
            end
720
 
721 7 eightycc
         endcase;
722
      end
723
   end;
724
 
725 11 eightycc
   always @(posedge ap) begin
726
      if (hard_reset) begin
727 7 eightycc
         data_out <= `biq_blank;
728
         addr_out <= `biq_blank;
729
      end else begin
730
         data_out <= d10? `biq_blank : storage_entry_sw[early_idx];
731
         addr_out <= (d3 | d4 | d5 | d6)? addr_sel_sw[early_idx[2:3]] : `biq_blank;
732
      end
733
   end;
734
 
735 11 eightycc
   always @(posedge ap) begin
736
      if (hard_reset) begin
737 7 eightycc
         punch_card       <= 0;
738
         read_card        <= 0;
739
         card_digit_ready <= 0;
740
      end
741
   end;
742
 
743
endmodule

powered by: WebSVN 2.1.0

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