Remove the parity process.
[bos2k9.git] / fhw_rs232 / rs232_send.vhd
1 -----------------------------------------------------------------------
2 -- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
3 --
4 -- TODO
5 -- 
6 -----------------------------------------------------------------------
7 -- This entity is part of the following library:
8 -- pragma library fhw_rs232
9 library fhw_rs232;
10 use fhw_rs232.rs232_globals_p.all;
11
12 library ieee;
13 use ieee.std_logic_1164.all;
14 use ieee.numeric_std.all;
15
16 entity rs232_send is
17   generic(
18     clock_interval : time;
19     clock_divider  : positive; -- TODO: calculate this based on clock_interval
20     data_width     : positive := 8;
21     parity_enabled : std_logic := '0';
22     parity_type    : std_logic := '0');
23   port(
24     clk : in  std_logic;
25     rst : in  std_logic;
26     
27     tx  : out std_logic;
28     txd : in  std_logic_vector(data_width - 1 downto 0);
29     txn : in  std_logic;
30     txb : out std_logic);
31  end rs232_send;
32  
33 -----------------------------------------------------------------------
34
35 architecture rtl of rs232_send is
36   type state_t is (
37     state_idle_c,
38     state_load_c,
39     state_send_c,
40     state_wait_c,
41     state_loop_c);
42   signal state_s : state_t;
43   
44   subtype frame_t is std_logic_vector((data_width - 1 + 2 + 1) downto 0);
45   signal frame_s  : frame_t;
46   signal parity_s : std_logic;
47   
48   signal timer_s : std_logic;
49   signal done_s  : std_logic;
50 begin
51   txb <= '0' when state_s = state_idle_c
52     else '1';
53   
54   frame_s(frame_t'high) <= '0';
55   frame_s(frame_t'high - 1 downto frame_t'high - data_width) <= txd;
56   frame_s(frame_t'low + 1) <= get_parity(txd, parity_type) when parity_enabled = '1'
57                          else frame_s(frame_t'low);
58   frame_s(frame_t'low) <= '1';
59
60   sequence : process(clk, rst)
61   begin
62     if rst = '1' then
63       state_s <= state_idle_c;
64     elsif rising_edge(clk) then
65       case state_s is
66         when state_idle_c =>
67           if txn = '1' then
68             state_s <= state_load_c;
69           end if;
70         when state_load_c =>
71           state_s <= state_send_c;
72         when state_send_c =>
73           state_s <= state_wait_c;
74         when state_wait_c =>
75           if timer_s = '1' then
76             state_s <= state_loop_c;
77           end if;
78         when state_loop_c =>
79           if done_s = '0' then
80             state_s <= state_send_c;
81           else
82             state_s <= state_idle_c;
83           end if;
84       end case;
85     end if;
86   end process;
87   
88 end rtl;