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

Subversion Repositories softavrcore

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 apal
/*****************************************************************************/
2
/* avr_io_timer.v                                                            */
3
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
4
/* (c) 2019-2020; Andras Pal <apal@szofi.net>                                */
5
/*****************************************************************************/
6
 
7
module avr_io_timer
8
 (      input clk,
9
        input rst,
10
 
11
        input io_re,
12
        input io_we,
13
        input [1:0] io_a,
14
        output [7:0] io_do,
15
        input [7:0] io_di,
16
        output  irq
17
 );
18
 
19
reg [15:0] TCNT;
20
reg [7:0]  TTMP;
21
reg [7:0]  TCR;
22
 
23
reg [11:0]       prescaler;
24
reg [3:0]        pre_prev;
25
reg             overflow;
26
 
27
wire [7:0] TSR = { overflow, 7'b0000000 };
28
 
29
assign irq = TSR[7] & TCR[7];
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 = TCNT[7:0];
36
                2'b01: io_do_data = TTMP[7:0];
37
                2'b10: io_do_data = TCR;
38
                2'b11: io_do_data = TSR;
39
        endcase
40
end
41
assign io_do = io_re ? io_do_data : 8'b00000000;
42
 
43
 
44
always @(posedge clk) begin
45
 
46
        if (io_we & ~io_re) begin
47
                if ( io_a==2'b01 ) TTMP <= io_di;
48
                if ( io_a==2'b10 ) TCR  <= io_di;
49
        end else if ( io_re ) begin
50
                if ( io_a==2'b00 )
51
                        TTMP <= TCNT[15:8];
52
        end
53
 
54
end
55
 
56
wire tcnt_write = io_we & (io_a==2'b00);
57
wire tcr_write  = io_we & (io_a==2'b10);
58
 
59
/* Note: the interrupt is cleared when the overflow flag is reset: therefore, any write
60
into the TNCT _or_ the TCR register would clear the interrupt: */
61
 
62
wire o = overflow & (~tcr_write);
63
 
64
reg increment;
65
 
66
always @(*) begin
67
        casex (TCR[1:0])
68
                2'b00: increment = 1;
69
                2'b01: increment = (~prescaler[ 3])&pre_prev[0];
70
                2'b10: increment = (~prescaler[ 7])&pre_prev[1];
71
                2'b11: increment = (~prescaler[11])&pre_prev[2];
72
        endcase
73
end
74
 
75
always @(posedge clk) begin
76
        if ( ! tcnt_write ) begin
77
                prescaler <= prescaler + 1;
78
                pre_prev  <= { prescaler[11], prescaler[7], prescaler[3] };
79
                { overflow, TCNT } <= { o, 16'd0 } | ( { o, TCNT } + increment );
80
        end else begin
81
                TCNT <= { TTMP, io_di };
82
                prescaler <= 0;
83
                overflow <= 0;
84
        end
85
end
86
 
87
/*****************************************************************************/
88
/* Debug section starts here */
89
 
90
/* end of debug section */
91
/*****************************************************************************/
92
 
93
endmodule
94
 
95
/*****************************************************************************/

powered by: WebSVN 2.1.0

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