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_top.vhd] - Blame information for rev 18

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

Line No. Rev Author Line
1 3 aborga
--
2
-- unit name: ab_top (Register map access)
3
--
4
-- author:      Andrea Borga (andrea.borga@nikhef.nl)
5
--              
6
--
7
-- date: $26/08/2011    $: created
8
--
9
-- version: $Rev 0      $:
10
--
11
-- description:
12
--    NOTE: look through the code for this
13
--
14
--         -- #####################
15
--         -- #####################
16
--
17
--   to spot where the code needs customization
18
--
19
-- dependencies:        
20
--                      gh_uart_16550
21
--                      ab_uart_lbus_slave
22
--                      ab_uart_16550_wrapper
23
--                      ab_register_rx_handler
24
--                      ab_register_tx_handler
25
--
26
-- references: <reference one>
27
-- <reference two> ...
28
--
29
-- modified by: $Author:: $:
30
--     
31
--        
32
--
33
-------------------------------------------------------------------------------
34
-- last changes: <date> <initials> <log>
35
-- <extended description>
36
-------------------------------------------------------------------------------
37
-- TODO:
38
--      
39
-- 
40
--
41
-------------------------------------------------------------------------------
42
 
43
--=============================================================================
44
-- Libraries
45
--=============================================================================
46
 
47
library ieee;
48
use ieee.std_logic_1164.all;
49
use ieee.numeric_std.all;
50
 
51
--=============================================================================
52
-- Entity declaration for ab_top
53
--=============================================================================
54
 
55
entity ab_top is
56
   port(
57
     clk_uart_29MHz_i   : in     std_logic;
58 16 aborga
     uart_rst_i         : in     std_logic;
59
     uart_leds_o        : out    std_logic_vector(7 downto 0);
60 3 aborga
     clk_uart_monitor_o : out    std_logic;
61
     -- #####################
62
     -- ADD your registers toward the rest of the logic here
63
     -- #####################
64
     uart_din_o         : out    std_logic;
65
     uart_dout_i        : in     std_logic);
66
 
67
end ab_top;
68
 
69
 
70
--=============================================================================
71
-- architecture declaration
72
--=============================================================================
73
 
74
architecture a0 of ab_top is
75
 
76
  component uart_16550_wrapper
77
    port(
78
    -- general purpose
79
        sys_clk_i               : in std_logic;         -- system clock
80
        sys_rst_i               : in std_logic;         -- system reset
81
        -- TX/RX process command line
82
        echo_en_i               : in std_logic;         -- Echo enable (byte by byte) enable/disable = 1/0
83
        tx_addr_wwo_i           : in std_logic;         -- control of TX process With or WithOut address W/WO=(1/0)
84
        -- serial I/O side
85
        lantronix_output_i      : in std_logic;         -- Lantronix Serial data OUTPUT signal
86
        lantronix_input_o       : out std_logic;        -- Lantronix Serial data INPUT signal
87
        cp_b                    : inout std_logic_vector(2 downto 0);  -- general purpose IO pins
88
        -- parallel I/O side
89
        s_br_clk_uart_o         : out std_logic;        -- br_clk clock probe signal
90
        -- RX part/control
91
        v_rx_add_o              : out std_logic_vector(15 downto 0);     -- 16 bits full addr ram input
92
        v_rx_data_o             : out std_logic_vector(31 downto 0);     -- 32 bits full data ram input
93
        s_rx_rdy_o              : out std_logic;        -- add/data ready to be write into RAM
94
        s_rx_stb_read_data_i    : in std_logic; -- strobe signal from RAM ... 
95
        -- TX part/control
96
        s_tx_proc_rqst_i        : in std_logic;         -- stream TX process request 1/0 tx enable/disable
97
        v_tx_add_ram_i          : in std_logic_vector(15 downto 0);              -- 16 bits full addr ram output
98
        v_tx_data_ram_i         : in std_logic_vector(31 downto 0);              -- 32 bits full data ram output
99
        s_tx_ram_data_rdy_i     : in std_logic;         -- ram output data ready and stable
100
        s_tx_stb_ram_data_acq_o : out std_logic -- strobe ram data/address output acquired 1/0 acquired/not acquired
101
        );
102
  end component;
103
 
104
  --
105
  -- Internal signal declaration 
106
  --
107
 
108
  -- generic signals
109
  signal s_rst                  : std_logic; -- main reset
110
  signal s_clk_uart             : std_logic; -- slow (29 MHz) clock
111
 
112
  -- uart control signals
113
  signal s_uart_cp                              : std_logic_vector (2 downto 0); -- unused
114
  signal s_uart_br_clk                          : std_logic; -- unused clock monitor
