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

Subversion Repositories 8051

[/] [8051/] [trunk/] [rtl/] [verilog/] [oc8051_sfr.v] - Blame information for rev 132

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

Line No. Rev Author Line
1 75 simont
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  8051 cores sfr 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
////   special function registers for oc8051                      ////
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
// $Log: not supported by cvs2svn $
47 132 simont
// Revision 1.10  2003/04/10 12:43:19  simont
48
// defines for pherypherals added
49
//
50 120 simont
// Revision 1.9  2003/04/09 16:24:03  simont
51
// change wr_sft to 2 bit wire.
52
//
53 118 simont
// Revision 1.8  2003/04/09 15:49:42  simont
54
// Register oc8051_sfr dato output, add signal wait_data.
55
//
56 117 simont
// Revision 1.7  2003/04/07 14:58:02  simont
57
// change sfr's interface.
58
//
59 116 simont
// Revision 1.6  2003/04/07 13:29:16  simont
60
// change uart to meet timing.
61
//
62 115 simont
// Revision 1.5  2003/04/04 10:35:07  simont
63
// signal prsc_ow added.
64
//
65 113 simont
// Revision 1.4  2003/03/28 17:45:57  simont
66
// change module name.
67
//
68 90 simont
// Revision 1.3  2003/01/21 13:51:30  simont
69
// add include oc8051_defines.v
70
//
71 87 simont
// Revision 1.2  2003/01/13 14:14:41  simont
72
// replace some modules
73
//
74 82 simont
// Revision 1.1  2002/11/05 17:22:27  simont
75
// initial import
76 75 simont
//
77 82 simont
//
78 75 simont
 
79
// synopsys translate_off
80
`include "oc8051_timescale.v"
81
// synopsys translate_on
82
 
83 87 simont
`include "oc8051_defines.v"
84 75 simont
 
85 87 simont
 
86 120 simont
module oc8051_sfr (rst, clk,
87 117 simont
       adr0, adr1, dat0,
88 120 simont
       dat1, dat2, bit_in,
89
       we, wr_bit,
90 117 simont
       bit_out,
91 120 simont
       wr_sfr, acc,
92
       ram_wr_sel, ram_rd_sel,
93
       sp, sp_w,
94
       bank_sel,
95
       desAc, desOv,
96
       srcAc, cy,
97
       psw_set, rmw,
98 132 simont
       comp_sel,
99
       comp_wait,
100 75 simont
 
101 120 simont
`ifdef OC8051_PORTS
102 75 simont
 
103 120 simont
  `ifdef OC8051_PORT0
104
       p0_out,
105
       p0_in,
106
  `endif
107 75 simont
 
108 120 simont
  `ifdef OC8051_PORT1
109
       p1_out,
110
       p1_in,
111
  `endif
112 75 simont
 
113 120 simont
  `ifdef OC8051_PORT2
114
       p2_out,
115
       p2_in,
116
  `endif
117 75 simont
 
118 120 simont
  `ifdef OC8051_PORT3
119
       p3_out,
120
       p3_in,
121
  `endif
122
 
123
`endif
124
 
125
 
126
  `ifdef OC8051_UART
127
       rxd, txd,
128
  `endif
129
 
130
       int_ack, intr,
131
       int0, int1,
132
       int_src,
133
       reti,
134
 
135
  `ifdef OC8051_TC01
136
       t0, t1,
137
  `endif
138
 
139
  `ifdef OC8051_TC2
140
       t2, t2ex,
141
  `endif
142
 
143
       dptr_hi, dptr_lo,
144
       wait_data);
145
 
146
 
147
input       rst,        // reset - pin
148
            clk,        // clock - pin
149
            we,         // write enable
150
            bit_in,
151
            desAc,
152
            desOv,
153
            rmw;
154
input       int_ack,
155
            int0,
156
            int1,
157
            reti,
158
            wr_bit;
159
input [1:0] psw_set,
160 132 simont
            wr_sfr,
161
            comp_sel;
162 120 simont
input [2:0] ram_rd_sel,
163
            ram_wr_sel;
164
input [7:0] adr0,        //address 0 input
165
            adr1,       //address 1 input
166
            dat1,       //data 1 input (des1)
167
            dat2;       //data 2 input (des2)
