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

Subversion Repositories softavrcore

[/] [softavrcore/] [trunk/] [peripherals/] [avr_systick.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 apal
/*****************************************************************************/
2
/* avr_systick.v                                                             */
3
/*****************************************************************************/
4
/* Registers                                                                 */
5
/*      STCNTL  r       BASE + 0x00             { CNT[7:0] }                 */
6
/*      STCNTH  r       BASE + 0x01             { OVERFLOW, CNT[14:8] }      */
7
/*      STLOADL r+w     BASE + 0x02             { CLOAD[7:0] }               */
8
/*      STLOADH r+w     BASE + 0x03             { IENABLE, CLOAD[14:8] }     */
9
/*****************************************************************************/
10
 
11
module avr_systick
12
 (      input clk,
13
        input rst,
14
 
15
        input   io_re,
16
        input   io_we,
17
        input   [1:0] io_a,
18
        output  [7:0] io_do,
19
        input   [7:0] io_di,
20
        output  irq
21
 );
22
 
23
reg IENABLE;
24
reg CLOAD[14:0];
25
reg OVERFLOW;
26
reg [14:0] CNT;
27
reg [6:0] CTMP;
28
 
29
assign irq = IENABLE & OVERFLOW;
30
 
31
/* I/O read: */
32
reg [7:0] io_do_data;
33
always @(*) begin
34
        casex (io_a)
35
                2'b00: io_do_data = CNT[7:0];
36
                2'b01: io_do_data = { OVERFLOW, CTMP };
37
                2'b10: io_do_data = CLOAD[7:0];
38
                2'b11: io_do_data = { IENABLE, CLOAD[14:8] } ;
39
        endcase
40
end
41
 
42
assign io_do = io_re ? io_do_data : 8'b00000000;
43
 
44
wire reset_overflow_bit = (io_we & (io_a[1]==0));
45
 
46
always @(posedge clk) begin
47
 
48
        if (io_we & ~io_re) begin
49
                if ( io_a==2'b10 ) begin
50
                        CLOAD[7:0]  <= io_di;
51
                end else if ( io_a==2'b11 ) begin
52
                        { IENABLE, CLOAD[14:8] } <= io_di;
53
                end
54
        end else if ( io_re ) begin
55
                if ( io_a==2'b00 )
56
                        CTMP <= CNT[15:8];
57
        end
58
 
59
end
60
 
61
always @(posedge clk) begin
62
        if ( reset_overflow_bit ) begin
63
                OVERFLOW <= 0;
64
        end else if ( CNT[14:0]==0 ) begin
65
                CNT <= CLOAD;
66
                OVERFLOW <= 1;
67
        end else begin
68
                CNT <= CNT - 1;
69
        end
70
end
71
 
72
/*****************************************************************************/
73
/* Debug section starts here */
74
 
75
/* end of debug section */
76
/*****************************************************************************/
77
 
78
endmodule
79
 
80
/*****************************************************************************/

powered by: WebSVN 2.1.0

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