115
  signal s_uart_rx_add                  : std_logic_vector (15 downto 0);
116
  signal s_uart_rx_data                 : std_logic_vector (31 downto 0);
117
  signal s_uart_rx_rdy                  : std_logic;
118
  signal s_uart_rx_stb_read_data        : std_logic;
119
  signal s_update                       : std_logic;
120
  signal s_uart_tx_add                  : std_logic_vector (15 downto 0);
121
  signal s_uart_tx_data                 : std_logic_vector (31 downto 0);
122
  signal s_uart_tx_data_rdy             : std_logic;
123
  signal s_uart_tx_req                  : std_logic;
124
  signal s_uart_tx_stb_acq              : std_logic;
125
  signal s_tx_complete                  : std_logic;
126
 
127
 
128
  -- address decoder signals
129
 
130
  signal r_config_addr_uart         : std_logic_vector (1 downto 0);
131
  signal r_open                         : std_logic_vector (31 downto 0);
132
  signal r_leds                         : std_logic_vector (7 downto 0);
133
  signal r_test_reg01                   : std_logic_vector (31 downto 0);
134
  signal r_test_reg02                   : std_logic_vector (31 downto 0);
135
  signal r_test_reg03                   : std_logic_vector (31 downto 0);
136
  signal r_test_reg04                   : std_logic_vector (31 downto 0);
137
  signal r_test_reg05                   : std_logic_vector (31 downto 0);
138
  -- #####################
139
  -- declare your registers here
140
  -- #####################
141
 
142
  --
143
  -- State Machine states 
144
  --
145
 
146
  type t_tx_reg_map is (IDLE, WAIT_A_BYTE, LATCH, TRANSMIT);
147
  signal s_tx_fsm         : t_tx_reg_map;
148
 
149
begin
150
 
151
  s_rst <= not uart_rst_i;
152
 
153
  uart_leds_o <= r_leds;                -- Let there be light ...
154
 
155
  -- UART simple register map
156
  register_map : process (s_rst, s_clk_uart)
157
    begin
158
      if s_rst = '1' then -- reset all registers here  
159
        s_uart_rx_stb_read_data        <=  '0';
160
        s_update                       <= '0';
161
        r_leds                         <= (others => '0');
162
        r_config_addr_uart             <= "10";
163
        r_test_reg01                   <= (others => '0');
164
        r_test_reg02                   <= (others => '0');
165
        r_test_reg03                   <= (others => '0');
166
        r_test_reg04                   <= (others => '0');
167
        r_test_reg05                   <= (others => '0');
168
        -- #####################
169
        -- reset your registers here
170
        -- #####################
171
      elsif rising_edge(s_clk_uart) then
172
        if s_uart_rx_rdy = '1' then
173
          case (s_uart_rx_add) is
174
            when X"0020" =>  r_leds            <=  s_uart_rx_data(7 downto 0);
175
            -- #####################
176
            -- declare more registers here to WRITE
177
            -- #####################
178
            when X"0030" =>  r_test_reg03      <=  s_uart_rx_data;
179
            when X"0031" =>  r_test_reg04      <=  s_uart_rx_data;
180
            when X"0032" =>  r_test_reg05      <=  s_uart_rx_data;
181
            when X"0040" =>  r_test_reg01      <=  s_uart_rx_data;
182
            when X"0050" =>  r_test_reg02      <=  s_uart_rx_data;
183
            when X"8000" =>  s_update         <=  '1';  -- register update self clearing
184
            when others =>  r_open            <= s_uart_rx_data;
185
          end case;
186
          s_uart_rx_stb_read_data <= '1';
187
        else
188
          s_uart_rx_stb_read_data <= '0';
189
          s_update <= '0';
190
        end if;
191
      end if;
192
    end process;
193
 
194
  register_update : process (s_rst, s_clk_uart)
195
    variable v_uart_tx_add  : unsigned (15 downto 0);
196
    variable v_count        : unsigned (15 downto 0);
197
  begin
198
      if s_rst = '1' then -- reset all registers here  
199
        s_uart_tx_data_rdy   <= '0';
200
        s_uart_tx_req        <= '0';
201
        v_uart_tx_add        := (others => '0');
202
        v_count              := (others => '0');
203
        s_uart_tx_data       <= (others => '0');
204
        s_uart_tx_add        <= (others => '0');
205
        -- #####################
206
        -- reset your registers here
207
        -- #####################
208
        s_tx_fsm             <= IDLE;
209
      elsif rising_edge(s_clk_uart) then
210
        case s_tx_fsm is
211
          when IDLE =>
212
            if s_update = '1' then
213
              s_tx_fsm <= WAIT_A_BYTE;
214
            else
215
              s_tx_fsm <= IDLE;
