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

Subversion Repositories uart_fpga_slow_control_migrated

[/] [uart_fpga_slow_control/] [trunk/] [code/] [ab_uart_16550_wrapper.vhd] - Blame information for rev 15

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 aborga
-------------------------------------------------------------------------------
2
--                                                                           --
3
--                                                                           --
4
--                                                                           --
5
--                                                                           --
6
-------------------------------------------------------------------------------
7
--
8
-- unit name: UART_16550_wrapper
9
--
10
-- author:      Andrea Borga (andrea.borga@nikhef.it)
11 15 aborga
--              Mauro Predonzani (predmauro@libero.it)
12 3 aborga
--
13
-- date: $26/01/2009    $: created
14
--
15
-- version: $Rev 0      $:
16
--
17
-- description: <file content, behaviour, purpose, special usage notes...>
18
-- <further description>
19
--
20
-- dependencies:        gh_uart_16550
21
--                                                              register_rx_handler
22
--                                                              register_tx_handler
23
--                                                              uart_lbus_slave
24
--                                                              
25
--                                                              
26
--
27
-- references: <reference one>
28
-- <reference two> ...
29
--
30
-- modified by: $Author:: $:
31
--
32
-------------------------------------------------------------------------------
33
-- changes: 2010-05-06 Mauro Predonzani
34
--                     set ECHO MODE on/off                 
35
--          2010-06-09 Mauro Predonzani
36
--                     enable/disable TX address byte       
37
--          2011-08-18 Andrea Borga
38
--                     added soft FIFO reset release after init
39
--          2011-08-18 Andrea Borga
40
--                     renamed entity to a more generic UART_16550_wrapper
41
--                     (instead of Lantronix_wrapper)
42
-- <extended description>
43
-------------------------------------------------------------------------------
44
-- TODO:
45
--
46
--
47
--
48
-------------------------------------------------------------------------------
49
 
50
--=============================================================================
51
-- Libraries
52
--=============================================================================
53
 
54
library IEEE;
55
use IEEE.STD_LOGIC_1164.ALL;
56
use IEEE.STD_LOGIC_ARITH.ALL;
57
use IEEE.STD_LOGIC_UNSIGNED.ALL;
58
 
59
---- Uncomment the following library declaration if instantiating
60
---- any Xilinx primitives in this code.
61
--library UNISIM;
62
--use UNISIM.VComponents.all;
63
 
64
 
65
--=============================================================================
66
-- Entity declaration for ada_uart_16550_wrapper
67
--=============================================================================
68
 
69
entity uart_16550_wrapper is
70
  port(
71
  -- general purpose
72
  sys_clk_i          : in std_logic;  -- system clock
73
  sys_rst_i          : in std_logic;  -- system reset
74
  -- TX/RX process command line
75
  echo_en_i          : in std_logic;  -- Echo enable (byte by byte) enable/disable = 1/0
76
  tx_addr_wwo_i      : in std_logic;  -- control of TX process With or WithOut address W/WO=(1/0)
77
  -- serial I/O side
78
  lantronix_output_i : in std_logic;                    -- Lantronix Serial data OUTPUT signal
79
  lantronix_input_o  : out std_logic;           -- Lantronix Serial data INPUT signal
80
  cp_b               : inout std_logic_vector(2 downto 0);  -- general purpose IO pins
81
  -- parallel I/O side
82
  s_br_clk_uart_o    : out std_logic;           -- br_clk clock probe signal
83
  -- RX part/control
84
  v_rx_add_o         : out std_logic_vector(15 downto 0);        -- 16 bits full addr ram input
85
  v_rx_data_o        : out std_logic_vector(31 downto 0);        -- 32 bits full data ram input
86
  s_rx_rdy_o         : out std_logic;                   -- add/data ready to be write into RAM
87
  s_rx_stb_read_data_i  : in std_logic;                 -- strobe signal from RAM ... 
88
  -- TX part/control
89
  s_tx_proc_rqst_i   : in std_logic;                            -- stream TX process request 1/0 tx enable/disable
90
  v_tx_add_ram_i     : in std_logic_vector(15 downto 0);         -- 16 bits full addr ram output
91
  v_tx_data_ram_i       : in std_logic_vector(31 downto 0);              -- 32 bits full data ram output
92
  s_tx_ram_data_rdy_i   : in std_logic;                         -- ram output data ready and stable
93
  s_tx_stb_ram_data_acq_o       : out std_logic         -- strobe ram data/address output acquired 1/0 acquired/not acquired
94
                );
