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

Subversion Repositories 8051

[/] [8051/] [tags/] [rel_1/] [rtl/] [verilog/] [oc8051_top.v] - Blame information for rev 120

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

Line No. Rev Author Line
1 72 simont
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  8051 cores top level module                                 ////
4
////                                                              ////
5
////  This file is part of the 8051 cores project                 ////
6
////  http://www.opencores.org/cores/8051/                        ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  8051 definitions.                                           ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////    nothing                                                   ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Simon Teran, simont@opencores.org                     ////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
//
44
// CVS Revision History
45
//
46 54 simont
// $Log: not supported by cvs2svn $
47 120 simont
// Revision 1.22  2003/04/09 16:24:04  simont
48
// change wr_sft to 2 bit wire.
49
//
50 118 simont
// Revision 1.21  2003/04/09 15:49:42  simont
51
// Register oc8051_sfr dato output, add signal wait_data.
52
//
53 117 simont
// Revision 1.20  2003/04/03 19:13:28  simont
54
// Include instruction cache.
55
//
56 107 simont
// Revision 1.19  2003/04/02 15:08:30  simont
57
// raname signals.
58
//
59 102 simont
// Revision 1.18  2003/01/13 14:14:41  simont
60
// replace some modules
61
//
62 82 simont
// Revision 1.17  2002/11/05 17:23:54  simont
63
// add module oc8051_sfr, 256 bytes internal ram
64
//
65 76 simont
// Revision 1.16  2002/10/28 14:55:00  simont
66
// fix bug in interface to external data ram
67
//
68 72 simont
// Revision 1.15  2002/10/23 16:53:39  simont
69
// fix bugs in instruction interface
70
//
71 62 simont
// Revision 1.14  2002/10/17 18:50:00  simont
72
// cahnge interface to instruction rom
73
//
74 54 simont
// Revision 1.13  2002/09/30 17:33:59  simont
75
// prepared header
76 72 simont
//
77
//
78
 
79
// synopsys translate_off
80
`include "oc8051_timescale.v"
81
// synopsys translate_on
82
 
83
 
84 102 simont
module oc8051_top (wb_rst_i, wb_clk_i,
85
//interface to instruction rom
86 120 simont
                wbi_adr_o,
87
                wbi_dat_i,
88
                wbi_stb_o,
89
                wbi_ack_i,
90
                wbi_cyc_o,
91
                wbi_err_i,
92
 
93 102 simont
//interface to data ram
94 120 simont
                wbd_dat_i,
95
                wbd_dat_o,
96
                wbd_adr_o,
97
                wbd_we_o,
98
                wbd_ack_i,
99
                wbd_stb_o,
100
                wbd_cyc_o,
101
                wbd_err_i,
102
 
103 102 simont
// interrupt interface
104 120 simont
                int0_i,
105
                int1_i,
106
 
107 102 simont
// external access (active low)
108
                ea_in,
109 120 simont
 
110 102 simont
// port interface
111 120 simont
  `ifdef OC8051_PORTS
112
        `ifdef OC8051_PORT0
113
                p0_i,
114
                p0_o,
115
        `endif
116
 
117
        `ifdef OC8051_PORT1
118
                p1_i,
119
                p1_o,
120
        `endif
121
 
122
        `ifdef OC8051_PORT2
123
                p2_i,
124
                p2_o,
125
        `endif
126
 
127
        `ifdef OC8051_PORT3
128
                p3_i,
129
                p3_o,
130
        `endif
131
  `endif
132
 
133 102 simont
// serial interface
134 120 simont
        `ifdef OC8051_UART
135 102 simont
                rxd_i, txd_o,
136 120 simont
        `endif
137
 
138 102 simont
// counter interface
139 120 simont
        `ifdef OC8051_TC01
140
                t0_i, t1_i,
141
        `endif
142 72 simont
 
143 120 simont
        `ifdef OC8051_TC2
144
                t2_i, t2ex_i
145
        `endif
146
                );
147 72 simont
 
148
 
149 120 simont
 
150 102 simont
input         wb_rst_i,         // reset input
151
              wb_clk_i,         // clock input
152
              int0_i,           // interrupt 0
153
              int1_i,           // interrupt 1
154
              ea_in,            // external access
155
              wbd_ack_i,        // data acknowalge
156
              wbi_ack_i,        // instruction acknowlage
157
              wbd_err_i,        // data error
158 120 simont
              wbi_err_i;        // instruction error
159 72 simont
 
160 120 simont
input [7:0]   wbd_dat_i; // ram data input
161 102 simont
input [31:0]  wbi_dat_i; // rom data input
162 72 simont
 
163 102 simont
output        wbd_we_o,         // data write enable
164
              wbd_stb_o,        // data strobe
165
              wbd_cyc_o,        // data cycle
166
              wbi_stb_o,        // instruction strobe
167
              wbi_cyc_o;        // instruction cycle
168 82 simont
 
169 120 simont
output [7:0]  wbd_dat_o; // data output
170 102 simont
 
171
output [15:0] wbd_adr_o, // data address
172
              wbi_adr_o;        // instruction address
173
 
174 120 simont
`ifdef OC8051_PORTS
175 102 simont
 
