This is probably too simple.
authorMalte S. Stretz <mss@apache.org>
Wed, 15 Jul 2009 13:19:30 +0000 (15:19 +0200)
committerMalte S. Stretz <mss@apache.org>
Wed, 15 Jul 2009 13:19:30 +0000 (15:19 +0200)
fhw_rs232/rs232_send.vhd

index 258bdeb..9195e92 100644 (file)
@@ -35,15 +35,13 @@ entity rs232_send is
 architecture rtl of rs232_send is
   type state_t is (
     state_idle_c,
-    state_load_c,
     state_send_c,
-    state_wait_c,
-    state_loop_c);
+    state_wait_c);
   signal state_s : state_t;
   
-  subtype frame_t is std_logic_vector((data_width - 1 + 2 + 1) downto 0);
-  signal frame_s  : frame_t;
-  signal parity_s : std_logic;
+  subtype frame_t is std_logic_vector(data_width - 1 + 2 + 1 downto 0);
+  signal frame_s : frame_t;
+  signal index_s : frame_t;
   
   signal timer_s : std_logic;
   signal done_s  : std_logic;
@@ -51,12 +49,38 @@ begin
   txb <= '0' when state_s = state_idle_c
     else '1';
   
-  frame_s(frame_t'high) <= '0';
-  frame_s(frame_t'high - 1 downto frame_t'high - data_width) <= txd;
+  frame_s(frame_t'high) <= '1';
+  frame_s(frame_t'high - 1) <= '0';
+  frame_s(frame_t'high - 2 downto frame_t'high - 2 - (data_width - 1)) <= txd;
   frame_s(frame_t'low + 1) <= get_parity(txd, parity_type) when parity_enabled = '1'
                          else frame_s(frame_t'low);
   frame_s(frame_t'low) <= '1';
+  
+  done_s <= index_s(frame_t'low + 0) when parity_enabled = '1'
+       else index_s(frame_t'low + 1);
 
+  output : process(clk)
+    variable output_v : std_logic;
+  begin
+    output_v := '0';
+    for i in frame_t'high downto frame_t'low loop
+      output_v := output_v or (frame_s(i) and index_s(i));
+    end loop;
+    tx <= output_v;
+  
+    if rising_edge(clk) then
+      case state_s is
+        when state_idle_c =>
+          index_s(frame_t'high) <= '1';
+          index_s(frame_t'high - 1 downto frame_t'low) <= (others => '0');
+        when state_send_c =>
+          index_s <= '0' & index_s(frame_t'high downto frame_t'low + 1);
+        when others =>
+          null;
+      end case;
+    end if;
+  end process;
+  
   sequence : process(clk, rst)
   begin
     if rst = '1' then
@@ -65,21 +89,17 @@ begin
       case state_s is
         when state_idle_c =>
           if txn = '1' then
-            state_s <= state_load_c;
+            state_s <= state_send_c;
           end if;
-        when state_load_c =>
-          state_s <= state_send_c;
         when state_send_c =>
           state_s <= state_wait_c;
         when state_wait_c =>
           if timer_s = '1' then
-            state_s <= state_loop_c;
-          end if;
-        when state_loop_c =>
-          if done_s = '0' then
-            state_s <= state_send_c;
-          else
-            state_s <= state_idle_c;
+            if done_s = '1' then
+              state_s <= state_idle_c;
+            else
+              state_s <= state_send_c;
+            end if;
           end if;
       end case;
     end if;