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 16

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

powered by: WebSVN 2.1.0

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