Copy RS232 counter to top level.
[bos2k9.git] / bos2k9_counter.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
12 library ieee;
13 use ieee.std_logic_1164.all;
14
15 entity bos2k9_counter_e is
16   generic(
17     count : positive);
18   port(
19     clock  : in  std_logic;
20     reset  : in  std_logic;
21     enable : in  std_logic;
22     
23     done : out std_logic);
24 end bos2k9_counter_e;
25
26 -----------------------------------------------------------------------
27
28 architecture rtl of bos2k9_counter_e is
29   -- Use a subtype to please ModelSim's interpretation of attributes.
30   subtype count_t is natural range 0 to count - 1;
31   signal count_s : count_t;
32 begin
33   counter : process(clock, reset, enable)
34   begin
35     if reset = '1' then
36       count_s <= 0;
37       done    <= '0';
38     elsif rising_edge(clock) then
39       -- `done` must be high for a single `clock` only, even if
40       -- `enable` is low.
41       done <= '0';
42       -- This could become an Enable line for one of the FFs.
43       if enable = '1' then
44         if count_s = count_t'high then
45           count_s <= count_t'low;
46           done <= '1';
47         else
48           count_s <= count_s + 1;
49         end if;
50       end if;
51     end if;
52   end process;
53 end rtl;