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

Subversion Repositories i650

[/] [i650/] [trunk/] [rtl/] [toplev.v] - Blame information for rev 22

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

Line No. Rev Author Line
1 12 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: Top level.
9
// 
10
// Additional Comments: See US 2959351, Fig. 53, 54 and 55. Additional index
11
//  counters provided to address general storage and register RAMs.
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 toplev (
34
      input clk,
35
      input rst,
36
 
37 13 eightycc
      input [0:6] cmd_digit_in, io_buffer_in,
38
      input [0:5] command,
39 12 eightycc
 
40 15 eightycc
      output [0:6] cmd_digit_out, display_digit,
41 13 eightycc
      output busy, digit_ready, punch_card, read_card, card_digit_ready,
42 15 eightycc
      output digit_sync, word_upper,
43
      output [0:3] digit_ctr
44 12 eightycc
  );
45
 
46 13 eightycc
   wire ap, bp, cp, dp;
47
   wire dx, d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10,
48
        d1_d5, d5_dx, d5_d10, d1_dx, d5_d9, d10_d1_d5,
49
        dxl, dxu, d0l, d0u, d1l, d1u, d2l, d10u;
50
   wire w0, w1, w2, w3, w4, w5, w6, w7, w8, w9,
51
        wl, wu, ewl;
52
   wire s0, s1, s2, s3, s4, hp;
53
   wire [0:9] digit_idx;
54
   wire [0:3] early_idx, ontime_idx;
55
 
56 15 eightycc
   assign digit_sync = bp;
57
   assign digit_ctr = ontime_idx;
58
   assign word_upper = wu;
59 13 eightycc
 
60
   timing tm (
61 12 eightycc
    .clk(clk),
62
    .rst(rst),
63
    .ap(ap),
64
    .bp(bp),
65
    .cp(cp),
66
    .dp(dp),
67
    .dx(dx),
68
    .d0(d0),
69
    .d1(d1),
70
    .d2(d2),
71
    .d3(d3),
72
    .d4(d4),
73
    .d5(d5),
74
    .d6(d6),
75
    .d7(d7),
76
    .d8(d8),
77
    .d9(d9),
78
    .d10(d10),
79
    .d1_d5(d1_d5),
80
    .d5_dx(d5_dx),
81
    .d5_d10(d5_d10),
82
    .d1_dx(d1_dx),
83
    .d5_d9(d5_d9),
84
    .d10_d1_d5(d10_d1_d5),
85
    .dxl(dxl),
86
    .dxu(dxu),
87
    .d0l(d0l),
88
    .d0u(d0u),
89
    .d1l(d1l),
90
    .d1u(d1u),
91
    .d2l(d2l),
92
    .d10u(d10u),
93
    .w0(w0),
94
    .w1(w1),
95
    .w2(w2),
96
    .w3(w3),
97
    .w4(w4),
98
    .w5(w5),
99
    .w6(w6),
100
    .w7(w7),
101
    .w8(w8),
102
    .w9(w9),
103
    .wl(wl),
104
    .wu(wu),
105
    .ewl(ewl),
106
    .s0(s0),
107
    .s1(s1),
108
    .s2(s2),
109
    .s3(s3),
110
    .s4(s4),
111
    .hp(hp),
112
    .digit_idx(digit_idx),
113
    .early_idx(early_idx),
114
    .ontime_idx(ontime_idx)
115
   );
116 13 eightycc
 
117 12 eightycc
   //-----------------------------------------------------------------------------
118 21 eightycc
   // Adder input muxes
119
   //-----------------------------------------------------------------------------
120
   wire [0:6] aa_entry_a, ab_entry_b;
121
 
122
   //-----------------------------------------------------------------------------
123 15 eightycc
   // Accumulator
124
   //-----------------------------------------------------------------------------
125
   wire [0:6] ac_early_out, ac_ontime_out, ac_ped_out;
126 22 eightycc
 
127
   //-----------------------------------------------------------------------------
128
   // Adder
129
   //-----------------------------------------------------------------------------
130
   wire [0:6] ad_adder_out;
131
   wire ad_carry_test, ad_no_carry_test, ad_d0l_carry_sig, ad_overflow_stop,
132
        ad_overflow_light, ad_overflow_sense_sig;
133 20 eightycc
 
134
   //-----------------------------------------------------------------------------
135 21 eightycc
   // Address register
136
   //-----------------------------------------------------------------------------
137
   wire [0:6] ar_addr_th, ar_addr_h, ar_addr_t, ar_addr_u;