95
end entity;
96
 
97
--=============================================================================
98
-- architecture declaration
99
--=============================================================================
100
 
101
architecture a of uart_16550_wrapper is
102
 
103
  -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
104
  -- Components declaration 
105
  -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
106
 
107
  component gh_uart_16550 is
108
    port(
109
      clk     : in std_logic; -- UART clock (toward logic)
110
      BR_clk  : in std_logic; -- Baudrate generator clock TX and RX 
111
      rst     : in std_logic; -- Reset
112
      rst_buffer : in std_logic; -- Reset for FIFO and TX and RX
113
      CS      : in std_logic; -- Chip select -> 1 Cycle long CS strobe = 1 data transaction (w/r)
114
      WR      : in std_logic; -- WRITE when HIGH with CS high | READ when LOW with CS high 
115
      ADD     : in std_logic_vector(2 downto 0); -- ADDRESS BUS
116
      D       : in std_logic_vector(7 downto 0); -- Input DATA BUS and CONTROL BUS
117
 
118
      sRX     : in std_logic; -- Lantronix's OUTPUT
119
      CTSn    : in std_logic := '1';
120
      DSRn    : in std_logic := '1';
121
      RIn     : in std_logic := '1';
122
      DCDn    : in std_logic := '1';
123
 
124
      sTX     : out std_logic; -- Lantronix's INPUT
125
      DTRn    : out std_logic;
126
      RTSn    : out std_logic;
127
      OUT1n   : out std_logic;
128
      OUT2n   : out std_logic;
129
      TXRDYn  : out std_logic; -- Tx FIFO not Full      
130
      RXRDYn  : out std_logic; -- Rx FIFO Data Ready
131
 
132
      IRQ     : out std_logic;
133
      B_CLK   : out std_logic; -- 16x Baudrate clock output
134
      RD      : out std_logic_vector(7 downto 0) -- Output DATA BUS
135
      );
136
  end component;
137
 
138
  component uart_lbus is
139
  generic (
140
    c_bus_width   : natural := 8
141
    );
142
  port (
143
    lbus_clk            : in    std_logic;  -- local bus clock
144
    lbus_rst            : in    std_logic;  -- local bus reset
145
    lbus_rst_buffer     : out   std_logic; -- Reset for FIFO and TX and RX
146
    lbus_txrdy_n        : in    std_logic;  -- Tx data ready
147
    lbus_rxrdy_n        : in    std_logic;  -- Rx data ready
148
    lbus_cs             : out   std_logic;  -- Chip Select
149
    lbus_wr             : out   std_logic;  -- Write/Read (1/0)
150
    lbus_init           : out   std_logic;  -- Initialization process flag
151
    lbus_add            : out   std_logic_vector(2 downto 0);  -- local bus address
152
    lbus_data           : out   std_logic_vector(c_bus_width-1 downto 0);  -- local bus data  
153
    s_tx_proc_rqst_i    : in    std_logic;      -- tx process request from RAM
154
    v_lbus_state        : out   std_logic_vector(2 downto 0);    -- flag indicator of lbus_state
155
    s_cs_rd_c           : out   std_logic;      -- CS signal from caused by read cycle
156
    s_wr_rd_c           : out   std_logic;      -- WR signal from caused by read cycle
157
    s_new_byte_rdy      : in    std_logic;      -- new byte(8bit)ready and stable to be transmitted
158
    s_data_tx           : in    std_logic;      -- 6 bytes will be trasmitted
159
    reghnd_rd_rdy       : in    std_logic;      -- 6 byte RX ready but not yet written in RAM (1/0=>data ready/not ready)
160
    echo_en_i           : in    std_logic       -- echo enable command enable/disable = 1/0
161
                );
