2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_arith.all;
4 use ieee.std_logic_unsigned.all;
8 output_fifo_width : integer := 2
12 per_addr : in std_logic_vector (7 downto 0);
13 per_din : in std_logic_vector (15 downto 0); -- unused
14 per_en : in std_logic;
15 per_wen : in std_logic_vector (1 downto 0); -- unused
16 puc : in std_logic; -- unused
17 --per_irq_acc : in std_logic; -- unused
18 --per_irq : out std_logic;
19 per_dout : out std_logic_vector (15 downto 0);
30 -- - TX buffer full .1b
31 -- - TX buffer empty .1b
32 -- - TX buffer empty IE 1.b
35 -- - RX buffer empty .1b
36 -- - RX buffer half full .1b
37 -- - RX buffer full .1b
38 -- - RX buffer half full IE .1b
39 -- - RX buffer full IE .1b
40 -- - RX framing error .1b
41 -- - RX buffer overflow .1b
43 --------------------------------------------------------------------------------
45 architecture dataflow of uart is
47 component tx_control is
51 tx_ready : in std_logic;
52 fifo_empty : in std_logic;
53 tx_we : out std_logic;
54 fifo_pop : out std_logic
58 component transmitter is
62 data : in std_logic_vector (7 downto 0);
64 ready : out std_logic;
78 clear_ow : in std_logic;
79 d_in : in std_logic_vector (7 downto 0);
80 d_out : out std_logic_vector (7 downto 0);
82 hfull : out std_logic;
83 empty : out std_logic;
84 overflow : out std_logic
93 scale : in std_logic_vector (15 downto 0);
94 clk_baud : out std_logic
98 --------------------------------------------------------------------------------
100 type boolean_vector is array (natural range <>) of boolean;
102 --------------------------------------------------------------------------------
104 constant base_addr : integer := 16#0100#;
106 constant UBAUD : integer := base_addr + 00;
107 constant UTX : integer := base_addr + 02;
109 signal reg_we : std_logic_vector (511 downto 0);
110 signal reg_re : boolean_vector (511 downto 0);
112 signal tx_clk : std_logic;
113 signal tx_data : std_logic_vector (7 downto 0);
114 signal tx_we : std_logic;
115 signal tx_ready : std_logic;
117 signal tx_fifo_empty : std_logic;
118 signal tx_fifo_re : std_logic;
119 signal tx_fifo_we : std_logic;
121 --------------------------------------------------------------------------------
125 process (per_addr, per_wen, per_en)
127 for i in reg_re'range loop
131 if (per_en = '1' and per_addr = i/2) then
134 if (per_wen (i mod 2) = '1') then
142 tx_control_0 : tx_control port map (
145 tx_ready => tx_ready,
146 fifo_empty => tx_fifo_empty,
148 fifo_pop => tx_fifo_re
151 transmitter_0 : transmitter port map (
160 tx_fifo : fifo port map (
166 d_in => per_din (7 downto 0),
170 empty => tx_fifo_empty,
174 baud_gen_0 : baud_gen port map (
178 scale => "0000000000000000",
183 --------------------------------------------------------------------------------
185 tx_fifo_we <= reg_we (UTX);