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

Subversion Repositories s80186

[/] [s80186/] [trunk/] [fpga/] [timer/] [Timer.sv] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jamieiles
// Copyright Jamie Iles, 2017
2
//
3
// This file is part of s80x86.
4
//
5
// s80x86 is free software: you can redistribute it and/or modify
6
// it under the terms of the GNU General Public License as published by
7
// the Free Software Foundation, either version 3 of the License, or
8
// (at your option) any later version.
9
//
10
// s80x86 is distributed in the hope that it will be useful,
11
// but WITHOUT ANY WARRANTY; without even the implied warranty of
12
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
// GNU General Public License for more details.
14
//
15
// You should have received a copy of the GNU General Public License
16
// along with s80x86.  If not, see .
17
 
18
module Timer(input logic clk,
19
             input logic reset,
20
             input logic pit_clk,
21
             input logic cs,
22
             input logic [1:1] data_m_addr,
23
             input logic [15:0] data_m_data_in,
24
             output logic [15:0] data_m_data_out,
25
             input logic [1:0] data_m_bytesel,
26
             input logic data_m_wr_en,
27
             input logic data_m_access,
28
             output logic data_m_ack,
29
             output logic intr);
30
 
31
wire pit_clk_sync;
32
wire pit_clk_posedge = pit_clk_sync & ~last_pit_clk;
33
wire access_data = cs & data_m_access & ~data_m_addr[1] & data_m_bytesel[0];
34
wire access_ctrl = cs & data_m_access & data_m_addr[1] & data_m_bytesel[1];
35
wire [7:0] ctrl_wr_val = data_m_data_in[15:8];
36
wire [1:0] channel = ctrl_wr_val[7:6];
37
 
38
reg last_pit_clk;
39
 
40
reg [15:0] count, reload, latched_count;
41
reg [1:0] rw;
42
reg [2:0] mode;
43
reg [1:0] latched;
44
reg access_low;
45
reg reloaded;
46
 
47
BitSync PITSync(.clk(clk),
48
                .d(pit_clk),
49
                .q(pit_clk_sync));
50
 
51
always_ff @(posedge clk)
52
    last_pit_clk <= pit_clk_sync;
53
 
54
always_ff @(posedge clk)
55
    if (access_data && !data_m_wr_en) begin
56
        if (|latched) begin
57
            data_m_data_out <= {8'b0, latched_count[7:0]};
58
        end else
59
            data_m_data_out <= {8'b0, rw[0] ? count[7:0] : count[15:8]};
60
    end else begin
61
        data_m_data_out <= 16'b0;
62
    end
63
 
64
always_ff @(posedge reset or posedge clk) begin
65
    if (reset) begin
66
        {rw, mode, access_low} <= 6'b0;
67
        latched_count <= 16'b0;
68
        latched <= 2'b00;
69
    end else if (access_ctrl && data_m_wr_en && channel == 2'b00) begin
70
        if (ctrl_wr_val[5:4] == 2'b00 && ~|latched) begin
71
            latched <= 2'b11;
72
            latched_count <= count;
73
        end else begin
74
            mode <= ctrl_wr_val[3:1];
75
            access_low <= ctrl_wr_val[4];
76
            rw <= ctrl_wr_val[5:4];
77
        end
78
    end else if (access_data && data_m_wr_en && rw == 2'b11)
79
        access_low <= ~access_low;
80
    else if (access_data && !data_m_wr_en) begin
81
        latched <= {1'b0, latched[1]};
82
        latched_count <= {8'b0, latched_count[15:8]};
83
    end
84
end
85
 
86
always_ff @(posedge reset or posedge clk) begin
87
    if (reset) begin
88
        reload <= 16'b0;
89
        reloaded <= 1'b0;
90
    end else begin
91
        reloaded <= 1'b0;
92
 
93
        if (access_data && data_m_wr_en) begin
94
            if (access_low)
95
                reload[7:0] <= data_m_data_in[7:0];
96
            else begin
97
                reload[15:8] <= data_m_data_in[7:0];
98
                reloaded <= 1'b1;
99
            end
100
        end
101
    end
102
end
103
 
104
always_ff @(posedge reset or posedge clk) begin
105
    if (reset) begin
106
        count <= 16'b0;
107
        intr <= 1'b0;
108
    end else begin
109
        if (reloaded)
110
            count <= reload - 1'b1;
111
        else if (pit_clk_posedge && mode[1:0] == 2'b10) begin
112
            count <= (count == 16'b0 ? reload : count) - 1'b1;
113
            if (count == 16'b1)
114
                intr <= 1'b0;
115
            else
116
                intr <= 1'b1;
117
        end
118
    end
119
end
120
 
121
always_ff @(posedge clk)
122
    data_m_ack <= cs & data_m_access;
123
 
124
endmodule

powered by: WebSVN 2.1.0

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