216
              s_uart_tx_data_rdy   <= '0';
217
              s_uart_tx_req        <= '0';
218
              v_uart_tx_add        := (others => '0');
219
              v_count              := (others => '0');
220
              s_uart_tx_data       <= (others => '0');
221
              s_uart_tx_add        <= (others => '0');
222
            end if;
223
          when WAIT_A_BYTE =>
224
            s_uart_tx_data_rdy   <= '0';
225
            v_count := v_count + 1;
226
            if v_count = X"0900" then
227
              v_uart_tx_add := v_uart_tx_add + 1;
228
              s_tx_fsm <= LATCH;
229
            else
230
              s_tx_fsm <= WAIT_A_BYTE;
231
            end if;
232
          when LATCH =>
233
            if s_uart_tx_stb_acq = '0' then
234
              s_uart_tx_req <= '1';
235
              s_uart_tx_add <= std_logic_vector (v_uart_tx_add);
236
              case v_uart_tx_add is
237
                when X"0001" => s_uart_tx_data               <= (others => '0'); -- reserved synch register
238
                                s_tx_fsm <= TRANSMIT;
239
                -- #####################
240
                -- declare more registers here to READ
241
                -- #####################
242
                when X"0010" => s_uart_tx_data               <= (others => '0');
243
                                s_tx_fsm <= TRANSMIT;
244
                when X"0011" => s_uart_tx_data               <= (others => '0');
245
                                s_tx_fsm <= TRANSMIT;
246
                when X"0020" => s_uart_tx_data (7 downto 0)  <= r_leds;
247
                                s_tx_fsm <= TRANSMIT;
248
                when X"0030" => s_uart_tx_data               <= r_test_reg03;
249
                                s_tx_fsm <= TRANSMIT;
250
                when X"0031" => s_uart_tx_data               <= r_test_reg04;
251
                                s_tx_fsm <= TRANSMIT;
252
                when X"0032" => s_uart_tx_data               <= r_test_reg05;
253
                                s_tx_fsm <= TRANSMIT;
254
                when X"0040" => s_uart_tx_data               <= r_test_reg01;
255
                                s_tx_fsm <= TRANSMIT;
256
                when X"0050" => s_uart_tx_data               <= r_test_reg02;
257
                                s_tx_fsm <= TRANSMIT;
258
                -- End Of Transmission register = last register + 1
259
                when X"0051" => s_tx_fsm <= IDLE;  -- end of transmission
260
                when others => s_uart_tx_data <=  (others => '0');
261
                               v_uart_tx_add := v_uart_tx_add + 1;
262
                               s_uart_tx_data_rdy   <= '0';
263
                               s_tx_fsm <= LATCH;
264
              end case;
265
            else
266
              v_count  := (others => '0');
267
              s_tx_fsm <=  WAIT_A_BYTE;
268
            end if;
269
          when TRANSMIT =>
270
            s_uart_tx_data_rdy   <= '1';
271
            v_count              := (others => '0');
272
            s_tx_fsm <= WAIT_A_BYTE;
273
          when others =>
274
            s_tx_fsm <= IDLE;
275
        end case;
276
      end if;
277
    end process;
278
 
279
 
280
  s_clk_uart <= clk_uart_29MHz_i;              -- UART system clock 29.4912 MHz
281
  clk_uart_monitor_o <= s_uart_br_clk;
282
 
283
  uart_wrapper : uart_16550_wrapper
284
    port map(
285
      sys_clk_i               => s_clk_uart,
286
      sys_rst_i               => s_rst,
287
      echo_en_i               => r_config_addr_uart(0),
288
      tx_addr_wwo_i           => r_config_addr_uart(1),
289
      lantronix_output_i      => uart_dout_i,
290
      lantronix_input_o       => uart_din_o,
291
      cp_b                    => s_uart_cp,
292
      s_br_clk_uart_o         => s_uart_br_clk,
293
      v_rx_add_o              => s_uart_rx_add,
294
      v_rx_data_o             => s_uart_rx_data,
295
      s_rx_rdy_o              => s_uart_rx_rdy,
296
      s_rx_stb_read_data_i    => s_uart_rx_stb_read_data,
297
      s_tx_proc_rqst_i        => s_uart_tx_req,
298
      v_tx_add_ram_i          => s_uart_tx_add,
299
      v_tx_data_ram_i         => s_uart_tx_data,
300
      s_tx_ram_data_rdy_i     => s_uart_tx_data_rdy,
301
      s_tx_stb_ram_data_acq_o => s_uart_tx_stb_acq
302
      );
303
 
304
end architecture a0 ; -- of UART_control
305
 

powered by: WebSVN 2.1.0

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