162
  end component;
163
 
164
  component register_rx_handler
165
    port(
166
      reghnd_clk        : in std_logic;         -- system clock
167
      reghnd_rst        : in std_logic;         -- system reset
168
      reghnd_data_in    : in std_logic_vector(7 downto 0);               -- 8 bits fragments 
169
      reghnd_data_cs_rd : in std_logic;   -- cs strobe of gh16550 during a read process
170
      reghnd_data_wr_rd : in std_logic;   -- wr state of gh16550 during a read process
171
      reghnd_rd_rdy     : out std_logic;                        -- Read data ready
172
      reghnd_full_add   : out std_logic_vector(15 downto 0);             -- 16 bits RAM address 
173
      reghnd_full_data  : out std_logic_vector(31 downto 0);     -- 32 bits RAM data
174
      reghnd_full_cs    : in std_logic          -- strobe data/address acquired (1 acquired - 0 not acquired)
175
      );
176
  end component;
177
 
178
  component register_tx_handler
179
  port(
180
    reghnd_clk                  : in std_logic;         -- system clock
181
    reghnd_rst                  : in std_logic;         -- system reset
182
    reghnd_addr_wwo_i           : in std_logic;         -- control of TX process With or WithOut address W/WO=(1/0)
183
    reghnd_full_data_ram_i      : in std_logic_vector(31 downto 0);      -- 32 bits full data
184
    reghnd_full_add_ram_i       : in std_logic_vector(15 downto 0);      -- 16 bits full addr
185
    reghnd_stb_data_ram_rdy_i   : in std_logic;         -- strobe ram data ready
186
    reghnd_data_acq_gh16550_i   : in std_logic;         -- data acquired from gh16550
187
    reghnd_wr_enable_i          : in std_logic;         -- enable the tx process
188
    reghnd_txrdy_n_gh16550_i    : in std_logic;         -- gh16550 ready to trasmit
189
    reghnd_wr_enable_o          : out std_logic;        -- enable the tx process
190
    reghnd_output_rdy_o         : out std_logic;        -- Read data ready
191
    reghnd_pdata_o              : out std_logic_vector(7 downto 0);      -- 8 bits parallel
192
    reghnd_stb_acq_ram_o        : out std_logic         -- strobe data/address acquired (1 acquired - 0 not acquired)
193
    );
194
  end component;
195
 
196
  --
197
  -- Internal signal declaration 
198
  --
199
 
200
  signal s_rst                  : std_logic;   -- global reset
201
  signal s_rst_buffer           : std_logic;   -- soft reset for FIFO and TX and RX uart FSM
202
  signal s_clk                  : std_logic;   -- uart to parallel interface clock
203
  signal s_clk_n                : std_logic;   -- uart to parallel interface clock
204
  signal s_br_clk               : std_logic;   -- uart serializer clock
205
  signal s_open                 : std_logic_vector(32 downto 0) := (others => '0');   -- unused pins
206
 
207
  signal s_cs                   : std_logic;                    -- chip select (data strobe)
208
  signal s_wr                   : std_logic;                    -- read/write on data bus
209
  signal lbus_init              : std_logic;                    -- register initialization
210
  signal lbus_add               : std_logic_vector(2 downto 0); -- local bus arbiter address bus
211
  signal lbus_data              : std_logic_vector(7 downto 0); -- local bus arbiter data bus
212
 
213
  signal uart_txrdy_n           : std_logic;                    -- tx FIFO Data Ready