168
 
169
output       bit_out,
170
             intr,
171
             srcAc,
172
             cy,
173 132 simont
             wait_data,
174
             comp_wait;
175 82 simont
output [1:0] bank_sel;
176 120 simont
output [7:0] dat0,       //data output
177
             int_src,
178
             dptr_hi,
179
             dptr_lo,
180
             acc;
181
output [7:0] sp,
182
             sp_w;
183 75 simont
 
184 120 simont
// ports
185
`ifdef OC8051_PORTS
186 82 simont
 
187 120 simont
`ifdef OC8051_PORT0
188
input  [7:0] p0_in;
189
output [7:0] p0_out;
190
wire   [7:0] p0_data;
191
`endif
192 75 simont
 
193 120 simont
`ifdef OC8051_PORT1
194
input  [7:0] p1_in;
195
output [7:0] p1_out;
196
wire   [7:0] p1_data;
197
`endif
198 116 simont
 
199 120 simont
`ifdef OC8051_PORT2
200
input  [7:0] p2_in;
201
output [7:0] p2_out;
202
wire   [7:0] p2_data;
203
`endif
204 116 simont
 
205 120 simont
`ifdef OC8051_PORT3
206
input  [7:0] p3_in;
207
output [7:0] p3_out;
208
wire   [7:0] p3_data;
209
`endif
210 75 simont
 
211 120 simont
`endif
212
 
213
 
214 116 simont
// serial interface
215 120 simont
`ifdef OC8051_UART
216
input        rxd;
217
output       txd;
218
`endif
219 116 simont
 
220 120 simont
// timer/counter 0,1
221
`ifdef OC8051_TC01
222
input        t0, t1;
223
`endif
224 82 simont
 
225 120 simont
// timer/counter 2
226
`ifdef OC8051_TC2
227
input        t2, t2ex;
228
`endif
229 117 simont
 
230 120 simont
reg        bit_out,
231
           wait_data;
232
reg [7:0]  dat0,
233
           adr0_r;
234
 
235
reg        wr_bit_r;
236
reg [2:0]  ram_wr_sel_r;
237
 
238
 
239
wire       p,
240
           uart_int,
241
           tf0,
242
           tf1,
243
           tr0,
244
           tr1,
245
           rclk,
246
           tclk,
247
           brate2,
248
           tc2_int;
249
 
250
 
251
wire [7:0] b_reg,
252
           psw,
253
 
254
`ifdef OC8051_TC2
255
  // t/c 2
256
           t2con,
257
           tl2,
258
           th2,
259
           rcap2l,
260
           rcap2h,
261
`endif
262
 
263
`ifdef OC8051_TC01
264
  // t/c 0,1
265
           tmod,
266
           tl0,
267
           th0,
268
           tl1,
269
           th1,
270
`endif
271
 
272
  // serial interface
273
`ifdef OC8051_UART
274
           scon,
275
           pcon,
276
           sbuf,
277
`endif
278
 
279
  //interrupt control
280
           ie,
281
           tcon,
282
           ip;
283
 
284
 
285
reg        pres_ow;
286
reg [3:0]  prescaler;
287
 
288
 
289 75 simont
assign cy = psw[7];
290
assign srcAc = psw [6];
291
 
292 82 simont
 
293
 
294 75 simont
//
295
// accumulator
296
// ACC
297 120 simont
oc8051_acc oc8051_acc1(.clk(clk),
298
                       .rst(rst),
299
                       .bit_in(bit_in),
300
                       .data_in(dat1),
301
                       .data2_in(dat2),
302
                       .wr(we),
303
                       .wr_bit(wr_bit_r),
304
                       .wr_sfr(wr_sfr),
305
                       .wr_addr(adr1),
306
                       .data_out(acc),
307
                       .p(p));
308 75 simont
 
309
 
310
//
311
// b register
312
// B
313 120 simont
oc8051_b_register oc8051_b_register (.clk(clk),
314
                                     .rst(rst),
315
                                     .bit_in(bit_in),
316
                                     .data_in(dat1),
317
                                     .wr(we),
318
                                     .wr_bit(wr_bit_r),
319
                                     .wr_addr(adr1),
320
                                     .data_out(b_reg));
321 75 simont
 
