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

Subversion Repositories 8051

[/] [8051/] [tags/] [rel_1/] [rtl/] [verilog/] [oc8051_sfr.v] - Blame information for rev 186

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

powered by: WebSVN 2.1.0

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