214
  signal uart_rxrdy_n           : std_logic;                    -- rx FIFO Data Ready
215
  signal uart_add_bus           : std_logic_vector(2 downto 0); -- address bus
216
  signal uart_data_bus          : std_logic_vector(7 downto 0); -- data bus
217
  signal uart_rd                : std_logic_vector(7 downto 0); -- UART Rx output data bus
218
  signal v_write_bus_latch      : std_logic_vector(7 downto 0); -- WRITE data bus latched
219
  signal v_read_bus_latch       : std_logic_vector(7 downto 0); -- READ data bus latched
220
 
221
  --------------------------------------------------------------------------------------------------
222
  -- v_lcr structure:
223
  --
224
  --    0-1     : number of bits
225
  --                    00 -> 5 | 01 -> 6 | 10 -> 7 | 11 -> 8
226
  --    2       : number of stop bits
227
  --                    0 -> 1bit | 1 -> 2bits
228
  --    3       : parity bit
229
  --                    0 -> no party | 1 -> parity
230
  --    4       : parity type
231
  --                    0 -> odd | 1 -> even
232
  --    5       : sticky parity (NOT IMPLEMENTED)
233
  --    6       : set break
234
  --                    0 -> normal operation
235
  --                    1 -> serial output is forced to logic 0
236
  --                         (Spacing State, which will cause a Break interrupt in the receiver)
237
  --    7       : Divisor Latch (baud rate generator) Access bit
238
  --                    0 -> set Baud rate divisor
239
  --                    1 -> access FIFO registers
240
  --   
241
  --------------------------------------------------------------------------------------------------
242
 
243
  signal v_lcr          : std_logic_vector(7 downto 0); -- Line Control Register
244
 
245
  --------------------------------------------------------------------------------------------------
246
  -- v_fcr structure:
247
  --
248
  --    0       : FIFO enable 
249
  --                    X -> FIFOs are always enabled
250
  --    1       : RECEIVER FIFO reset active HIGH
251
  --    2       : TRANSMITTER FIFO reset active HIGH
252
  --    3       : DMA mode
253
  --                    0 -> Mode 0 (Supports single transfer DMA)
254
  --                    1 -> Mode 1 (Supports multiple transfers)
255
  --    4-5     : Reserved bits
256
  --    6-7     : Receiver FIFO trigger level
257
  --                    00 -> 1 | 01 -> 4 | 10 -> 8 | 11 -> 14 Bytes
258
  --   
259
  --------------------------------------------------------------------------------------------------
260
 
261
  signal v_fcr          : std_logic_vector(7 downto 0); -- FIFO Control Register
262
 
263
  --------------------------------------------------------------------------------------------------
264
  -- v_lsr structure:
265
  -- 
266
  --    0       : Data Ready 
267
  --                    0 -> Receive FIFO is empty
268
  --                    1 -> at lest one character is in the receive FIFO
269
  --    1       : Overrun Error
270
  --                    0 -> no error
271
  --                    1 -> Receive FIFO was full, additional character received but was lost
272
  --    2       : Parity Error
273
  --                    0 -> no error
274
  --                    1 -> top character in FIFO received with parity error
275
  --                            -> Receiver Line Status Interrupt
276
  --    3       : Framing Error
277
  --                    0 -> no error
278
  --                    1 -> top character in FIFO received without a valid stop bit
279
  --                            -> Receiver Line Status Interrupt
280
  --    4       : Break Interrupt
281
  --                    0 -> No Interrupt
282
  --                    1 -> break condition (uart_srx -> '0' for a character period)
283
  --                            -> Receiver Line Status Interrupt
284
  --    5       : Transmitter Holding Register
285
  --                    0 -> Transmitter FIFO not Empty
286
  --                    1 -> Transmitter FIFO Empty if enabled
287
  --                            -> Transmitter Holding Empty Interrupt
288
  --    6       : Transmitter Empty
