2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
8 CLK_FREQ : integer := 33000000;
9 BAUDRATE : integer := 115200
12 sys_clk : in std_logic;
13 sys_res_n : in std_logic;
15 tx_data : in std_logic_vector(7 downto 0);
16 tx_new : in std_logic;
17 tx_done : out std_logic
21 architecture beh of uart_tx is
22 constant BAUD : integer := CLK_FREQ/BAUDRATE;
24 type STATE_UART_TX is (IDLE, SENDBITS, DONE);
25 signal state_int, state_next : STATE_UART_TX;
27 signal txd_next, txd_int : std_logic;
28 signal tx_done_next, tx_done_int : std_logic;
29 signal tx_to_send : std_logic_vector(10 downto 0);
30 signal bitcnt_int, bitcnt_next : integer range 0 to 11;
31 signal baudcnt_int, baudcnt_next : integer range 0 to BAUD;
34 tx_done <= tx_done_int;
36 process (sys_clk, sys_res_n)
38 if sys_res_n = '0' then
44 tx_to_send <= (others => '0');
45 elsif rising_edge(sys_clk) then
46 state_int <= state_next;
48 tx_done_int <= tx_done_next;
49 bitcnt_int <= bitcnt_next;
50 baudcnt_int <= baudcnt_next;
51 -- STOPBIT (1) | DATA (8) | STARTBIT (1) | HIGHBIT (1)
52 tx_to_send <= '1' & tx_data & '0' & '1';
56 process(tx_new, tx_to_send, state_int, bitcnt_int, baudcnt_int,
59 state_next <= state_int;
60 tx_done_next <= tx_done_int;
62 bitcnt_next <= bitcnt_int;
63 baudcnt_next <= baudcnt_int;
70 -- das highbyte sofort anlegen
73 state_next <= SENDBITS;
76 if bitcnt_int <= 10 then
77 if baudcnt_int < BAUD then
78 baudcnt_next <= baudcnt_int + 1;
80 txd_next <= tx_to_send(bitcnt_int);
81 bitcnt_next <= bitcnt_int + 1;
85 -- fuer das stopbit auch noch warten
86 if baudcnt_int < BAUD then
87 baudcnt_next <= baudcnt_int + 1;