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

Subversion Repositories rio

[/] [rio/] [branches/] [2.0.0-development/] [rtl/] [vhdl/] [RioLogicalMaintenance.vhd] - Blame information for rev 47

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

Line No. Rev Author Line
1 47 magro732
-------------------------------------------------------------------------------
2
-- 
3
-- RapidIO IP Library Core
4
-- 
5
-- This file is part of the RapidIO IP library project
6
-- http://www.opencores.org/cores/rio/
7
-- 
8
-- Description
9
-- Contains a platform to build endpoints on.
10
-- 
11
-- To Do:
12
-- - Clean up the code for reading. Works but messy.
13
-- 
14
-- Author(s): 
15
-- - Magnus Rosenius, magro732@opencores.org 
16
-- 
17
-------------------------------------------------------------------------------
18
-- 
19
-- Copyright (C) 2013 Authors and OPENCORES.ORG 
20
-- 
21
-- This source file may be used and distributed without 
22
-- restriction provided that this copyright statement is not 
23
-- removed from the file and that any derivative work contains 
24
-- the original copyright notice and the associated disclaimer. 
25
-- 
26
-- This source file is free software; you can redistribute it 
27
-- and/or modify it under the terms of the GNU Lesser General 
28
-- Public License as published by the Free Software Foundation; 
29
-- either version 2.1 of the License, or (at your option) any 
30
-- later version. 
31
-- 
32
-- This source is distributed in the hope that it will be 
33
-- useful, but WITHOUT ANY WARRANTY; without even the implied 
34
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
35
-- PURPOSE. See the GNU Lesser General Public License for more 
36
-- details. 
37
-- 
38
-- You should have received a copy of the GNU Lesser General 
39
-- Public License along with this source; if not, download it 
40
-- from http://www.opencores.org/lgpl.shtml 
41
-- 
42
-------------------------------------------------------------------------------
43
 
44
-------------------------------------------------------------------------------
45
-- RioLogicalMaintenance
46
-- This logical layer module handles ingress maintenance requests and converts
47
-- them into accesses on a Wishbone similar bus accessing the configuration
48
-- space.
49
-------------------------------------------------------------------------------
50
library ieee;
51
use ieee.std_logic_1164.all;
52
use ieee.numeric_std.all;
53
use work.rio_common.all;
54
 
55
 
56
-------------------------------------------------------------------------------
57
-- Entity for RioLogicalMaintenance.
58
-------------------------------------------------------------------------------
59
entity RioLogicalMaintenance is
60
  port(
61
    clk : in std_logic;
62
    areset_n : in std_logic;
63
    enable : in std_logic;
64
 
65
    readRequestReady_i : in std_logic;
66
    writeRequestReady_i : in std_logic;
67
    size_i : in std_logic_vector(3 downto 0);
68
    offset_i : in std_logic_vector(20 downto 0);
69
    wdptr_i : in std_logic;
70
    payloadLength_i : in std_logic_vector(2 downto 0);
71
    payloadIndex_o : out std_logic_vector(2 downto 0);
72
    payload_i : in std_logic_vector(63 downto 0);
73
    done_o : out std_logic;
74
 
75
    readResponseReady_o : out std_logic;
76
    writeResponseReady_o : out std_logic;
77
    status_o : out std_logic_vector(3 downto 0);
78
    payloadLength_o : out std_logic_vector(2 downto 0);
79
    payloadIndex_i : in std_logic_vector(2 downto 0);
80
    payload_o : out std_logic_vector(63 downto 0);
81
    done_i : in std_logic;
82
 
83
    configStb_o : out std_logic;
84
    configWe_o : out std_logic;
85
    configAdr_o : out std_logic_vector(21 downto 0);
86
    configDat_o : out std_logic_vector(31 downto 0);
87
    configDat_i : in std_logic_vector(31 downto 0);
88
    configAck_i : in std_logic);
89
end entity;
90
 
91
 