289
  --                    0 -> not 1
290
  --                    1 -> Transmitter FIFO and Transmitter Shift Register Empty.
291
  --    7       : Error in receive FIFO
292
  --                    0 -> not 1
293
  --                    1 -> at least one error (parity, framing or break) in receive FIFO.
294
  --                            -> cleared upon reading the register
295
  --
296
  --------------------------------------------------------------------------------------------------
297
 
298
  signal v_lsr          : std_logic_vector(7 downto 0); -- Line Status Register
299
 
300
  --------------------------------------------------------------------------------------------------
301
  -- v_iir structure:
302
  --
303
  --    0       : Interrupt pending 
304
  --                    0 -> Interrupt pending
305
  --                    1 -> No Interrupt pending
306
  --    3-1     : 
307
  --                    010 -> Receiver Data Available ( Rx FIFO trigger level reached)
308
  --
309
  --------------------------------------------------------------------------------------------------
310
 
311
  signal v_iir          : std_logic_vector(7 downto 0); -- Interrupt Identification Register
312
 
313
  --------------------------------------------------------------------------------------------------
314
  -- Baud Rate Generator:
315
  --    Baud rate division ratio = (s_br_clk /(baudrate x 16))
316
  --
317
  --    Baud rate division ratio (16 bits) = c_divisor_msb (8 bits) + c_divisor_lsb (8 bits)
318
  --
319
  -- Set useing:  LCR bit 7 -> 1
320
  --------------------------------------------------------------------------------------------------
321
 
322
--  signal c_divisor_lsb  : std_logic_vector(7 downto 0); -- Divisor Latch LSB (Baud Rate Generator)
323
--  signal c_divisor_msb  : std_logic_vector(7 downto 0); -- Divisor Latch MSB (Baud Rate Generator)
324
 
325
  signal v_unused_write                 : std_logic_vector(7 downto 0); -- Unused registers
326
  signal v_unused_read                  : std_logic_vector(7 downto 0); -- Unused registers
327
 
328
        signal v_lbus_state                             : std_logic_vector(2 downto 0);
329
        signal s_reading_proc                   : std_logic;
330
        signal s_cs_rd_c                                        : std_logic;
331
        signal s_wr_rd_c                                        :       std_logic;
332
        signal s_writing_proc                   : std_logic;
333
        signal v_data8_ram                              : std_logic_vector (7 downto 0);
334
        signal s_data8_ram_rdy          : std_logic;
335
        signal s_wr_enable_o                    : std_logic;
336
        signal s_not_ready                              : std_logic;
337
 
338
--=============================================================================
339
-- architecture begin
340
--=============================================================================
341
 
342
begin
343
 
344
  s_clk                 <= sys_clk_i;    -- 14,xxx MHz main clock single ended buffer and division by one
345
                        -- and 1 Mbit/s with Lantronix
346
  s_clk_n               <=  not s_clk;
347
  s_rst                 <= sys_rst_i;
348
  s_br_clk              <= s_clk;
349
 
350
        s_reading_proc <= v_lbus_state(1);
351
        s_writing_proc <= v_lbus_state(2);
352
 
353
        s_rx_rdy_o <= s_not_ready;
354
 
355
  --**************************************************************************
356
  -- UART read/write bus access
357
  -- 
358
  --**************************************************************************
359
  -- read: 
360
  -- write:
361
  -- r/w:
362
 
363
  p_uart_RW_bus : process(s_rst, s_clk)
364
  begin
365
    if s_rst = '1' then
366
      uart_data_bus     <= (others => '0');
367
      uart_add_bus      <= (others => '0');
368
      v_unused_write    <= (others => '0');
369
      v_unused_read     <= (others => '0');
370
      v_fcr             <= (others => '0');
371
      v_lcr             <= (others => '0');
372
      v_lsr             <= (others => '0');
373
    elsif Rising_edge(s_clk) then
374
      uart_add_bus          <= lbus_add;