138
   wire ar_dynamic_addr_hit, ar_addr_no_800x, ar_addr_8000, ar_addr_8001,
139
        ar_addr_8002, ar_addr_8003, ar_addr_8002_8003, ar_invalid_addr;
140
 
141
   //-----------------------------------------------------------------------------
142 20 eightycc
   // Distributor
143
   //-----------------------------------------------------------------------------
144
   wire [0:6] ds_early_out, ds_ontime_out;
145
   wire ds_back_sig;
146 15 eightycc
 
147
   //-----------------------------------------------------------------------------
148 18 eightycc
   // Register validity checking
149
   //-----------------------------------------------------------------------------
150
   wire ck_error_stop, ck_acc_check_light, ck_prog_check_light,
151
        ck_dist_check_light;
152
 
153
   //-----------------------------------------------------------------------------
154 12 eightycc
   // General storage
155
   //-----------------------------------------------------------------------------
156 13 eightycc
   wire [0:4] gs_out;
157
   wire gs_double_write, gs_no_write;
158
 
159 12 eightycc
   //-----------------------------------------------------------------------------
160 21 eightycc
   // Opcode register
161
   //-----------------------------------------------------------------------------
162
   wire [0:6] op_opreg_t, op_opreg_u;
163
   wire op_ri_addr_reg;
164
 
165
   //-----------------------------------------------------------------------------
166 12 eightycc
   // Operator controls
167
   //-----------------------------------------------------------------------------
168 15 eightycc
   wire [0:6] oc_data_out, oc_addr_out, oc_console_out, oc_display_digit;
169 21 eightycc
   wire oc_console_to_addr, oc_acc_ri_console;
170 13 eightycc
   wire [0:14] oc_gs_ram_addr;
171
   wire oc_read_gs, oc_write_gs;
172
   wire oc_pgm_start, oc_pgm_stop, oc_err_reset, oc_err_sense_reset;
173
   wire oc_run_control, oc_half_or_pgm_stop, oc_ri_storage, oc_ro_storage,
174
        oc_storage_control;
175
   wire oc_man_pgm_reset, oc_man_acc_reset, oc_set_8000, oc_reset_8000,
176 12 eightycc
        oc_hard_reset;
177 22 eightycc
   wire oc_restart_reset_busy;
178 15 eightycc
   assign display_digit = oc_display_digit;
179
 
180 12 eightycc
   //-----------------------------------------------------------------------------
181 20 eightycc
   // Program step register
182
   //-----------------------------------------------------------------------------
183
   wire [0:6] ps_early_out, ps_ontime_out, ps_ped_out;
184
   wire ps_restart_sig;
185 21 eightycc
 
186
   //-----------------------------------------------------------------------------
187
   // Storage select
188
   //-----------------------------------------------------------------------------
189
   wire [0:6] ss_selected_out;
190 20 eightycc
 
191
   //-----------------------------------------------------------------------------
192 12 eightycc
   // Translators
193
   //-----------------------------------------------------------------------------
194 13 eightycc
   wire tr_gs_write;
195
   wire [0:4] tr_gs_in;
196 21 eightycc
   wire [0:6] tr_gs_out;
197 12 eightycc
 