322
//
323
//stack pointer
324
// SP
325 120 simont
oc8051_sp oc8051_sp1(.clk(clk),
326
                     .rst(rst),
327
                     .ram_rd_sel(ram_rd_sel),
328
                     .ram_wr_sel(ram_wr_sel),
329
                     .wr_addr(adr1),
330
                     .wr(we),
331
                     .wr_bit(wr_bit_r),
332
                     .data_in(dat1),
333
                     .sp_out(sp),
334
                     .sp_w(sp_w));
335 75 simont
 
336
//
337
//data pointer
338
// DPTR, DPH, DPL
339 120 simont
oc8051_dptr oc8051_dptr1(.clk(clk),
340
                         .rst(rst),
341
                         .addr(adr1),
342
                         .data_in(dat1),
343
                         .data2_in(dat2),
344
                         .wr(we),
345
                         .wr_bit(wr_bit_r),
346
                         .data_hi(dptr_hi),
347
                         .data_lo(dptr_lo),
348
                         .wr_sfr(wr_sfr));
349 75 simont
 
350 82 simont
 
351 75 simont
//
352
//program status word
353
// PSW
354 120 simont
oc8051_psw oc8051_psw1 (.clk(clk),
355
                        .rst(rst),
356
                        .wr_addr(adr1),
357
                        .data_in(dat1),
358
                        .wr(we),
359
                        .wr_bit(wr_bit_r),
360
                        .data_out(psw),
361
                        .p(p),
362
                        .cy_in(bit_in),
363
                        .ac_in(desAc),
364
                        .ov_in(desOv),
365
                        .set(psw_set),
366
                        .bank_sel(bank_sel));
367 75 simont
 
368
//
369
// ports
370
// P0, P1, P2, P3
371 120 simont
`ifdef OC8051_PORTS
372
  oc8051_ports oc8051_ports1(.clk(clk),
373
                           .rst(rst),
374
                           .bit_in(bit_in),
375
                           .data_in(dat1),
376
                           .wr(we),
377
                           .wr_bit(wr_bit_r),
378
                           .wr_addr(adr1),
379 75 simont
 
380 120 simont
                `ifdef OC8051_PORT0
381
                           .p0_out(p0_out),
382
                           .p0_in(p0_in),
383
                           .p0_data(p0_data),
384
                `endif
385
 
386
                `ifdef OC8051_PORT1
387
                           .p1_out(p1_out),
388
                           .p1_in(p1_in),
389
                           .p1_data(p1_data),
390
                `endif
391
 
392
                `ifdef OC8051_PORT2
393
                           .p2_out(p2_out),
394
                           .p2_in(p2_in),
395
                           .p2_data(p2_data),
396
                `endif
397
 
398
                `ifdef OC8051_PORT3
399
                           .p3_out(p3_out),
400
                           .p3_in(p3_in),
401
                           .p3_data(p3_data),
402
                `endif
403
 
404
                           .rmw(rmw));
405
`endif
406
 
407 75 simont
//
408
// serial interface
409
// SCON, SBUF
410 120 simont
`ifdef OC8051_UART
411
  oc8051_uart oc8051_uatr1 (.clk(clk),
412
                            .rst(rst),
413
                            .bit_in(bit_in),
414
                            .data_in(dat1),
415
                            .wr(we),
416
                            .wr_bit(wr_bit_r),
417
                            .wr_addr(adr1),
418
                            .rxd(rxd),
419
                            .txd(txd),
420
                // interrupt
421
                            .intr(uart_int),
422
                // baud rate sources
423
                            .brate2(brate2),
424
                            .t1_ow(tf1),
425
                            .pres_ow(pres_ow),
426
                            .rclk(rclk),
427
                            .tclk(tclk),
428
                //registers
429
                            .scon(scon),
430
                            .pcon(pcon),
431
                            .sbuf(sbuf));
432
`else
433
  assign uart_int = 1'b0;