176 120 simont
`ifdef OC8051_PORT0
177
input  [7:0]  p0_i;              // port 0 input
178
output [7:0]  p0_o;              // port 0 output
179
`endif
180 72 simont
 
181 120 simont
`ifdef OC8051_PORT1
182
input  [7:0]  p1_i;              // port 1 input
183
output [7:0]  p1_o;              // port 1 output
184
`endif
185 72 simont
 
186 120 simont
`ifdef OC8051_PORT2
187
input  [7:0]  p2_i;              // port 2 input
188
output [7:0]  p2_o;              // port 2 output
189
`endif
190 72 simont
 
191 120 simont
`ifdef OC8051_PORT3
192
input  [7:0]  p3_i;              // port 3 input
193
output [7:0]  p3_o;              // port 3 output
194
`endif
195 72 simont
 
196 120 simont
`endif
197 72 simont
 
198
 
199
 
200
 
201
 
202
 
203 120 simont
`ifdef OC8051_UART
204
input         rxd_i;            // receive
205
output        txd_o;            // transnmit
206
`endif
207 72 simont
 
208 120 simont
`ifdef OC8051_TC01
209
input         t0_i,             // counter 0 input
210
              t1_i;             // counter 1 input
211
`endif
212 72 simont
 
213 120 simont
`ifdef OC8051_TC2
214
input         t2_i,             // counter 2 input
215
              t2ex_i;           //