375
      case v_lbus_state is
376
        when "001" =>           -- init
377
          case uart_add_bus (2 downto 0) is
378
            when O"0"         => uart_data_bus           <= lbus_data;         -- init Divisor latch lsb
379
            when O"1"         => uart_data_bus           <= lbus_data;         -- init Divisor latch msb
380
            when O"2"         => uart_data_bus           <= lbus_data;
381
                                 v_fcr                   <= lbus_data;         -- FIFO Control Register
382
            when O"3"         => uart_data_bus           <= lbus_data;
383
                                 v_lcr                   <= lbus_data;         -- Line Control Register
384
            when others => null;
385
          end case;
386
        when "100" =>        -- write           
387
          case uart_add_bus (2 downto 0) is
388
            when O"0"         => uart_data_bus           <= v_write_bus_latch; -- write TRANSMITTER FIFO
389
            when O"1"         => uart_data_bus           <= lbus_data;         -- Interrupt Enable Register
390
            when O"2"         => uart_data_bus           <= lbus_data;
391
                                 v_fcr                   <= lbus_data;         -- FIFO Control Register
392
            when O"3"         => uart_data_bus           <= lbus_data;
393
                                 v_lcr                   <= lbus_data;         -- Line Control Register
394
            when O"4"         => uart_data_bus           <= v_unused_write;    -- Modem Control Register
395
            when O"7"         => uart_data_bus           <= v_unused_write;    -- Scretch Register
396
            when others       => null;
397
          end case;
398
        when "010" =>        -- read
399
          case uart_add_bus (2 downto 0) is
400
            when O"0"         => uart_data_bus          <= v_read_bus_latch; --uart_rd;        -- read RECEIVER FIFO
401
            when O"1"         => v_unused_read          <= uart_data_bus;  -- Interrupt Enable Register
402
            when O"2"         => v_iir                  <= uart_data_bus;  -- Interrupt Identification Register
403
            when O"3"         => v_unused_read          <= uart_data_bus;  -- Line Control Register
404
            when O"4"         => v_unused_read          <= uart_data_bus;  -- Modem Control Register
405
            when O"5"         => v_lsr                  <= uart_data_bus;  -- Line Status Register
406
            when O"6"         => v_unused_read          <= uart_data_bus;  -- Modem Status Register
407
            when O"7"         => v_unused_read          <= uart_data_bus;  -- Scratch Register
408
            when others       => null;
409
          end case;
410
        when others =>        -- idle 
411
          case uart_add_bus (2 downto 0) is
412
            when O"0"         => uart_data_bus          <= (others => '0');  --uart_rd;        -- read RECEIVER FIFO
413
            when O"1"         => v_unused_read          <= uart_data_bus;  -- Interrupt Enable Register
414
            when O"2"         => v_iir                  <= uart_data_bus;  -- Interrupt Identification Register
415
            when O"3"         => v_unused_read          <= uart_data_bus;  -- Line Control Register
416
            when O"4"         => v_unused_read          <= uart_data_bus;  -- Modem Control Register
417
            when O"5"         => v_lsr                  <= uart_data_bus;  -- Line Status Register
418
            when O"6"         => v_unused_read          <= uart_data_bus;  -- Modem Status Register
419
            when O"7"         => v_unused_read          <= uart_data_bus;  -- Scratch Register
420
            when others       => null;
421
          end case;
422
      end case;
423
    end if;
424
  end process p_uart_RW_bus;
425
 
426
  --**************************************************************************
427
  -- UART register latch update
428
  --**************************************************************************
429
  -- read: 
430
  -- write:
431
  -- r/w:
432
 
433
  p_uart_read_latch : process(s_rst, s_reading_proc)
434
  begin
435
    if s_rst = '1' then
436
      v_read_bus_latch          <= (others => '0');
437
                elsif rising_edge (s_reading_proc) then