198 21 eightycc
   add_in_a aa (
199
    .acc_early_out(ac_early_out),
200
    .acc_ontime_out(ac_ontime_out),
201
    .prog_step_early_out(ps_early_out),
202
    .select_storage_out(ss_selected_out),
203
    .addr_u(ar_addr_u),
204
    .acc_true_add_gate(1'b0),
205
    .acc_compl_add_gate(1'b0),
206
    .left_shift_gate(1'b0),
207
    .prog_step_add_gate(1'b0),
208
    .shift_num_gate(1'b0),
209
    .select_stor_add_gate(1'b0),
210
    .adder_entry_a(aa_entry_a)
211
    );
212
 
213
   add_in_b ab (
214
    .dist_early_out(ds_early_out),
215
    .dist_ontime_out(ds_ontime_out),
216
    .special_int_entry(10'd0),
217
    .ontime_dist_add_gate_tlu(1'b0),
218
    .dist_compl_add_gate(1'b0),
219
    .upper_lower_check(1'b0),
220
    .dist_blank_gate(1'b0),
221
    .early_dist_zero_entry(1'b0),
222
    .dist_true_add_gate(1'b0),
223
    .adder_entry_b(ab_entry_b)
224
    );
225
 
226 15 eightycc
   accumulator ac (
227 21 eightycc
    .rst(oc_hard_reset),
228 15 eightycc
    .ap(ap),
229
    .bp(bp),
230 18 eightycc
    .dp(dp),
231
    .dx(dx),
232 15 eightycc
    .d1(d1),
233
    .d2(d2),
234 21 eightycc
    .d10(d10),
235 15 eightycc
    .dxu(dxu),
236
    .d0u(d0u),
237
    .wu(wu),
238
    .wl(wl),
239 22 eightycc
    .adder_out(ad_adder_out),
240 21 eightycc
    .console_out(oc_console_out),
241 15 eightycc
    .acc_regen_gate(1'b1),
242
    .right_shift_gate(1'b0),
243 21 eightycc
    .acc_ri_gate(1'b0),
244
    .acc_ri_console(oc_acc_ri_console),
245 15 eightycc
    .zero_shift_count(1'b0),
246
    .man_acc_reset(oc_man_acc_reset),
247 21 eightycc
    .reset_op(1'b0),
248 15 eightycc
    .early_idx(early_idx),
249
    .ontime_idx(ontime_idx),
250
    .early_out(ac_early_out),
251
    .ontime_out(ac_ontime_out),
252
    .ped_out(ac_ped_out)
253
    );
254
 
255 22 eightycc
   adder ad (
256
    .rst(rst),
257
    .ap(ap),
258
    .bp(bp),
259
    .dp(dp),
260
    .dxu(dxu),
261
    .dx(dx),
262
    .d0u(d0u),
263
    .d1(d1),
264
    .d1l(d1l),
265
    .d10(d10),
266
    .d10u(d10u),
267
    .wl(wl),
268
    .entry_a(aa_entry_a),
269
    .entry_b(ab_entry_b),
270
    .tlu_on(1'b0),
271
    .left_shift_off(1'b1),
272
    .left_shift_on(1'b0),
273
    .no_carry_insert(1'b0),
274
    .no_carry_blank(1'b0),
275
    .carry_insert(1'b0),
276
    .carry_blank(1'b0),
277
    .zero_insert(1'b0),
278
    .error_reset(oc_err_reset),
279
    .quotient_digit_on(1'b0),
280
    .overflow_stop_sw(1'b1),     // missing from oc_
281
    .overflow_sense_sw(1'b0),    // ditto
282
    .mult_div_off(1'b0),
283
    .dist_true_add_gate(1'b0),
284
    .acc_true_add_latch(1'b0),
285
    .shift_overflow(1'b0),
286
    .adder_out(ad_adder_out),
287
    .carry_test(ad_carry_test),
288
    .no_carry_test(ad_no_carry_test),
289
    .d0l_carry_sig(ad_d0l_carry_sig),
290
    .overflow_stop(ad_overflow_stop),
291
    .overflow_light(ad_overflow_light),
292
    .overflow_sense_sig(ad_overflow_sense_sig)
293
    );
294
 
295 21 eightycc
   addr_reg ar (
296 18 eightycc
    .rst(rst),
297 21 eightycc
    .ap(ap),
298 18 eightycc
    .bp(bp),
299 21 eightycc
    .dx(dx),
300
    .d1(d1),
301
    .d2(d2),
302
    .d3(d3),
303
    .d4(d4),
304
    .d5(d5),
305
    .d6(d6),
306
    .d7(d7),
307
    .d8(d8),
308
    .d9(d9),
309
    .w0(w0),
310
    .w1(w1),
311
    .w2(w2),
312
    .w3(w3),
313
    .w4(w4),
314
    .w5(w5),
315
    .w6(w6),
316
    .w7(w7),
317
    .w8(w8),
318
    .w9(w9),
319
    .s0(s0),
320
    .s1(s1),
321
    .s2(s2),
322
    .s3(s3),
323
    .s4(s4),
324
    .error_reset(oc_err_reset),
325
    .restart_a(1'b0),
326
    .set_8000(oc_set_8000),
327
    .reset_8000(oc_reset_8000),
328
    .tlu_band_change(1'b0),
329
    .double_write(gs_double_write),
330
    .no_write(gs_no_write),
331
    .bs_to_gs(1'b0),
332
    .ri_gs(1'b0),
333
    .ps_reg_in(ps_ontime_out),
334
    .console_in(oc_addr_out),
335
    .ri_addr_reg(op_ri_addr_reg),
336
    .console_to_addr_reg(oc_console_to_addr),
337
    .addr_th(ar_addr_th),
338
    .addr_h(ar_addr_h),
339
    .addr_t(ar_addr_t),
340
    .addr_u(ar_addr_u),
341
    .dynamic_addr_hit(ar_dynamic_addr_hit),
342
    .addr_no_800x(ar_addr_no_800x),
343
    .addr_8000(ar_addr_8000),
344
    .addr_8001(ar_addr_8001),
345
    .addr_8002(ar_addr_8002),
346
    .addr_8003(ar_addr_8003),
347
    .addr_8002_8003(ar_addr_8002_8003),
348
    .invalid_addr(ar_invalid_addr)
349
    );
350
 
351
   checking ck (
352
    .rst(oc_hard_reset),
353
    .bp(bp),
354 18 eightycc
    .d1_dx(d1_dx),
355
    .acc_ontime(ac_ontime_out),
356 20 eightycc
    .prog_ontime(ps_ontime_out),
357
    .dist_ontime(ds_ontime_out),
358 18 eightycc
    .error_reset(oc_err_reset),
359
    .tlu_or_zero_check(1'b0),
360
    .error_stop(ck_error_stop),
361
    .acc_check_light(ck_acc_check_light),
362
    .prog_check_light(ck_prog_check_light),
363
    .dist_check_light(ck_dist_check_light)
364
    );
365
 
366 20 eightycc
   distributor ds (
367 21 eightycc
    .rst(oc_hard_reset),
368 20 eightycc
    .ap(ap),
369
    .cp(cp),
370
    .dp(dp),
371
    .dx(dx),
372
    .d0(d0),
373
    .d10(d10),
374 21 eightycc
    .selected_storage(ss_selected_out),
375 20 eightycc
    .ri_dist(1'd0),
376
    .acc_ontime(ac_ontime_out),
377
    .start_acc_dist_ri(1'd0),
378
    .end_acc_dist_ri(1'd0),
379
    .acc_dist_ri(1'd0),
380
    .man_acc_reset(oc_man_acc_reset),
381
    .early_idx(early_idx),
382
    .ontime_idx(ontime_idx),
383
    .ontime_out(ds_ontime_out),
384
    .early_out(ds_early_out),
385
    .dist_back_sig(ds_back_sig)
386
    );
387
 
388 13 eightycc
   gen_store gs (
389 12 eightycc
    .rst(oc_hard_reset),
390
    .ap(ap),
391
    .dp(dp),
392
    .write_gate(tr_gs_write),
393 21 eightycc
    .addr_th(ar_addr_th),
394
    .addr_h(ar_addr_h),
395
    .addr_t(ar_addr_t),
396 12 eightycc
    .dynamic_addr(digit_idx),
397
    .gs_in(tr_gs_in),
398
    .console_ram_addr(oc_gs_ram_addr),
399
    .console_read_gs(oc_read_gs),
400 13 eightycc
    .console_write_gs(oc_write_gs),
401 12 eightycc
    .gs_out(gs_out),
402
    .double_write(gs_double_write),
403
    .no_write(gs_no_write)
404
    );
405
 
406 13 eightycc
   operator_ctl oc (
407 12 eightycc
    .rst(rst),
408
    .clk(clk),
409
    .ap(ap),
410
    .dp(dp),
411
    .dx(dx),
412
    .d0(d0),
413
    .d1(d1),
414
    .d2(d2),
415
    .d3(d3),
416
    .d4(d4),
417
    .d5(d5),
418 16 eightycc
    .d6(d6),
419
    .d9(d9),
420 12 eightycc
    .d10(d10),
421 16 eightycc
    .wu(wu),
422
    .wl(wl),
423 12 eightycc
    .hp(hp),
424
    .early_idx(early_idx),
425
    .ontime_idx(ontime_idx),
426
    .cmd_digit_in(cmd_digit_in),
427
    .io_buffer_in(io_buffer_in),
428 21 eightycc
    .gs_in(tr_gs_out),
429 15 eightycc
    .acc_ontime(ac_ontime_out),
430 20 eightycc
    .dist_ontime(ds_ontime_out),
431
    .prog_ontime(ps_ontime_out),
432 12 eightycc
    .command(command),
433 22 eightycc
    .restart_reset(1'b0),
434 12 eightycc
    .data_out(oc_data_out),
435
    .addr_out(oc_addr_out),
436
    .console_out(oc_console_out),
437 15 eightycc
    .display_digit(oc_display_digit),
438 21 eightycc
    .console_to_addr(oc_console_to_addr),
439
    .acc_ri_console(oc_acc_ri_console),
440 12 eightycc
    .gs_ram_addr(oc_gs_ram_addr),
441 13 eightycc
    .read_gs(oc_read_gs),
442
    .write_gs(oc_write_gs),
443 12 eightycc
    .pgm_start(oc_pgm_start),
444
    .pgm_stop(oc_pgm_stop),
445
    .err_reset(oc_err_reset),
446
    .err_sense_reset(oc_err_sense_reset),
447
    .run_control(oc_run_control),
448
    .half_or_pgm_stop(oc_half_or_pgm_stop),
449
    .ri_storage(oc_ri_storage),
450
    .ro_storage(oc_ro_storage),
451
    .storage_control(oc_storage_control),
452
    .man_pgm_reset(oc_man_pgm_reset),
453
    .man_acc_reset(oc_man_acc_reset),
454
    .set_8000(oc_set_8000),
455
    .reset_8000(oc_reset_8000),
456
    .hard_reset(oc_hard_reset),
457
    .cmd_digit_out(cmd_digit_out),
458
    .busy(busy),
459 22 eightycc
    .digit_ready(digit_ready),
460
    .restart_reset_busy(oc_restart_reset_busy),
461 12 eightycc
    .punch_card(punch_card),
462
    .read_card(read_card),
463
    .card_digit_ready(card_digit_ready)
464
    );
465
 
466 21 eightycc
   op_reg op (
467
    .rst(oc_hard_reset),
468
    .cp(cp),
469
    .d0(d0),
470
    .d9(d9),
471
    .d10(d10),
472
    .d1_d5(d1_d5),
473
    .d5_dx(d5_dx),
474
    .restart_a(1'b0),
475
    .restart_b(1'b0),
476
    .d_alt(1'b0),
477
    .i_alt(1'b0),
478
    .tlu_band_change(1'b0),
479
    .man_prog_reset(oc_man_pgm_reset),
480
    .prog_step_ped(ps_ped_out),
481
    .opreg_t(op_opreg_t),
482
    .opreg_u(op_opreg_u),
483
    .ri_addr_reg(op_ri_addr_reg)
484
    );
485
 
486 20 eightycc
   prog_step ps (
487 21 eightycc
    .rst(oc_hard_reset),
488 20 eightycc
    .ap(ap),
489
    .dp(dp),
490
    .dx(dx),
491
    .d0(d0),
492
    .d10(d10),
493
    .early_idx(early_idx),
494
    .ontime_idx(ontime_idx),
495
    .man_prog_reset(oc_man_pgm_reset),
496
    .rips(1'b0),
497
    .adder_out(7'b0),
498
    .sel_store_out(7'b0),
499
    .prog_ped_regen(1'b1),
500
    .prog_add(1'b0),
501
    .early_out(ps_early_out),
502
    .ontime_out(ps_ontime_out),
503
    .ped_out(ps_ped_out),
504
    .prog_restart_sig(ps_restart_sig)
505
    );
506
 
507 21 eightycc
   store_select ss (
508
    .d0(d0),
509
    .d1_dx(d1_dx),
510
    .addr_no_800x(ar_addr_no_800x),
511
    .addr_8000(ar_addr_8000),
512
    .addr_8001(ar_addr_8001),
513
    .addr_8002_8003(ar_addr_8002_8003),
514
    .addr_hot_8000(1'b0),
515
    .acc_ontime(ac_ontime_out),
516
    .dist_ontime(ds_ontime_out),
517
    .gs_out(tr_gs_out),
518
    .console_switches(oc_data_out),
519
    .acc_plus(1'b0),
520
    .acc_minus(1'b0),
521
    .selected_out(ss_selected_out)
522
    );
523
 
524 13 eightycc
    translators tr (
525 12 eightycc
    .dist_early_out(`biq_blank),
526
    .bs_out(`biq_blank),
527
    .console_out(oc_console_out),
528
    .ri_gs(1'b0),
529
    .ri_bs(1'b0),
530
    .ri_console(oc_write_gs),
531 21 eightycc
    .n800x(ar_addr_no_800x),
532
    .console_read_gs(oc_read_gs),
533 12 eightycc
    .gs_out(gs_out),
534
    .gs_write(tr_gs_write),
535
    .gs_in(tr_gs_in),
536 21 eightycc
    .gs_biq_out(tr_gs_out)
537 12 eightycc
    );
538
 
539
endmodule

powered by: WebSVN 2.1.0

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