216
`endif
217 72 simont
 
218 120 simont
wire [7:0]  op1_i,
219
            op2_i,
220
            op3_i,
221
            dptr_hi,
222
            dptr_lo,
223
            ri,
224
            rn_mem,
225
            data_out,
226
            op1,
227
            op2,
228
            op3,
229
            acc,
230
            p0_out,
231
            p1_out,
232
            p2_out,
233
            p3_out,
234
            sp,
235
            sp_w;
236 72 simont
 
237 120 simont
wire [15:0] pc;
238 72 simont
 
239 120 simont
assign wbd_cyc_o = wbd_stb_o;
240 72 simont
 
241 120 simont
wire        src_sel3;
242
wire [1:0]  wr_sfr;
243
wire [2:0]  ram_rd_sel,  // ram read
244
            ram_wr_sel, // ram write
245
            src_sel2,
246
            src_sel1;
247
 
248
wire [7:0]  ram_data,
249
            ram_out,    //data from ram
250
            sfr_out,
251
            wr_dat,
252
            wr_addr,    //ram write addres
253
            rd_addr;    //data ram read addres
254
wire        sfr_bit;
255
 
256
wire [1:0]  cy_sel,      //carry select; from decoder to cy_selct1
257
            bank_sel;
258
wire        rom_addr_sel,       //rom addres select; alu or pc
259
            rmw,
260
            ea_int;
261
 
262
wire        reti,
263
            intr,
264
            int_ack,
265
            istb;
266
wire [7:0]  int_src;
267
 
268
wire        mem_wait;
269
wire [2:0]  mem_act;
270
wire [3:0]  alu_op;      //alu operation (from decoder)
271
wire [1:0]  psw_set;    //write to psw or not; from decoder to psw (through register)
272
 
273
wire [7:0]  src1,        //alu sources 1
274
            src2,       //alu sources 2
275
            src3,       //alu sources 3
276
            des1,       //alu destination 1
277
            des2,       //alu destinations 2
278
            des1_r;     //destination 1 registerd (to comp1)
279
wire        desCy,      //carry out
280
            desAc,
281
            desOv,      //overflow
282
            alu_cy,
283
            wr,         //write to data ram
284
            wr_o;
285
 
286
wire        rd,         //read program rom
287
            pc_wr;
288
wire [2:0]  pc_wr_sel;   //program counter write select (from decoder to pc)
289
 
290
wire [7:0]  op1_n, //from memory_interface to decoder
291
            op2_n,
292
            op3_n;
293
 
294
wire [1:0]  comp_sel;    //select source1 and source2 to compare
295
wire        eq,         //result (from comp1 to decoder)
296
            srcAc,
297
            cy,
298
            rd_ind,
299
            wr_ind;
300
wire [2:0]  op1_cur;
301
 
302
wire        bit_addr,   //bit addresable instruction
303
            bit_data,   //bit data from ram to ram_select
304
            bit_out,    //bit data from ram_select to alu and cy_select
305
            bit_addr_o,
306
            wait_data;
307
 
308 72 simont
//
309 107 simont
// cpu to cache/wb_interface
310
wire        iack_i,
311
            istb_o,
312
            icyc_o;
313
wire [31:0] idat_i;
314
wire [15:0] iadr_o;
315 72 simont
 
316
 
317
//
318
// decoder
319 120 simont
oc8051_decoder oc8051_decoder1(.clk(wb_clk_i),
320
                               .rst(wb_rst_i),
321
                               .op_in(op1_n),
322
                               .op1_c(op1_cur),
323
                               .ram_rd_sel_o(ram_rd_sel),
324
                               .ram_wr_sel_o(ram_wr_sel),
325
                               .bit_addr(bit_addr),
326 72 simont
 
327 120 simont
                               .src_sel1(src_sel1),
328
                               .src_sel2(src_sel2),
329
                               .src_sel3(src_sel3),
330 72 simont
 
331 120 simont
                               .alu_op_o(alu_op),
332
                               .psw_set(psw_set),
333
                               .cy_sel(cy_sel),
334
                               .wr_o(wr),
335
                               .pc_wr(pc_wr),
336
                               .pc_sel(pc_wr_sel),
337
                               .comp_sel(comp_sel),
338
                               .eq(eq),
339
                               .wr_sfr_o(wr_sfr),
340
                               .rd(rd),
341
                               .rmw(rmw),
342
                               .istb(istb),
343
                               .mem_act(mem_act),
344
                               .mem_wait(mem_wait),
345
                               .wait_data(wait_data));
346
 
347
 
348 72 simont
//
349
//alu
350 120 simont
oc8051_alu oc8051_alu1(.rst(wb_rst_i),
351
                       .clk(wb_clk_i),
352
                       .op_code(alu_op),
353
                       .rd(rd),
354
                       .src1(src1),
355
                       .src2(src2),
356
                       .src3(src3),
357
                       .srcCy(alu_cy),
358
                       .srcAc(srcAc),
359
                       .des1(des1),
360
                       .des2(des2),
361
                       .des1_r(des1_r),
362
                       .desCy(desCy),
363
                       .desAc(desAc),
364
                       .desOv(desOv),
365
                       .bit_in(bit_out));
366 72 simont
 
367
//
368
//data ram
369 120 simont
oc8051_ram_top oc8051_ram_top1(.clk(wb_clk_i),
370
                               .rst(wb_rst_i),
371
                               .rd_addr(rd_addr),
372
                               .rd_data(ram_data),
373
                               .wr_addr(wr_addr),
374
                               .bit_addr(bit_addr_o),
375
                               .wr_data(wr_dat),
376
                               .wr(wr_o && (!wr_addr[7] || wr_ind)),
377
                               .bit_data_in(desCy),
378
                               .bit_data_out(bit_data));
379 72 simont
 
380
//
381
 
382 120 simont
oc8051_alu_src_sel oc8051_alu_src_sel1(.clk(wb_clk_i),
383
                                       .rst(wb_rst_i),
384
                                       .rd(rd),
385 82 simont
 
386 120 simont
                                       .sel1(src_sel1),
387
                                       .sel2(src_sel2),
388
                                       .sel3(src_sel3),
389 82 simont
 
390 120 simont
                                       .acc(acc),
391
                                       .ram(ram_out),
392
                                       .pc(pc),
393
                                       .dptr({dptr_hi, dptr_lo}),
394
                                       .op1(op1_n),
395
                                       .op2(op2_n),
396
                                       .op3(op3_n),
397
 
398
                                       .src1(src1),
399
                                       .src2(src2),
400
                                       .src3(src3));
401
 
402
 
403 72 simont
//
404
//
405 120 simont
oc8051_comp oc8051_comp1(.sel(comp_sel),
406
                         .eq(eq),
407
                         .b_in(bit_out),
408
                         .cy(cy),
409
                         .acc(acc),
410
                         .des(des1_r));
411 72 simont
 
412
 
413
//
414
//program rom
415 120 simont
oc8051_rom oc8051_rom1(.rst(wb_rst_i),
416
                       .clk(wb_clk_i),
417
                       .ea_int(ea_int),
418
                       .addr(iadr_o),
419
                       .data1(op1_i),
420
                       .data2(op2_i),
421
                       .data3(op3_i));
422 72 simont
 
423
//
424
//
425 120 simont
oc8051_cy_select oc8051_cy_select1(.cy_sel(cy_sel),
426
                                   .cy_in(cy),
427
                                   .data_in(bit_out),
428
                                   .data_out(alu_cy));
429 72 simont
//
430
//
431 120 simont
oc8051_indi_addr oc8051_indi_addr1 (.clk(wb_clk_i),
432
                                    .rst(wb_rst_i),
433
                                    .rd_addr(rd_addr),
434
                                    .wr_addr(wr_addr),
435
                                    .data_in(wr_dat),
436
                                    .wr(wr_o),
437
                                    .wr_bit(bit_addr_o),
438
                                    .rn_out(rn_mem),
439
                                    .ri_out(ri),
440
                                    .sel(op1_cur),
441
                                    .bank(bank_sel));
442 72 simont
 
443
 
444 107 simont
 
445
assign icyc_o = istb_o;
446 72 simont
//
447
//
448 120 simont
oc8051_memory_interface oc8051_memory_interface1(.clk(wb_clk_i),
449
                       .rst(wb_rst_i),
450 107 simont
// internal ram
451 120 simont
                       .wr_i(wr),
452
                       .wr_o(wr_o),
453
                       .wr_bit_i(bit_addr),
454
                       .wr_bit_o(bit_addr_o),
455
                       .wr_dat(wr_dat),
456
                       .des1(des1),
457
                       .des2(des2),
458
                       .rd_addr(rd_addr),
459
                       .wr_addr(wr_addr),
460
                       .wr_ind(wr_ind),
461
                       .bit_in(bit_data),
462
                       .in_ram(ram_data),
463
                       .sfr(sfr_out),
464
                       .sfr_bit(sfr_bit),
465
                       .bit_out(bit_out),
466
                       .iram_out(ram_out),
467 72 simont
 
468 107 simont
// external instrauction rom
469 120 simont
                       .iack_i(iack_i),
470
                       .iadr_o(iadr_o),
471
                       .idat_i(idat_i),
472
                       .istb_o(istb_o),
473 82 simont
 
474 107 simont
// internal instruction rom
475 120 simont
                       .op1_i(op1_i),
476
                       .op2_i(op2_i),
477
                       .op3_i(op3_i),
478 82 simont
 
479 107 simont
// data memory
480 120 simont
                       .dadr_o(wbd_adr_o),
481
                       .ddat_o(wbd_dat_o),
482
                       .dwe_o(wbd_we_o),
483
                       .dstb_o(wbd_stb_o),
484
                       .ddat_i(wbd_dat_i),
485
                       .dack_i(wbd_ack_i),
486 107 simont
 
487
// from decoder
488 120 simont
                       .rd_sel(ram_rd_sel),
489
                       .wr_sel(ram_wr_sel),
490
                       .rn({bank_sel, op1_n[2:0]}),
491
                       .rd_ind(rd_ind),
492
                       .rd(rd),
493
                       .mem_act(mem_act),
494
                       .mem_wait(mem_wait),
495 107 simont
 
496
// external access
497 120 simont
                       .ea(ea_in),
498
                       .ea_int(ea_int),
499 107 simont
 
500
// instructions outputs to cpu
501 120 simont
                       .op1_out(op1_n),
502
                       .op2_out(op2_n),
503
                       .op3_out(op3_n),
504 82 simont
 
505 107 simont
// interrupt interface
506 120 simont
                       .intr(intr),
507
                       .int_v(int_src),
508
                       .int_ack(int_ack),
509
                       .istb(istb),
510
                       .reti(reti),
511 107 simont
 
512 82 simont
//pc
513 120 simont
                       .pc_wr_sel(pc_wr_sel),
514
                       .pc_wr(pc_wr),
515
                       .pc(pc),
516 82 simont
 
517 107 simont
// sfr's
518 120 simont
                       .sp_w(sp_w),
519
                       .dptr({dptr_hi, dptr_lo}),
520
                       .ri(ri),
521
                       .rn_mem(rn_mem),
522
                       .acc(acc),
523
                       .sp(sp)
524
                       );
525 82 simont
 
526 107 simont
 
527 72 simont
//
528
//
529
 
530 120 simont
oc8051_sfr oc8051_sfr1(.rst(wb_rst_i),
531
                       .clk(wb_clk_i),
532
                       .adr0(rd_addr[7:0]),
533
                       .adr1(wr_addr[7:0]),
534
                       .dat0(sfr_out),
535
                       .dat1(wr_dat),
536
                       .dat2(des2),
537
                       .we(wr_o && !wr_ind),
538
                       .bit_in(desCy),
539
                       .bit_out(sfr_bit),
540
                       .wr_bit(bit_addr_o),
541
                       .ram_rd_sel(ram_rd_sel),
542
                       .ram_wr_sel(ram_wr_sel),
543
                       .wr_sfr(wr_sfr),
544 76 simont
// acc
545 120 simont
                       .acc(acc),
546 76 simont
// sp
547 120 simont
                       .sp(sp),
548
                       .sp_w(sp_w),
549 76 simont
// psw
550 120 simont
                       .bank_sel(bank_sel),
551
                       .desAc(desAc),
552
                       .desOv(desOv),
553
                       .psw_set(psw_set),
554
                       .srcAc(srcAc),
555
                       .cy(cy),
556 76 simont
// ports
557 120 simont
                       .rmw(rmw),
558
 
559
  `ifdef OC8051_PORTS