92
-------------------------------------------------------------------------------
93
-- 
94
-------------------------------------------------------------------------------
95
architecture RioLogicalMaintenance of RioLogicalMaintenance is
96
 
97
  type StateType is (IDLE,
98
                     CONFIG_READ_START, CONFIG_READ, CONFIG_READ_NEXT, CONFIG_READ_RESPONSE,
99
                     CONFIG_WRITE_START, CONFIG_WRITE, CONFIG_WRITE_NEXT, CONFIG_WRITE_RESPONSE,
100
                     WAIT_REQUEST);
101
  signal state : StateType;
102
 
103
  signal payloadLength : std_logic_vector(3 downto 0);
104
  signal payloadIndex : std_logic_vector(3 downto 0);
105
 
106
  signal payloadWrite : std_logic;
107
  signal payloadAddress : std_logic_vector(2 downto 0);
108
  signal payload : std_logic_vector(63 downto 0);
109
 
110
  signal configAdr : std_logic_vector(21 downto 0);
111
  signal configDat : std_logic_vector(31 downto 0);
112
 
113
begin
114
 
115
  configAdr_o <= configAdr;
116
  configDat_o <= configDat;
117
 
118
  payloadLength_o <= payloadLength(3 downto 1);
119
  payloadIndex_o <= payloadIndex(3 downto 1);
120
 
121
  -----------------------------------------------------------------------------
122
  -- 
123
  -----------------------------------------------------------------------------
124
  Maintenance: process(clk, areset_n)
125
  begin
126
    if (areset_n = '0') then
127
      state <= IDLE;
128
 
129
      readResponseReady_o <= '0';
130
      writeResponseReady_o <= '0';
131
      done_o <= '0';
132
 
133
      configStb_o <= '0';
134
      configWe_o <= '0';
135
      configAdr <= (others=>'0');
136
      configDat <= (others=>'0');
137
 
138
      payloadWrite <= '0';
139
      payloadIndex <= (others=>'0');
140
      payload <= (others=>'0');
