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 23

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

powered by: WebSVN 2.1.0

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