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

Subversion Repositories signed_unsigned_multiplier_and_divider

[/] [signed_unsigned_multiplier_and_divider/] [trunk/] [uart-for-fpga-master/] [source/] [uart.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 zpekic
--------------------------------------------------------------------------------
2
-- PROJECT: SIMPLE UART FOR FPGA
3
--------------------------------------------------------------------------------
4
-- MODULE:  UART TOP MODULE
5
-- AUTHORS: Jakub Cabal <jakubcabal@gmail.com>
6
-- LICENSE: The MIT License (MIT), please read LICENSE file
7
-- WEBSITE: https://github.com/jakubcabal/uart_for_fpga
8
--------------------------------------------------------------------------------
9
 
10
library IEEE;
11
use IEEE.STD_LOGIC_1164.ALL;
12
use IEEE.NUMERIC_STD.ALL;
13
use IEEE.MATH_REAL.ALL;
14
 
15
-- UART FOR FPGA REQUIRES: 1 START BIT, 8 DATA BITS, 1 STOP BIT!!!
16
-- OTHER PARAMETERS CAN BE SET USING GENERICS.
17
 
18
entity UART is
19
    Generic (
20
        CLK_FREQ      : integer := 50e6;   -- system clock frequency in Hz
21
        BAUD_RATE     : integer := 115200; -- baud rate value
22
        PARITY_BIT    : string  := "none"; -- type of parity: "none", "even", "odd", "mark", "space"
23
        USE_DEBOUNCER : boolean := True    -- enable/disable debouncer
24
    );
25
    Port (
26
        CLK         : in  std_logic; -- system clock
27
        RST         : in  std_logic; -- high active synchronous reset
28
        -- UART INTERFACE
29
        UART_TXD    : out std_logic; -- serial transmit data
30
        UART_RXD    : in  std_logic; -- serial receive data
31
        -- USER DATA INPUT INTERFACE
32
        DATA_IN     : in  std_logic_vector(7 downto 0); -- input data
33
        DATA_SEND   : in  std_logic; -- when DATA_SEND = 1, input data are valid and will be transmit
34
        BUSY        : out std_logic; -- when BUSY = 1, transmitter is busy and you must not set DATA_SEND to 1
35
        -- USER DATA OUTPUT INTERFACE
36
        DATA_OUT    : out std_logic_vector(7 downto 0); -- output data
37
        DATA_VLD    : out std_logic; -- when DATA_VLD = 1, output data are valid
38
        FRAME_ERROR : out std_logic  -- when FRAME_ERROR = 1, stop bit was invalid
39
    );
40
end UART;
41
 
42
architecture FULL of UART is
43
 
44
    constant DIVIDER_VALUE    : integer := CLK_FREQ/(16*BAUD_RATE);
45
    constant CLK_CNT_WIDTH    : integer := integer(ceil(log2(real(DIVIDER_VALUE))));
46
    constant CLK_CNT_MAX      : unsigned := to_unsigned(DIVIDER_VALUE-1, CLK_CNT_WIDTH);
47
 
48
    signal uart_clk_cnt       : unsigned(CLK_CNT_WIDTH-1 downto 0);
49
    signal uart_clk_en        : std_logic;
50
    signal uart_rxd_shreg     : std_logic_vector(3 downto 0);
51
    signal uart_rxd_debounced : std_logic;
52
 
53
begin
54
 
55
    -- -------------------------------------------------------------------------
56
    -- UART CLOCK COUNTER AND CLOCK ENABLE FLAG
57
    -- -------------------------------------------------------------------------
58
 
59
    uart_clk_cnt_p : process (CLK)
60
    begin
61
        if (rising_edge(CLK)) then
62
            if (RST = '1') then
63
                uart_clk_cnt <= (others => '0');
64
            else
65
                if (uart_clk_cnt = CLK_CNT_MAX) then
66
                    uart_clk_cnt <= (others => '0');
67
                else
68
                    uart_clk_cnt <= uart_clk_cnt + 1;
69
                end if;
70
            end if;
71
        end if;
72
    end process;
73
 
74
    uart_clk_en_reg_p : process (CLK)
75
    begin
76
        if (rising_edge(CLK)) then
77
            if (RST = '1') then
78
                uart_clk_en <= '0';
79
            elsif (uart_clk_cnt = CLK_CNT_MAX) then
80
                uart_clk_en <= '1';
81
            else
82
                uart_clk_en <= '0';
83
            end if;
84
        end if;
85
    end process;
86
 
87
    -- -------------------------------------------------------------------------
88
    -- UART RXD SHIFT REGISTER AND DEBAUNCER
89
    -- -------------------------------------------------------------------------
90
 
91
    use_debouncer_g : if (USE_DEBOUNCER = True) generate
92
        uart_rxd_shreg_p : process (CLK)
93
        begin
94
            if (rising_edge(CLK)) then
95
                if (RST = '1') then
96
                    uart_rxd_shreg <= (others => '1');
97
                else
98
                    uart_rxd_shreg <= UART_RXD & uart_rxd_shreg(3 downto 1);
99
                end if;
100
            end if;
101
        end process;
102
 
103
        uart_rxd_debounced_reg_p : process (CLK)
104
        begin
105
            if (rising_edge(CLK)) then
106
                if (RST = '1') then
107
                    uart_rxd_debounced <= '1';
108
                else
109
                    uart_rxd_debounced <= uart_rxd_shreg(0) OR
110
                                          uart_rxd_shreg(1) OR
111
                                          uart_rxd_shreg(2) OR
112
                                          uart_rxd_shreg(3);
113
                end if;
114
            end if;
115
        end process;
116
    end generate;
117
 
118
    not_use_debouncer_g : if (USE_DEBOUNCER = False) generate
119
        uart_rxd_debounced <= UART_RXD;
120
    end generate;
121
 
122
    -- -------------------------------------------------------------------------
123
    -- UART TRANSMITTER
124
    -- -------------------------------------------------------------------------
125
 
126
    uart_tx_i: entity work.UART_TX
127
    generic map (
128
        PARITY_BIT  => PARITY_BIT
129
    )
130
    port map (
131
        CLK         => CLK,
132
        RST         => RST,
133
        -- UART INTERFACE
134
        UART_CLK_EN => uart_clk_en,
135
        UART_TXD    => UART_TXD,
136
        -- USER DATA INPUT INTERFACE
137
        DATA_IN     => DATA_IN,
138
        DATA_SEND   => DATA_SEND,
139
        BUSY        => BUSY
140
    );
141
 
142
    -- -------------------------------------------------------------------------
143
    -- UART RECEIVER
144
    -- -------------------------------------------------------------------------
145
 
146
    uart_rx_i: entity work.UART_RX
147
    generic map (
148
        PARITY_BIT  => PARITY_BIT
149
    )
150
    port map (
151
        CLK         => CLK,
152
        RST         => RST,
153
        -- UART INTERFACE
154
        UART_CLK_EN => uart_clk_en,
155
        UART_RXD    => uart_rxd_debounced,
156
        -- USER DATA OUTPUT INTERFACE
157
        DATA_OUT    => DATA_OUT,
158
        DATA_VLD    => DATA_VLD,
159
        FRAME_ERROR => FRAME_ERROR
160
    );
161
 
162
end FULL;

powered by: WebSVN 2.1.0

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