438
      if s_cs = '0' and s_wr = '0' then
439
        v_read_bus_latch        <= uart_rd;
440
      end if;
441
                end if;
442
  end process p_uart_read_latch;
443
 
444
  p_uart_write_latch : process(s_rst, s_data8_ram_rdy)
445
  begin
446
    if s_rst = '1' then
447
      v_write_bus_latch          <= (others => '0');
448
    elsif rising_edge (s_data8_ram_rdy) then
449
      if s_cs = '0' and s_wr = '1'then
450
        v_write_bus_latch       <= v_data8_ram;
451
      end if;
452
    end if;
453
  end process p_uart_write_latch;
454
 
455
--  p_uart_read_latch : process(s_rst, s_clk_n)
456
--  begin
457
--    if s_rst = '1' then
458
--      v_read_bus_latch          <= (others => '0');
459
--    elsif rising_edge (s_clk_n) then
460
--      if s_reading_proc = '1' and s_cs = '0' and s_wr = '0' then
461
--        v_read_bus_latch        <= uart_rd;
462
--      else
463
--        v_read_bus_latch        <= uart_rd;
464
--      end if;
465
--              end if;
466
--  end process p_uart_read_latch;
467
 
468
--  p_uart_write_latch : process(s_rst, s_clk_n)
469
--  begin
470
--    if s_rst = '1' then
471
--      v_write_bus_latch          <= (others => '0');
472
--    elsif rising_edge (s_clk_n) then
473
--      if s_data8_ram_rdy = '1' and s_cs = '0' and s_wr = '1' then
474
--        v_write_bus_latch     <= v_data8_ram;
475
--      else
476
--        v_write_bus_latch          <= (others => '0');    
477
--      end if;
478
--    end if;
479
--  end process p_uart_write_latch;
480
 
481
  -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
482
  -- Components mapping
483
  -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
484
 
485
  cmp_uart : gh_uart_16550
486
    port map (
487
      clk       => s_clk,                       -- uart clock
488
      BR_clk    => s_br_clk,    -- Baudrate generator clock TX and RX 
489
      rst       => s_rst,                       -- Reset
490
      rst_buffer => s_rst_buffer,       -- soft fifo release reset after init
491
      CS        => s_cs, -- Chip select -> 1 Cycle long CS strobe = 1 data transaction (w/r)
492
      WR        => s_wr, -- WRITE when HIGH with CS high | READ when LOW with CS high
493
      ADD       => uart_add_bus,        -- ADDRESS BUS
494
      D         => uart_data_bus,       -- Input DATA BUS and CONTROL BUS
495
      sRX       => lantronix_output_i,           -- Lantronix's OUTPUT
496
      CTSn      => '1',                    -- not used 
497
      DSRn      => '1',                    -- not used
498
      RIn       => '1',                    -- not used
499
      DCDn      => '1',                    -- not used
500
 
501
      sTX       => lantronix_input_o,            -- Lantronix's INPUT
502
      DTRn      => open,                   -- not used 
503
      RTSn      => open,                   -- not used 
504
      OUT1n     => open,                   -- not used 
505
      OUT2n     => open,                   -- not used 
506
      TXRDYn    => uart_txrdy_n,           -- Tx FIFO not Fully      
507
      RXRDYn    => uart_rxrdy_n,           -- Rx FIFO Data Ready       
508
 
509
      IRQ       => open,                 -- not used 
510
      B_CLK     => s_br_clk_uart_o,      -- br_clk clock probe signal
511
      RD        => uart_rd               -- read data
512
    );
513
 
514
  cmp_uart_lbus : uart_lbus
