OpenCores
URL https://opencores.org/ocsvn/rs232_with_buffer_and_wb/rs232_with_buffer_and_wb/trunk

Subversion Repositories rs232_with_buffer_and_wb

[/] [rs232_with_buffer_and_wb/] [trunk/] [rtl/] [uart_tx.vhd] - Blame information for rev 38

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 TobiasJ
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
 
6 9 TobiasJ
entity tx_func is
7 3 TobiasJ
        port(   clk, reset : in std_logic;
8
                        data : in std_logic_vector(7 downto 0);
9 9 TobiasJ
                        transmit_data : in std_logic;
10 3 TobiasJ
 
11
                        word_width : in std_logic_vector(3 downto 0);
12 5 TobiasJ
                        baud_period : in std_logic_vector(15 downto 0);
13 3 TobiasJ
                        use_parity_bit, parity_type : in std_logic;
14
                        stop_bits : in std_logic_vector(1 downto 0);
15
                        idle_line_lvl : in std_logic;
16
 
17
                        tx : out std_logic;
18
                        sending : out std_logic);
19 9 TobiasJ
end entity tx_func;
20 3 TobiasJ
 
21 5 TobiasJ
 
22 9 TobiasJ
architecture behaviour of tx_func is
23 5 TobiasJ
        type state_type is (idle, start_bit, data_bit0, data_bit1, data_bit2, data_bit3, data_bit4, data_bit5, data_bit6, data_bit7, parity_bit, stop_bit1, stop_bit2);
24 29 TobiasJ
        signal current_state : state_type;-- := idle;
25 9 TobiasJ
        signal next_state : state_type;
26 5 TobiasJ
 
27
        signal register_enable : std_logic;
28
 
29
        signal next_state_from_data_bit4        : state_type;
30
        signal next_state_from_data_bit5        : state_type;
31
        signal next_state_from_data_bit6        : state_type;
32
        signal next_state_from_data_bit7        : state_type;
33
        signal next_state_from_stop_bit1        : state_type;
34
 
35 29 TobiasJ
        signal baud_tick : std_logic;-- := '0';
36 9 TobiasJ
        signal baud_counter_d : std_logic_vector(15 downto 0);
37 29 TobiasJ
        signal baud_counter_q : std_logic_vector(15 downto 0);-- := (others => '0');
38 3 TobiasJ
 
39 5 TobiasJ
        signal cal_parity_bit : std_logic;
40
 
41 29 TobiasJ
        signal data_q : std_logic_vector(7 downto 0);-- := (others => '0');
42 5 TobiasJ
 
43 3 TobiasJ
begin
44 5 TobiasJ
-----------------------
45
--Combinational logic
46
-----------------------
47
        --Tilstands encoding
48
        with current_state select
49
                next_state <=   start_bit                                       when idle,
50
                                                data_bit0                                       when start_bit,
51
                                                data_bit1                                       when data_bit0,
52
                                                data_bit2                                       when data_bit1,
53
                                                data_bit3                                       when data_bit2,
54
                                                data_bit4                                       when data_bit3,
55
                                                next_state_from_data_bit4       when data_bit4,
56
                                                next_state_from_data_bit5       when data_bit5,
57
                                                next_state_from_data_bit6       when data_bit6,
58 9 TobiasJ
                                                next_state_from_data_bit7       when data_bit7,
59 13 TobiasJ
                                                stop_bit1                                       when parity_bit,
60 9 TobiasJ
                                                next_state_from_stop_bit1       when stop_bit1,
61 5 TobiasJ
                                                idle                                            when stop_bit2,
62
                                                idle                                            when others;
63 3 TobiasJ
 
64 5 TobiasJ
        next_state_from_data_bit4 <= parity_bit when word_width = "0101" and use_parity_bit = '1' else
65 9 TobiasJ
                                                                 stop_bit1      when word_width = "0101" and use_parity_bit = '0' else
66 5 TobiasJ
                                                                 data_bit5;
67 3 TobiasJ
 