560
        `ifdef OC8051_PORT0
561
                       .p0_out(p0_o),
562
                       .p0_in(p0_i),
563
        `endif
564
 
565
        `ifdef OC8051_PORT1
566
                       .p1_out(p1_o),
567
                       .p1_in(p1_i),
568
        `endif
569
 
570
        `ifdef OC8051_PORT2
571
                       .p2_out(p2_o),
572
                       .p2_in(p2_i),
573
        `endif
574
 
575
        `ifdef OC8051_PORT3
576
                       .p3_out(p3_o),
577
                       .p3_in(p3_i),
578
        `endif
579
  `endif
580
 
581 76 simont
// uart
582 120 simont
        `ifdef OC8051_UART
583
                       .rxd(rxd_i), .txd(txd_o),
584
        `endif
585
 
586 76 simont
// int
587 120 simont
                       .int_ack(int_ack),
588
                       .intr(intr),
589
                       .int0(int0_i),
590
                       .int1(int1_i),
591
                       .reti(reti),
592
                       .int_src(int_src),
593
 
594
// t/c 0,1
595
        `ifdef OC8051_TC01
596
                       .t0(t0_i),
597
                       .t1(t1_i),
598
        `endif
599
 
600
// t/c 2
601
        `ifdef OC8051_TC2
