Add the missing timer.
authorMalte S. Stretz <mss@apache.org>
Wed, 15 Jul 2009 13:32:45 +0000 (15:32 +0200)
committerMalte S. Stretz <mss@apache.org>
Wed, 15 Jul 2009 13:32:45 +0000 (15:32 +0200)
fhw_rs232/rs232_counter_e.vhd [new file with mode: 0644]
fhw_rs232/rs232_send.vhd

diff --git a/fhw_rs232/rs232_counter_e.vhd b/fhw_rs232/rs232_counter_e.vhd
new file mode 100644 (file)
index 0000000..627f911
--- /dev/null
@@ -0,0 +1,56 @@
+-----------------------------------------------------------------------
+-- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
+--
+-- This is a helper entity implementing a counter. It is driven by
+-- `clock` on the rising edge. `reset` is active high.
+--
+-- While `enable` is high, it counts the number of ticks given via the
+-- generic `count`. When reached, `done` is high for exactly one
+-- `clock` (even if `enable` goes low).
+-----------------------------------------------------------------------
+-- This entity is part of the following library:
+-- pragma library fhw_rs232
+library fhw_rs232;
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+entity rs232_counter_e is
+  generic(
+    count : positive);
+  port(
+    clock  : in  std_logic;
+    reset  : in  std_logic;
+    enable : in  std_logic;
+    
+    done : out std_logic);
+end rs232_counter_e;
+
+-----------------------------------------------------------------------
+
+architecture rtl of rs232_counter_e is
+  -- Use a subtype to please ModelSim's interpretation of attributes.
+  subtype count_t is natural range 0 to count - 1;
+  signal count_s : count_t;
+begin
+  counter : process(clock, reset, enable)
+  begin
+    if reset = '1' then
+      count_s <= 0;
+      done    <= '0';
+    elsif rising_edge(clock) then
+      -- `done` must be high for a single `clock` only, even if
+      -- `enable` is low.
+      done <= '0';
+      -- This could become an Enable line for one of the FFs.
+      if enable = '1' then
+        if count_s = count_t'high then
+          count_s <= count_t'low;
+          done <= '1';
+        else
+          count_s <= count_s + 1;
+        end if;
+      end if;
+    end if;
+  end process;
+end rtl;
index 9195e92..d04e5c6 100644 (file)
@@ -33,6 +33,17 @@ entity rs232_send is
 -----------------------------------------------------------------------
 
 architecture rtl of rs232_send is
+  component rs232_counter_e is
+    generic(
+      count : positive := clock_divider);
+    port(
+      clock  : in  std_logic;
+      reset  : in  std_logic;
+      enable : in  std_logic;
+      
+      done : out std_logic);
+  end component;
+
   type state_t is (
     state_idle_c,
     state_send_c,
@@ -43,7 +54,9 @@ architecture rtl of rs232_send is
   signal frame_s : frame_t;
   signal index_s : frame_t;
   
-  signal timer_s : std_logic;
+  signal sending_s : std_logic;
+  signal timer_s   : std_logic;
+  
   signal done_s  : std_logic;
 begin
   txb <= '0' when state_s = state_idle_c
@@ -105,4 +118,12 @@ begin
     end if;
   end process;
   
+  sending_s <= '1' when state_s = state_wait_c
+          else '0';
+  trigger : rs232_counter_e port map(
+    clock  => clk,
+    reset  => rst,
+    enable => sending_s,
+    
+    done   => timer_s);
 end rtl;