68 5 TobiasJ
        next_state_from_data_bit5 <= parity_bit when word_width = "0110" and use_parity_bit = '1' else
69 9 TobiasJ
                                                                 stop_bit1      when word_width = "0110" and use_parity_bit = '0' else
70 5 TobiasJ
                                                                 data_bit6;
71 3 TobiasJ
 
72 5 TobiasJ
        next_state_from_data_bit6 <= parity_bit when word_width = "0111" and use_parity_bit = '1' else
73 9 TobiasJ
                                                                 stop_bit1      when word_width = "0111" and use_parity_bit = '0' else
74 5 TobiasJ
                                                                 data_bit7;
75
 
76
        next_state_from_data_bit7 <= parity_bit when use_parity_bit = '1' else
77
                                                                 stop_bit1;
78 3 TobiasJ
 
79 5 TobiasJ
        next_state_from_stop_bit1 <= stop_bit2  when stop_bits = "10" else
80
                                                                 idle;
81 3 TobiasJ
 
82 5 TobiasJ
        --Baud logic
83
        baud_tick <= '1' when baud_counter_q = baud_period else '0';
84 9 TobiasJ
        baud_counter_d <=       baud_counter_q + 1 when baud_tick = '0' and current_state /= idle else
85 5 TobiasJ
                                                "0000000000000001";
86 3 TobiasJ
 
87 5 TobiasJ
        --Parity_bit logic
88
        cal_parity_bit <= data_q(0) xor data_q(1) xor data_q(2) xor data_q(3) xor data_q(4) xor data_q(5) xor data_q(6) xor data_q(7) xor parity_type;
89 3 TobiasJ
 
90 5 TobiasJ
        --TX Line logic
91
        with current_state select
92 29 TobiasJ
                tx <=                   idle_line_lvl           when idle,
93 5 TobiasJ
                                                not idle_line_lvl       when start_bit,
94
                                                data_q(0)                        when data_bit0,
95
                                                data_q(1)                       when data_bit1,
96
                                                data_q(2)                       when data_bit2,
97
                                                data_q(3)                       when data_bit3,
98
                                                data_q(4)                       when data_bit4,
99
                                                data_q(5)                       when data_bit5,
100
                                                data_q(6)                       when data_bit6,
101
                                                data_q(7)                       when data_bit7,
102
                                                cal_parity_bit          when parity_bit,
103
                                                idle_line_lvl           when stop_bit1,
104
                                                idle_line_lvl           when stop_bit2,
105
                                                idle_line_lvl           when others;
106
 
107
        --Signal logic
108
        sending <= '0' when current_state = idle else '1';
109 3 TobiasJ
 
110 5 TobiasJ
------------------
111
--Register logic
112
------------------
113 13 TobiasJ
        register_enable <=      '1' when (transmit_data = '1' and current_state = idle) or baud_tick = '1' else
114
                                                '0';
115 3 TobiasJ
 
116 5 TobiasJ
        register_logic : process(clk, reset)
117 3 TobiasJ
        begin
118 5 TobiasJ
                if rising_edge(clk) then
119
                        --State Control
120 3 TobiasJ
                        if reset = '1' then
121
                                current_state <= idle;
122 5 TobiasJ
                        elsif register_enable = '1' then
123 3 TobiasJ
                                current_state <= next_state;
124
                        end if;
125
 
126 5 TobiasJ
                        --BAUD Counter Control
127 9 TobiasJ
                        if current_state /= idle or (current_state = idle and transmit_data = '1')then
128 5 TobiasJ
                                baud_counter_q <= baud_counter_d;
129 3 TobiasJ
                        end if;
130 5 TobiasJ
 
131
                        --DATA control
132 9 TobiasJ
                        if current_state = idle and transmit_data = '1' then
133 5 TobiasJ
                                data_q <= data;
134
                        end if;
135
 
136 3 TobiasJ
                end if;
137 5 TobiasJ
        end process;
138 3 TobiasJ
 
139
end architecture behaviour;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.