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

Subversion Repositories System09

[/] [System09/] [trunk/] [rtl/] [VHDL/] [timer.vhd] - Blame information for rev 99

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 99 davidgb
--===========================================================================--
2
--                                                                           --
3
--                  Synthesizable 8 bit Timer                                --
4
--                                                                           --
5
--===========================================================================--
6 19 dilbert57
--
7 99 davidgb
--  File name      : timer.vhd
8
--
9
--  Entity name    : timer
10 19 dilbert57
--
11 99 davidgb
--  Purpose        : 8 bit timer module for System09
12 19 dilbert57
--
13 99 davidgb
--  Dependencies   : ieee.std_logic_1164
14
--                   ieee.std_logic_unsigned
15 19 dilbert57
--
16 99 davidgb
--  Uses           : None
17 19 dilbert57
--
18 99 davidgb
--  Author         : John E. Kent      
19 19 dilbert57
--
20 99 davidgb
--  Email          : dilbert57@opencores.org      
21
--
22
--  Web            : http://opencores.org/project,system09
23
--
24
--  Registers      :
25
--
26
--  IO address + 0 Read - Down Count register
27
--        Bits[7..0] = Counter Value
28
--
29
--  IO address + 0 Write - Preset Count register
30
--        Bits[7..0] = Preset Value
31 19 dilbert57
--
32 99 davidgb
--  IO address + 1 Read - Status register
33
--        Bit[7]     = Interrupt Flag
34
--        Bits[6..0] = undefined
35 19 dilbert57
--
36 99 davidgb
--  IO address + 1 Write - Control register
37
--        Bit[7]     = Interrupt Enable
38
--        Bits[6..1] = Unedfined
39
--        Bit[0]     = Counter enable
40 19 dilbert57
--
41 99 davidgb
--  Operation       :
42 19 dilbert57
--
43 99 davidgb
--        Write count to counter register
44
--        Enable counter by setting bit 0 of the control register
45
--        Enable interrupts by setting bit 7 of the control register
46
--        Counter will count down to zero
47
--        When it reaches zero the terminal flag is set
48
--        If the interrupt is enabled an interrupt is generated
49
--        The interrupt may be disabled by writing a 0 to bit 7 
50
--        of the control register or by loading a new down count 
51
--        into the counter register.
52
--
53
--  Copyright (C) 2002 - 2010 John Kent
54
--
55
--  This program is free software: you can redistribute it and/or modify
56
--  it under the terms of the GNU General Public License as published by
57
--  the Free Software Foundation, either version 3 of the License, or
58
--  (at your option) any later version.
59
--
60
--  This program is distributed in the hope that it will be useful,
61
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
62
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
63
--  GNU General Public License for more details.
64
--
65
--  You should have received a copy of the GNU General Public License
66
--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
67
--
68
--===========================================================================--
69
--                                                                           --
70
--                              Revision  History                            --
71
--                                                                           --
72
--===========================================================================--
73
--
74
-- Version Date        Author     Changes
75
--
76
-- 0.1     2002-09-06  John Kent  Converted to a single timer 
77
--                                Made synchronous with system clock
78
-- 1.0     2003-09-06  John Kent  Changed Clock Edge
79
--                                Released to opencores.org
80
-- 2.0     2008-02-05  John Kent  Removed Timer inputs and outputs
81
--                                Made into a simple 8 bit interrupt down counter
82
-- 2.1     2010-06-17  John Kent  Updated header and added GPL
83 19 dilbert57
--
84 22 dilbert57
-- 
85 19 dilbert57
library ieee;
86
use ieee.std_logic_1164.all;
87
use ieee.std_logic_unsigned.all;
88
 
89
entity timer is
90
        port (
91
         clk        : in  std_logic;
92
    rst        : in  std_logic;
93
    cs         : in  std_logic;
94 99 davidgb
    addr       : in  std_logic;
95 19 dilbert57
    rw         : in  std_logic;
96
    data_in    : in  std_logic_vector(7 downto 0);
97
         data_out   : out std_logic_vector(7 downto 0);
98 22 dilbert57
         irq        : out std_logic
99 19 dilbert57
  );
100
end;
101
 
102
architecture rtl of timer is
103
signal timer_ctrl  : std_logic_vector(7 downto 0);
104
signal timer_stat  : std_logic_vector(7 downto 0);
105
signal timer_count : std_logic_vector(7 downto 0);
106
signal timer_term  : std_logic; -- Timer terminal count
107
--
108
-- control/status register bits
109
--
110 99 davidgb
constant BIT_ENB   : integer := 0; -- 0=disable, 1=enabled
111
constant BIT_IRQ   : integer := 7; -- 0=disabled, 1-enabled
112 19 dilbert57
 
113
begin
114
 
115 99 davidgb
  --------------------------------
116
  --
117
  -- write control registers
118
  --
119
  --------------------------------
120
  timer_control : process( clk, rst, cs, rw, addr, data_in,
121
                         timer_ctrl, timer_term, timer_count )
122
  begin
123
    if clk'event and clk = '0' then
124
      if rst = '1' then
125
             timer_count <= (others=>'0');
126
                  timer_ctrl  <= (others=>'0');
127 22 dilbert57
                  timer_term  <= '0';
128 99 davidgb
      elsif cs = '1' and rw = '0' then
129
             if addr='0' then
130
                    timer_count <= data_in;
131
                    timer_term  <= '0';
132
             else
133
                    timer_ctrl <= data_in;
134
                  end if;
135 19 dilbert57
           else
136 99 davidgb
             if (timer_ctrl(BIT_ENB) = '1') then
137
                    if (timer_count = "00000000" ) then
138
                      timer_term <= '1';
139
          else
140
            timer_count <= timer_count - 1;
141
                    end if;
142 19 dilbert57
                  end if;
143 99 davidgb
      end if;
144 19 dilbert57
    end if;
145 99 davidgb
  end process;
146
 
147 19 dilbert57
  --
148
  -- timer status register
149
  --
150 22 dilbert57
  timer_status : process( timer_ctrl, timer_term )
151 19 dilbert57
  begin
152 22 dilbert57
    timer_stat(6 downto 0) <= timer_ctrl(6 downto 0);
153 99 davidgb
    timer_stat(BIT_IRQ) <= timer_term;
154 19 dilbert57
  end process;
155
 
156 99 davidgb
  --
157
  -- timer data output mux
158
  --
159
  timer_data_out : process( addr, timer_count, timer_stat )
160
  begin
161
    if addr = '0' then
162
      data_out <= timer_count;
163
    else
164
      data_out <= timer_stat;
165
    end if;
166
  end process;
167
 
168
  --
169
  -- read timer strobe to reset interrupts
170
  --
171
  timer_interrupt : process( timer_term, timer_ctrl )
172
  begin
173
         irq <= timer_term and timer_ctrl(BIT_IRQ);
174
  end process;
175
 
176 19 dilbert57
end rtl;
177
 

powered by: WebSVN 2.1.0

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