434
`endif
435 75 simont
 
436
//
437
// interrupt control
438
// IP, IE, TCON
439 120 simont
oc8051_int oc8051_int1 (.clk(clk),
440
                        .rst(rst),
441
                        .wr_addr(adr1),
442
                        .bit_in(bit_in),
443
                        .ack(int_ack),
444
                        .data_in(dat1),
445
                        .wr(we),
446
                        .wr_bit(wr_bit_r),
447
                        .tf0(tf0),
448
                        .tf1(tf1),
449
                        .t2_int(tc2_int),
450
                        .tr0(tr0),
451
                        .tr1(tr1),
452
                        .ie0(int0),
453
                        .ie1(int1),
454
                        .uart_int(uart_int),
455
                        .reti(reti),
456
                        .intr(intr),
457
                        .int_vec(int_src),
458
                        .ie(ie),
459
                        .tcon(tcon),
460
                        .ip(ip));
461 75 simont
 
462 82 simont
 
463 75 simont
//
464
// timer/counter control
465
// TH0, TH1, TL0, TH1, TMOD
466 120 simont
`ifdef OC8051_TC01
467
  oc8051_tc oc8051_tc1(.clk(clk),
468
                       .rst(rst),
469
                       .wr_addr(adr1),
470
                       .data_in(dat1),
471
                       .wr(we),
472
                       .wr_bit(wr_bit_r),
473
                       .ie0(int0),
474
                       .ie1(int1),
475
                       .tr0(tr0),
476
                       .tr1(tr1),
477
                       .t0(t0),
478
                       .t1(t1),
479
                       .tf0(tf0),
480
                       .tf1(tf1),
481
                       .pres_ow(pres_ow),
482
                       .tmod(tmod),
483
                       .tl0(tl0),
484
                       .th0(th0),
485
                       .tl1(tl1),
486
                       .th1(th1));
487
`else
488
  assign tf0 = 1'b0;
489
  assign tf1 = 1'b0;
490
`endif
491 75 simont
 
492 82 simont
//
493
// timer/counter 2
494 116 simont
// TH2, TL2, RCAPL2L, RCAPL2H, T2CON
495 120 simont
`ifdef OC8051_TC2
496
  oc8051_tc2 oc8051_tc21(.clk(clk),
497
                         .rst(rst),
498
                         .wr_addr(adr1),
499
                         .data_in(dat1),
500
                         .wr(we),
501
                         .wr_bit(wr_bit_r),
502
                         .bit_in(bit_in),
503
                         .t2(t2),
504
                         .t2ex(t2ex),
505
                         .rclk(rclk),
506
                         .tclk(tclk),
507
                         .brate2(brate2),
508
                         .tc2_int(tc2_int),
509
                         .pres_ow(pres_ow),
510
                         .t2con(t2con),
511
                         .tl2(tl2),
512
                         .th2(th2),
513
                         .rcap2l(rcap2l),
514
                         .rcap2h(rcap2h));
515
`else
516
  assign tc2_int = 1'b0;
517
  assign rclk    = 1'b0;
518
  assign tclk    = 1'b0;
519
  assign brate2  = 1'b0;
520
`endif
521 75 simont
 
522 82 simont
 
523
 
524 75 simont
always @(posedge clk or posedge rst)
525
  if (rst) begin
526
    adr0_r <= #1 8'h00;
527
    ram_wr_sel_r <= #1 3'b000;
528 82 simont
    wr_bit_r <= #1 1'b0;
529 117 simont
//    wait_data <= #1 1'b0;
530 75 simont
  end else begin
531
    adr0_r <= #1 adr0;
532
    ram_wr_sel_r <= #1 ram_wr_sel;
533 82 simont
    wr_bit_r <= #1 wr_bit;
534 75 simont
  end
535
 
536 132 simont
assign comp_wait = !(
537
                    ((comp_sel==`OC8051_CSS_AZ) &
538
                       ((wr_sfr==`OC8051_WRS_ACC1) |
539
                        (wr_sfr==`OC8051_WRS_ACC2) |
540
                        ((adr1==`OC8051_SFR_ACC) & we & !wr_bit_r) |
541
                        ((adr1[7:3]==`OC8051_SFR_B_ACC) & we & wr_bit_r))) |
542
                    ((comp_sel==`OC8051_CSS_CY) &
543
                       ((|psw_set) |
544
                        ((adr1==`OC8051_SFR_PSW) & we & !wr_bit_r) |