515
    port map (
516
      lbus_clk          => s_clk,      -- uart clock      
517
      lbus_rst          => s_rst,                        -- system reset
518
      lbus_rst_buffer   => s_rst_buffer,    -- soft UART FIFO reset
519
      lbus_txrdy_n      => uart_txrdy_n,        -- Tx data ready
520
      lbus_rxrdy_n      => uart_rxrdy_n,        -- Rx data ready
521
      lbus_cs           => s_cs,        -- Chip Select gh16550
522
      lbus_wr           => s_wr,                                -- Write/Read (1/0) gh16550
523
      lbus_init         => lbus_init,   -- Initialization process flag
524
      lbus_add          => lbus_add,            -- local bus address
525
      lbus_data         => lbus_data,           -- local bus data  
526
      s_tx_proc_rqst_i  => s_tx_proc_rqst_i, -- tx process request from RAM
527
      v_lbus_state      => v_lbus_state,        -- flag indicator of lbus_state
528
      s_cs_rd_c         => s_cs_rd_c,           -- CS signal from caused by read cycle
529
      s_wr_rd_c         => s_wr_rd_c,           -- WR signal from caused by read cycle
530
      s_new_byte_rdy    => s_data8_ram_rdy,     -- new byte(8bit)ready and stable to be transmitted
531
      s_data_tx         => s_wr_enable_o,               -- 6 bytes will be trasmitted
532
      reghnd_rd_rdy     => s_not_ready,                 -- 6 byte ready but not yet written in RAM (1/0=>data ready/not ready)
533
      echo_en_i         => echo_en_i                            -- echo enable command enable/disable = 1/0 
534
                );
535
 
536
  cmp_register_rx_handler: register_rx_handler
537
    port map(
538
      reghnd_clk => s_clk,                      -- system clock
539
      reghnd_rst => s_rst,                      -- system reset
540
      reghnd_data_in => v_read_bus_latch,       -- 8 bits handler input from gh16550 RD through latch
541
      reghnd_data_cs_rd => s_cs_rd_c,           -- cs strobe of gh16550 during a read process
542
      reghnd_data_wr_rd => s_wr_rd_c,           -- wr state of gh16550 during a read process
543
      reghnd_rd_rdy => s_not_ready,             -- data and address ready and stable at handler output
544
      reghnd_full_add => v_rx_add_o,            -- 16 bits full addr ram input
545
      reghnd_full_data => v_rx_data_o,          -- 32 bits full data ram input
546
      reghnd_full_cs => s_rx_stb_read_data_i    -- strobe data/address acquired (1 acquired - 0 not acquired)
547
      );
548
 
549
  cmp_register_tx_handler: register_tx_handler
550
    port map(
551
      reghnd_clk => s_clk,                              -- system clock
552
      reghnd_rst => s_rst,                              -- system reset
553
      reghnd_addr_wwo_i => tx_addr_wwo_i,               -- control of TX process With or WithOut address W/WO=(1/0)
554
      reghnd_full_data_ram_i => v_tx_data_ram_i,        -- 32 bits full data ram output
555
      reghnd_full_add_ram_i => v_tx_add_ram_i,          -- 16 bits full addr ram output
556
      reghnd_stb_data_ram_rdy_i => s_tx_ram_data_rdy_i, -- strobe ram output data ready and stable
557
      reghnd_data_acq_gh16550_i => s_cs,                -- data acquired from gh16550
558
      reghnd_wr_enable_i => s_writing_proc,             -- enable the tx process
559
      reghnd_txrdy_n_gh16550_i => uart_txrdy_n, -- gh16550 ready to trasmit
560
      reghnd_wr_enable_o => s_wr_enable_o,              -- enable the tx process
561
      reghnd_output_rdy_o => s_data8_ram_rdy,           -- output data(8) ready
562
      reghnd_pdata_o => v_data8_ram,                    -- 8 bits parallel
563
      reghnd_stb_acq_ram_o => s_tx_stb_ram_data_acq_o   -- strobe data/address acquired (1 acquired - 0 not acquired)   
564
      );
565
 
566
end a;
567
 
568
--=============================================================================
569
-- architecture end
570
--=============================================================================

powered by: WebSVN 2.1.0

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