602
                       .t2(t2_i),
603
                       .t2ex(t2ex_i),
604
        `endif
605
 
606 76 simont
// dptr
607 120 simont
                       .dptr_hi(dptr_hi),
608
                       .dptr_lo(dptr_lo),
609
                       .wait_data(wait_data)
610
                       );
611 72 simont
 
612 82 simont
 
613 107 simont
 
614
 
615
`ifdef OC8051_CACHE
616
 
617
 
618
oc8051_icache oc8051_icache1(.rst(wb_rst_i), .clk(wb_clk_i),
619
// cpu
620
        .adr_i(iadr_o),
621
        .dat_o(idat_i),
622
        .stb_i(istb_o),
623
        .ack_o(iack_i),
624
        .cyc_i(icyc_o),
625
// pins
626
        .dat_i(wbi_dat_i),
627
        .stb_o(wbi_stb_o),
628
        .adr_o(wbi_adr_o),
629
        .ack_i(wbi_ack_i),
630
        .cyc_o(wbi_cyc_o));
631
 
632
defparam oc8051_icache1.ADR_WIDTH = 7;  // cache address wihth
633
defparam oc8051_icache1.LINE_WIDTH = 2; // line address width (2 => 4x32)
634
defparam oc8051_icache1.BL_NUM = 31; // number of blocks (2^BL_WIDTH-1); BL_WIDTH = ADR_WIDTH - LINE_WIDTH
635
defparam oc8051_icache1.CACHE_RAM = 128; // cache ram x 32 (2^ADR_WIDTH)
636
 
637
//
638
//    no cache
639
//
640
`else
641
 
642
oc8051_wb_iinterface oc8051_wb_iinterface(.rst(wb_rst_i), .clk(wb_clk_i),
643
// cpu
644
        .adr_i(iadr_o),
645
        .dat_o(idat_i),
646
        .stb_i(istb_o),
647
        .ack_o(iack_i),
648
        .cyc_i(icyc_o),
649
// external rom
650
        .dat_i(wbi_dat_i),
651
        .stb_o(wbi_stb_o),
652
        .adr_o(wbi_adr_o),
653
        .ack_i(wbi_ack_i),
654
        .cyc_o(wbi_cyc_o));
655
 
656
 
657
`endif
658
 
659
 
660
 
661 72 simont
endmodule

powered by: WebSVN 2.1.0

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