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

Subversion Repositories copyblaze

[/] [copyblaze/] [trunk/] [copyblaze/] [rtl/] [vhdl/] [ip/] [wb_uart/] [wb_uart_8.vhd] - Blame information for rev 59

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 41 ameziti
-----------------------------------------------------------------------------
2
-- Wishbone UART ------------------------------------------------------------
3
-- (c) 2007 Joerg Bornschein (jb@capsec.org)
4
--
5
-- All files under GPLv2 -- please contact me if you use this component
6
-----------------------------------------------------------------------------
7
library ieee;
8
use ieee.std_logic_1164.all;
9
use ieee.numeric_std.all;
10
 
11
-----------------------------------------------------------------------------
12
-- Wishbone UART ------------------------------------------------------------
13
entity wb_uart_8 is
14
        port (
15
                clk        : in  std_ulogic;
16
                reset      : in  std_ulogic;
17
                -- Wishbone slave
18
                wb_adr_i   : in  std_ulogic_vector( 7 downto 0);
19
                wb_dat_i   : in  std_ulogic_vector( 7 downto 0);
20
                wb_dat_o   : out std_ulogic_vector( 7 downto 0);
21
                wb_cyc_i   : in  std_ulogic;
22
                wb_stb_i   : in  std_ulogic;
23
                wb_ack_o   : out std_ulogic;
24
                wb_we_i    : in  std_ulogic;
25
                wb_rxirq_o : out std_ulogic;
26
                wb_txirq_o : out std_ulogic;
27
                -- Serial I/O ports
28
                uart_rx    : in  std_ulogic;
29
                uart_tx    : out std_ulogic
30
        );
31
end wb_uart_8;
32
 
33
-----------------------------------------------------------------------------
34
-- 0x00 Status Register
35
-- 0x04 Divisor Register
36
-- 0x08 RX / TX Data
37
--
38
-- Status Register:
39
-- 
40
--       +-------------+----------+----------+---------+---------+
41
--       |  ... 0 ...  | TX_IRQEN | RX_IRQEN | TX_BUSY | RX_FULL |
42
--       +-------------+----------+----------+---------+---------+
43
--
44
-- Divisor Register:
45
--   Example: 115200 Baud with clk beeing 50MHz:   50MHz/115200 = 434
46
--
47
-----------------------------------------------------------------------------
48
-- Implementation -----------------------------------------------------------
49
architecture rtl of wb_uart_8 is
50
 
51
-----------------------------------------------------------------------------
52
-- Components ---------------------------------------------------------------
53
component myuart is
54
        port (
55
                clk       : in  std_ulogic;
56
                reset     : in  std_ulogic;
57
                --
58
                divisor   : in  std_ulogic_vector(15 downto 0);
59
                txdata    : in  std_ulogic_vector( 7 downto 0);
60
                rxdata    : out std_ulogic_vector( 7 downto 0);
61
                wr        : in  std_ulogic;
62
                rd        : in  std_ulogic;
63
                tx_avail  : out std_ulogic;
64
                tx_busy   : out std_ulogic;
65
                rx_avail  : out std_ulogic;
66
                rx_full   : out std_ulogic;
67
                rx_error  : out std_ulogic;
68
                -- 
69
                uart_rxd  : in  std_ulogic;
70
                uart_txd  : out std_ulogic );
71
end component;
72
 
73
 
74
-----------------------------------------------------------------------------
75
-- Local Signals ------------------------------------------------------------
76
        constant        ADDR_STATUS             : std_ulogic_vector(7 downto 0) := x"00";
77
        constant        ADDR_DIV_LOW    : std_ulogic_vector(7 downto 0) := x"04";
78
        constant        ADDR_DIV_HIGH   : std_ulogic_vector(7 downto 0) := x"05";
79
        constant        ADDR_DATA               : std_ulogic_vector(7 downto 0) := x"08";
80
 
81
constant ZEROS  : std_ulogic_vector(31 downto 0) := (others => '0');
82
 
83
signal active     : std_ulogic;
84
signal activeLast : std_ulogic;
85
signal ack        : std_ulogic;
86
 