545
                        ((adr1[7:3]==`OC8051_SFR_B_PSW) & we & wr_bit_r))) |
546
                    ((comp_sel==`OC8051_CSS_BIT) &
547
                       ((adr1[7:3]==adr0[7:3]) & (~&adr1[2:0]) &  we & !wr_bit_r) |
548
                       ((adr1==adr0) & adr1[7] & we & !wr_bit_r)));
549 75 simont
 
550 132 simont
 
551
 
552 75 simont
//
553 117 simont
//set output in case of address (byte)
554
always @(posedge clk or posedge rst)
555
begin
556
  if (rst) begin
557
    dat0 <= #1 8'h00;
558
    wait_data <= #1 1'b0;
559
  end else if ((wr_sfr==`OC8051_WRS_DPTR) & (adr0==`OC8051_SFR_DPTR_LO)) begin                          //write and read same address
560
    dat0 <= #1 dat1;
561
    wait_data <= #1 1'b0;
562
  end else if (
563 120 simont
      (((wr_sfr==`OC8051_WRS_ACC1) & (adr0==`OC8051_SFR_ACC)) |         //write to acc
564 117 simont
      ((wr_sfr==`OC8051_WRS_DPTR) & (adr0==`OC8051_SFR_DPTR_LO)) |      //write to dpl
565 120 simont
      (adr1[7] & (adr1==adr0) & we & !wr_bit_r)) & !wait_data) begin    //write and read same address
566 117 simont
    wait_data <= #1 1'b1;
567
 
