Add the missing timer.
[bos2k9.git] / fhw_rs232 / rs232_counter_e.vhd
1 -----------------------------------------------------------------------
2 -- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
3 --
4 -- This is a helper entity implementing a counter. It is driven by
5 -- `clock` on the rising edge. `reset` is active high.
6 --
7 -- While `enable` is high, it counts the number of ticks given via the
8 -- generic `count`. When reached, `done` is high for exactly one
9 -- `clock` (even if `enable` goes low).
10 -----------------------------------------------------------------------
11 -- This entity is part of the following library:
12 -- pragma library fhw_rs232
13 library fhw_rs232;
14
15 library ieee;
16 use ieee.std_logic_1164.all;
17
18 entity rs232_counter_e is
19   generic(
20     count : positive);
21   port(
22     clock  : in  std_logic;
23     reset  : in  std_logic;
24     enable : in  std_logic;
25     
26     done : out std_logic);
27 end rs232_counter_e;
28
29 -----------------------------------------------------------------------
30
31 architecture rtl of rs232_counter_e is
32   -- Use a subtype to please ModelSim's interpretation of attributes.
33   subtype count_t is natural range 0 to count - 1;
34   signal count_s : count_t;
35 begin
36   counter : process(clock, reset, enable)
37   begin
38     if reset = '1' then
39       count_s <= 0;
40       done    <= '0';
41     elsif rising_edge(clock) then
42       -- `done` must be high for a single `clock` only, even if
43       -- `enable` is low.
44       done <= '0';
45       -- This could become an Enable line for one of the FFs.
46       if enable = '1' then
47         if count_s = count_t'high then
48           count_s <= count_t'low;
49           done <= '1';
50         else
51           count_s <= count_s + 1;
52         end if;
53       end if;
54     end if;
55   end process;
56 end rtl;