87
signal wr         : std_ulogic;
88
signal rd         : std_ulogic;
89
signal rx_avail   : std_ulogic;
90
signal tx_avail   : std_ulogic;
91
signal rxdata     : std_ulogic_vector(7 downto 0);
92
signal txdata     : std_ulogic_vector(7 downto 0);
93
 
94
signal status_reg : std_ulogic_vector( 7 downto 0);
95
signal data_reg   : std_ulogic_vector( 7 downto 0);
96
--signal div_reg    : std_ulogic_vector( 7 downto 0);
97
 
98
signal tx_irqen   : std_ulogic;
99
signal rx_irqen   : std_ulogic;
100
signal divisor    : std_ulogic_vector(15 downto 0);
101
 
102
begin
103
 
104
-- Instantiate actual UART engine
105
uart0: myuart
106
        port map (
107
                clk       => clk,
108
                reset     => reset,
109
        -- Sync Interface
110
                divisor   => divisor,
111
                txdata    => txdata,
112
                rxdata    => rxdata,
113
                wr        => wr,
114
                rd        => rd,
115
                tx_avail  => tx_avail,
116
                tx_busy   => open,
117
                rx_avail  => rx_avail,
118
                rx_full   => open,
119
                rx_error  => open,
120
                -- Async Interface
121
                uart_txd  => uart_tx,
122
                uart_rxd  => uart_rx );
123
 
124
 
125
-- Status & divisor register + Wishbine glue logic
126
status_reg <= ZEROS( 7 downto  4) & tx_irqen & rx_irqen & not tx_avail & rx_avail;
127
data_reg   <=                                           rxdata;
128
--div_reg    <= ZEROS(31 downto 16) & divisor;
129
 
130
-- Bus cycle?
131
active <= wb_stb_i and wb_cyc_i;
132
 
133
wb_dat_o <= status_reg                          when wb_we_i='0' and (active='1' or ack='1') and wb_adr_i=ADDR_STATUS else
134
            divisor( 7 downto 0)    when wb_we_i='0' and (active='1' or ack='1') and wb_adr_i=ADDR_DIV_LOW else
135
            divisor(15 downto 8)    when wb_we_i='0' and (active='1' or ack='1') and wb_adr_i=ADDR_DIV_HIGH else
136
            data_reg                            when wb_we_i='0' and (active='1' or ack='1') and wb_adr_i=ADDR_DATA else
137
            (others => '0');
138
 
139
rd <= '1' when (active='1' or ack='1') and wb_adr_i=ADDR_DATA and wb_we_i='0' else
140
      '0';
141
 
142
wr <= '1' when (active='1' or ack='1') and wb_adr_i=ADDR_DATA and wb_we_i='1' else
143
      '0';
144
 
145
txdata   <= wb_dat_i;
146
wb_ack_o <= ack;
147
 
148
-- Handle Wishbone write request (and reset condition)
149
proc: process(reset, clk) is
150
begin
151
        if clk'event and clk='1' then
152
                if reset='1' then
153
                        tx_irqen <= '0';
154
                        rx_irqen <= '0';
155
                        divisor  <= (others => '1');
156
                else
157
 
158
                if active='1' then
159
                        if      activeLast='0' then
160
                                activeLast <= '1';
161
                                ack        <= '0';
162
                        else
163
                                activeLast <= '0';
164
                                ack        <= '1';
165
                        end if;
166
                else
167
                        ack        <= '0';
168
                        activeLast <= '0';
169
                end if;
170
 
171
                if active='1' and wb_we_i='1' then
172
                        if wb_adr_i=ADDR_STATUS then     -- write to status register
173
                                tx_irqen <= wb_dat_i(3);
174
                                rx_irqen <= wb_dat_i(2);
175
                        elsif wb_adr_i=ADDR_DIV_LOW then  -- write to divisor register low
176
                                divisor( 7 downto 0)  <= wb_dat_i;
177
                        elsif wb_adr_i=ADDR_DIV_HIGH then  -- write to divisor register high
178
                                divisor(15 downto 8)  <= wb_dat_i;
179
                        end if;
180
                end if;
181
                end if;
182
        end if;
183
end process;
184
 
185
-- Generate interrupts when enabled
186
wb_rxirq_o <= rx_avail and rx_irqen;
187
wb_txirq_o <= tx_avail and tx_irqen;
188
 
189
end rtl;

powered by: WebSVN 2.1.0

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