141
    elsif (clk'event and clk = '1') then
142
      payloadWrite <= '0';
143
 
144
      case state is
145
        when IDLE =>
146
          ---------------------------------------------------------------------
147
          -- 
148
          ---------------------------------------------------------------------
149
          done_o <= '0';
150
          if (readRequestReady_i = '1') then
151
            state <= CONFIG_READ_START;
152
          elsif (writeRequestReady_i = '1') then
153
            state <= CONFIG_WRITE_START;
154
          end if;
155
 
156
        when CONFIG_READ_START =>
157
          ---------------------------------------------------------------------
158
          -- 
159
          ---------------------------------------------------------------------
160
          configStb_o <= '1';
161
          configWe_o <= '0';
162
          if (size_i = "1000") then
163
            configAdr <= offset_i & wdptr_i;
164
          else
165
            configAdr <= offset_i & '0';
166
          end if;
167
          payloadIndex <= "0000";
168
          payload <= (others=>'0');
169
          state <= CONFIG_READ;
170
 
171
        when CONFIG_READ =>
172
          ---------------------------------------------------------------------
173
          -- 
174
          ---------------------------------------------------------------------
175
          if (configAck_i = '1') then
176
            configStb_o <= '0';
177
            configAdr <= std_logic_vector(unsigned(configAdr) + 1);
178
            state <= CONFIG_READ_NEXT;
179
          end if;
180
 
181
          if (size_i = "1000") and (wdptr_i = '0') then
182
            payload(63 downto 32) <= configDat_i;
183
          elsif (size_i = "1000") and (wdptr_i = '1') then
184
            payload(31 downto 0) <= configDat_i;
185
          else
186
            if (payloadIndex(0) = '0') then
187
              payload(63 downto 32) <= configDat_i;
188
            else
189
              payload(31 downto 0) <= configDat_i;
190
            end if;
191
          end if;
192
 
193
        when CONFIG_READ_NEXT =>
194
          ---------------------------------------------------------------------
195
          -- 
196
          ---------------------------------------------------------------------
197
          if (size_i = "1000") and (wdptr_i = '0') then
198
            -- 1 word.
199
            status_o <= "0000";
200
            payloadLength <= "0010";
201
            payloadWrite <= '1';
202
            state <= CONFIG_READ_RESPONSE;
203
          elsif (size_i = "1000") and (wdptr_i = '1') then
204
            -- 1 word.
205
            status_o <= "0000";
206
            payloadLength <= "0010";
207
            payloadWrite <= '1';
208
            state <= CONFIG_READ_RESPONSE;
209
          elsif (size_i = "1011") and (wdptr_i = '0') then
210
            -- 2 words.
211
            status_o <= "0000";
212
            payloadLength <= "0010";
213
            payloadWrite <= payloadIndex(0);
214
            if (payloadIndex = "0001") then
215
              state <= CONFIG_READ_RESPONSE;
216
            else
217
              configStb_o <= '1';
218
              state <= CONFIG_READ;
219
            end if;
220
          elsif (size_i = "1011") and (wdptr_i = '1') then
221
            -- 4 words.
222
            status_o <= "0000";
223
            payloadLength <= "0100";
224
            payloadWrite <= payloadIndex(0);
225
            if (payloadIndex = "0011") then
226
              state <= CONFIG_READ_RESPONSE;
227
            else
228
              configStb_o <= '1';
229
              state <= CONFIG_READ;
230
            end if;
231
          elsif (size_i = "1100") and (wdptr_i = '0') then
232
            -- 8 words.
233
            status_o <= "0000";
234
            payloadLength <= "1000";
235
            payloadWrite <= payloadIndex(0);
236
            if (payloadIndex = "0111") then
237
              state <= CONFIG_READ_RESPONSE;
238
            else
239
              configStb_o <= '1';
240
              state <= CONFIG_READ;
241
            end if;
242
          elsif (size_i = "1100") and (wdptr_i = '1') then
243
            -- 16 words.
244
            status_o <= "0000";
245
            payloadLength <= "0000";
246
            payloadWrite <= payloadIndex(0);
247
            if (payloadIndex = "1111") then
248
              state <= CONFIG_READ_RESPONSE;
249
            else
250
              configStb_o <= '1';
251
              state <= CONFIG_READ;
252
            end if;
253
          else
254
            -- Unallowed packet.
255
            -- Send write-response with status indicating error.
256
            status_o <= "0111";
257
            state <= CONFIG_READ_RESPONSE;
258
          end if;
259
 
260
          payloadAddress <= payloadIndex(3 downto 1);
261
          payloadIndex <= std_logic_vector(unsigned(payloadIndex) + 1);
262
 
263
        when CONFIG_READ_RESPONSE =>
264
          ---------------------------------------------------------------------
265
          -- 
266
          ---------------------------------------------------------------------
267
          if (done_i = '1') then
268
            readResponseReady_o <= '0';
269
            state <= WAIT_REQUEST;
270
          else
271
            readResponseReady_o <= '1';
272
          end if;
273
 
274
        when CONFIG_WRITE_START =>
275
          ---------------------------------------------------------------------
276
          -- 
277
          ---------------------------------------------------------------------
278
          configWe_o <= '1';
279
          if (size_i = "1000") then
280
            configAdr <= offset_i & wdptr_i;
281
          else
282
            configAdr <= offset_i & '0';
283
          end if;
284
          if (size_i = "1000") and (wdptr_i = '0') then
285
            -- 1 word.
286
            configStb_o <= '1';
287
            configDat <= payload_i(63 downto 32);
288
            payloadLength <= "0001";
289
            status_o <= "0000";
290
            state <= CONFIG_WRITE;
291
          elsif (size_i = "1000") and (wdptr_i = '1') then
292
            -- 1 word.
293
            configStb_o <= '1';
294
            configDat <= payload_i(31 downto 0);
295
            payloadLength <= "0001";
296
            status_o <= "0000";
297
            state <= CONFIG_WRITE;
298
          elsif (size_i = "1011") and (wdptr_i = '0') then
299
            -- 2 words.
300
            configStb_o <= '1';
301
            configDat <= payload_i(63 downto 32);
302
            payloadLength <= "0010";
303
            status_o <= "0000";
304
            state <= CONFIG_WRITE;
305
          elsif (size_i = "1011") and (wdptr_i = '1') then
306
            -- maximum 4 words.
307
            configStb_o <= '1';
308
            configDat <= payload_i(63 downto 32);
309
            payloadLength <= payloadLength_i & '0';
310
            status_o <= "0000";
311
            state <= CONFIG_WRITE;
312
          elsif (size_i = "1100") and (wdptr_i = '0') then
313
            -- maximum 8 words.
314
            configStb_o <= '1';
315
            configDat <= payload_i(63 downto 32);
316
            payloadLength <= payloadLength_i & '0';
317
            status_o <= "0000";
318
            state <= CONFIG_WRITE;
319
          elsif (size_i = "1100") and (wdptr_i = '1') then
320
            -- maximum 16 words.
321
            configStb_o <= '1';
322
            configDat <= payload_i(63 downto 32);
323
            payloadLength <= payloadLength_i & '0';
324
            status_o <= "0000";
325
            state <= CONFIG_WRITE;
326
          else
327
            -- Unallowed packet.
328
            -- Send write-response with status indicating error.
329
            status_o <= "0111";
330
            state <= CONFIG_WRITE_RESPONSE;
331
          end if;
332
          payloadIndex <= "0001";
333
 
334
        when CONFIG_WRITE =>
335
          ---------------------------------------------------------------------
336
          -- 
337
          ---------------------------------------------------------------------
338
          if (configAck_i = '1') then
339
            configStb_o <= '0';
340
            configAdr <= std_logic_vector(unsigned(configAdr) + 1);
341
            state <= CONFIG_WRITE_NEXT;
342
          end if;
343
 
344
        when CONFIG_WRITE_NEXT =>
345
          ---------------------------------------------------------------------
346
          -- 
347
          ---------------------------------------------------------------------
348
          if (payloadIndex(0) = '0') then
349
            configDat <= payload_i(63 downto 32);
350
          else
351
            configDat <= payload_i(31 downto 0);
352
          end if;
353
 
354
          payloadIndex <= std_logic_vector(unsigned(payloadIndex) + 1);
355
          if (payloadIndex /= payloadLength) then
356
            configStb_o <= '1';
357
            state <= CONFIG_WRITE;
358
          else
359
            state <= CONFIG_WRITE_RESPONSE;
360
          end if;
361
 
362
        when CONFIG_WRITE_RESPONSE =>
363
          ---------------------------------------------------------------------
364
          -- 
365
          ---------------------------------------------------------------------
366
          if (done_i = '1') then
367
            writeResponseReady_o <= '0';
368
            state <= WAIT_REQUEST;
369
          else
370
            writeResponseReady_o <= '1';
371
          end if;
372
 
373
        when WAIT_REQUEST =>
374
          ---------------------------------------------------------------------
375
          -- 
376
          ---------------------------------------------------------------------
377
          done_o <= '1';
378
          if (readRequestReady_i = '0') and (writeRequestReady_i = '0') then
379
            state <= IDLE;
380
          end if;
381
        when others =>
382
 
383
      end case;
384
    end if;
385
  end process;
386
 
387
  -----------------------------------------------------------------------------
388
  -- Payload content memory.
389
  -----------------------------------------------------------------------------
390
 
391
  PayloadMemory: MemorySimpleDualPort
392
    generic map(ADDRESS_WIDTH=>3, DATA_WIDTH=>64)
393
    port map(clkA_i=>clk,
394
             enableA_i=>payloadWrite,
395
             addressA_i=>payloadAddress,
396
             dataA_i=>payload,
397
             clkB_i=>clk,
398
             enableB_i=>'1',
399
             addressB_i=>payloadIndex_i,
400
             dataB_o=>payload_o);
401
 
402
end architecture;

powered by: WebSVN 2.1.0

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