568 132 simont
  end else if ((
569
      ((|psw_set) & (adr0==`OC8051_SFR_PSW)) |
570
      ((wr_sfr==`OC8051_WRS_ACC2) & (adr0==`OC8051_SFR_ACC)) |  //write to acc
571 118 simont
      ((wr_sfr==`OC8051_WRS_DPTR) & (adr0==`OC8051_SFR_DPTR_HI))        //write to dph
572 120 simont
      ) & !wait_data) begin
573 117 simont
    wait_data <= #1 1'b1;
574
 
575
  end else begin
576
    case (adr0)
577
      `OC8051_SFR_ACC:          dat0 <= #1 acc;
578
      `OC8051_SFR_PSW:          dat0 <= #1 psw;
579 120 simont
 
580
`ifdef OC8051_PORTS
581
  `ifdef OC8051_PORT0
582 117 simont
      `OC8051_SFR_P0:           dat0 <= #1 p0_data;
583 120 simont
  `endif
584
 
585
  `ifdef OC8051_PORT1
586 117 simont
      `OC8051_SFR_P1:           dat0 <= #1 p1_data;
587 120 simont
  `endif
588
 
589
  `ifdef OC8051_PORT2
590 117 simont
      `OC8051_SFR_P2:           dat0 <= #1 p2_data;
591 120 simont
  `endif
592
 
593
  `ifdef OC8051_PORT3
594 117 simont
      `OC8051_SFR_P3:           dat0 <= #1 p3_data;
595 120 simont
  `endif
596
`endif
597
 
598 117 simont
      `OC8051_SFR_SP:           dat0 <= #1 sp;
599
      `OC8051_SFR_B:            dat0 <= #1 b_reg;
600
      `OC8051_SFR_DPTR_HI:      dat0 <= #1 dptr_hi;
601
      `OC8051_SFR_DPTR_LO:      dat0 <= #1 dptr_lo;
602 120 simont
 
603
`ifdef OC8051_UART
604 117 simont
      `OC8051_SFR_SCON:         dat0 <= #1 scon;
605
      `OC8051_SFR_SBUF:         dat0 <= #1 sbuf;
606
      `OC8051_SFR_PCON:         dat0 <= #1 pcon;
607 120 simont
`endif
608
 
609
`ifdef OC8051_TC01
610 117 simont
      `OC8051_SFR_TH0:          dat0 <= #1 th0;
611
      `OC8051_SFR_TH1:          dat0 <= #1 th1;
612
      `OC8051_SFR_TL0:          dat0 <= #1 tl0;
613
      `OC8051_SFR_TL1:          dat0 <= #1 tl1;
614
      `OC8051_SFR_TMOD:         dat0 <= #1 tmod;
615 120 simont
`endif
616
 
617 117 simont
      `OC8051_SFR_IP:           dat0 <= #1 ip;
618
      `OC8051_SFR_IE:           dat0 <= #1 ie;
619
      `OC8051_SFR_TCON:         dat0 <= #1 tcon;
620 120 simont
 
621
`ifdef OC8051_TC2
622 117 simont
      `OC8051_SFR_RCAP2H:       dat0 <= #1 rcap2h;
623
      `OC8051_SFR_RCAP2L:       dat0 <= #1 rcap2l;
624
      `OC8051_SFR_TH2:          dat0 <= #1 th2;
625
      `OC8051_SFR_TL2:          dat0 <= #1 tl2;
626
      `OC8051_SFR_T2CON:        dat0 <= #1 t2con;
627 120 simont
`endif
628
 
629 117 simont
      default:                  dat0 <= #1 8'h00;
630
    endcase
631
    wait_data <= #1 1'b0;
632
  end
633
end
634
 
635
 
636
//
637
//set output in case of address (bit)
638
always @(posedge clk or posedge rst)
639
begin
640
  if (rst)
641
    bit_out <= #1 1'h0;
642
  else if (
643
          ((adr1[7:3]==adr0[7:3]) & (~&adr1[2:0]) &  we & !wr_bit_r) |
644 118 simont
          ((wr_sfr==`OC8051_WRS_ACC1) & (adr0[7:3]==`OC8051_SFR_B_ACC))         //write to acc
645 120 simont
          )
646 117 simont
 
647
    bit_out <= #1 dat1[adr0[2:0]];
648
  else if ((adr1==adr0) & we & wr_bit_r)
649
    bit_out <= #1 bit_in;
650
  else
651
    case (adr0[7:3])
652
      `OC8051_SFR_B_ACC:   bit_out <= #1 acc[adr0[2:0]];
653
      `OC8051_SFR_B_PSW:   bit_out <= #1 psw[adr0[2:0]];
654 120 simont
 
655
`ifdef OC8051_PORTS
656
  `ifdef OC8051_PORT0
657 117 simont
      `OC8051_SFR_B_P0:    bit_out <= #1 p0_data[adr0[2:0]];
658 120 simont
  `endif
659
 
660
  `ifdef OC8051_PORT1
661 117 simont
      `OC8051_SFR_B_P1:    bit_out <= #1 p1_data[adr0[2:0]];
662 120 simont
  `endif
663
 
664
  `ifdef OC8051_PORT2
665 117 simont
      `OC8051_SFR_B_P2:    bit_out <= #1 p2_data[adr0[2:0]];
666 120 simont
  `endif
667
 
668
  `ifdef OC8051_PORT3
669 117 simont
      `OC8051_SFR_B_P3:    bit_out <= #1 p3_data[adr0[2:0]];
670 120 simont
  `endif
671
`endif
672
 
673 117 simont
      `OC8051_SFR_B_B:     bit_out <= #1 b_reg[adr0[2:0]];
674
      `OC8051_SFR_B_IP:    bit_out <= #1 ip[adr0[2:0]];
675
      `OC8051_SFR_B_IE:    bit_out <= #1 ie[adr0[2:0]];
676
      `OC8051_SFR_B_TCON:  bit_out <= #1 tcon[adr0[2:0]];
677 120 simont
 
678
`ifdef OC8051_UART
679 117 simont
      `OC8051_SFR_B_SCON:  bit_out <= #1 scon[adr0[2:0]];
680 120 simont
`endif
681
 
682
`ifdef OC8051_TC2
683 117 simont
      `OC8051_SFR_B_T2CON: bit_out <= #1 t2con[adr0[2:0]];
684 120 simont
`endif
685
 
686 117 simont
      default:             bit_out <= #1 1'b0;
687
    endcase
688
end
689
 
690 120 simont
always @(posedge clk or posedge rst)
691
begin
692
  if (rst) begin
693
    prescaler <= #1 4'h0;
694
    pres_ow <= #1 1'b0;
695
  end else if (prescaler==4'b1011) begin
696
    prescaler <= #1 4'h0;
697
    pres_ow <= #1 1'b1;
698
  end else begin
699
    prescaler <= #1 prescaler + 4'h1;
700
    pres_ow <= #1 1'b0;
701
  end
702
end
703 117 simont
 
704 75 simont
endmodule

powered by: WebSVN 2.1.0

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