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

Subversion Repositories dp_components

[/] [dp_components/] [trunk/] [dp_hold_input.vhd] - Blame information for rev 5

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

Line No. Rev Author Line
1 2 danv
-------------------------------------------------------------------------------
2
--
3 4 danv
-- Copyright 2020
4 2 danv
-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
5
-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
6 4 danv
-- 
7
-- Licensed under the Apache License, Version 2.0 (the "License");
8
-- you may not use this file except in compliance with the License.
9
-- You may obtain a copy of the License at
10
-- 
11
--     http://www.apache.org/licenses/LICENSE-2.0
12
-- 
13
-- Unless required by applicable law or agreed to in writing, software
14
-- distributed under the License is distributed on an "AS IS" BASIS,
15
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
-- See the License for the specific language governing permissions and
17
-- limitations under the License.
18 2 danv
--
19
-------------------------------------------------------------------------------
20
 
21
LIBRARY IEEE, dp_pkg_lib;
22
USE IEEE.std_logic_1164.all;
23
USE dp_pkg_lib.dp_stream_pkg.ALL;
24
 
25
-- Purpose:
26
--   Hold the sink input
27
-- Description:
28
--   This dp_hold_input provides the necessary input logic to hold the input
29
--   data and control to easily register the source output. Compared to
30
--   dp_pipeling the dp_hold_input is the same except for the output register
31
--   stage. In this way dp_hold_input can be used in a more complicated stream
32
--   component where the output is not always the same as the input.
33
--   The snk_in.valid and hold_in.valid are never high at the same time.
34
--   If src_in.ready goes low while snk_in.valid is high then this snk_in.valid
35
--   is held in hold_in.valid and the corresponding snk_in.data will get held
36
--   in the external src_out_reg.data. When src_in.ready goes high again then
37
--   the held data becomes valid via src_out_reg.valid and hold_in.valid goes
38
--   low. Due to the RL=1 the next cycle the snk_in.valid from the sink may go
39
--   high. The next_src_out control signals are equal to pend_src_out AND
40
--   src_in.ready, so they can directly be assigned to src_out_reg.data if the
41
--   snk_in.data needs to be passed on.
42
--   The internal pend_src_out control signals are available outside, in
43
--   addition to the next_src_out control signals, to support external control
44
--   independent of src_in.ready. Use pend_scr_out instead of next_src_out
45
--   to avoid combinatorial loop when src_in.ready depends on next_src_out.
46
--   The pend_src_out signals are used to implement show ahead behaviour like
47
--   with RL=0, but for RL=1. The input can then be stopped based on the snk_in
48
--   data and later on continued again without losing this snk_in data, because
49
--   it was held as described above.
50
-- Remarks:
51
-- . Ready latency = 1
52
-- . Without flow control so when src_in.ready = '1' fixed, then dp_hold_input
53
--   becomes void because the dp_hold_ctrl output then remains '0'.
54
 
55
ENTITY dp_hold_input IS
56
  PORT (
57
    rst              : IN  STD_LOGIC;
58
    clk              : IN  STD_LOGIC;
59
    -- ST sink
60
    snk_out          : OUT t_dp_siso;
61
    snk_in           : IN  t_dp_sosi;
62
    -- ST source
63
    src_in           : IN  t_dp_siso;
64
    next_src_out     : OUT t_dp_sosi;
65
    pend_src_out     : OUT t_dp_sosi;  -- the SOSI data fields are the same as for next_src_out
66
    src_out_reg      : IN  t_dp_sosi   -- uses only the SOSI data fields
67
  );
68
END dp_hold_input;
69
 
70
 
71
ARCHITECTURE rtl OF dp_hold_input IS
72
 
73
  SIGNAL i_pend_src_out : t_dp_sosi;
74
  SIGNAL hold_in        : t_dp_sosi;  -- uses only the SOSI ctrl fields
75
 
76
BEGIN
77
 
78
  pend_src_out <= i_pend_src_out;
79
 
80
  -- SISO:
81
  snk_out <= src_in;  --  No change in ready latency, pass on xon frame level flow control
82
 
83
  -- SOSI:
84
  -- Take care of active snk_in.valid, snk_in.sync, snk_in.sop and snk_in.eop
85
  -- when src_in.ready went low. If hold_in.valid would not be used for
86
  -- pend_src_out.valid and next_src_out.valid, then the pipeline would still
87
  -- work, but the valid snk_in.data that came when src_in.ready went low,
88
  -- will then only get pushed out on the next valid snk_in.valid. Whereas
89
  -- hold_in.valid ensures that it will get pushed out as soon as src_in.ready
90
  -- goes high again. This is typically necessary in case of packetized data
91
  -- where the eop of one packet should not have to wait for the valid (sop)
92
  -- of a next packet to get pushed out.
93
 
94
  u_hold_val : ENTITY work.dp_hold_ctrl
95
  PORT MAP (
96
    rst      => rst,
97
    clk      => clk,
98
    ready    => src_in.ready,
99
    in_ctrl  => snk_in.valid,
100
    hld_ctrl => hold_in.valid
101
  );
102
 
103
  u_hold_sync : ENTITY work.dp_hold_ctrl
104
  PORT MAP (
105
    rst      => rst,
106
    clk      => clk,
107
    ready    => src_in.ready,
108
    in_ctrl  => snk_in.sync,
109
    hld_ctrl => hold_in.sync
110
  );
111
 
112
  u_hold_sop : ENTITY work.dp_hold_ctrl
113
  PORT MAP (
114
    rst      => rst,
115
    clk      => clk,
116
    ready    => src_in.ready,
117
    in_ctrl  => snk_in.sop,
118
    hld_ctrl => hold_in.sop
119
  );
120
 
121
  u_hold_eop : ENTITY work.dp_hold_ctrl
122
  PORT MAP (
123
    rst      => rst,
124
    clk      => clk,
125
    ready    => src_in.ready,
126
    in_ctrl  => snk_in.eop,
127
    hld_ctrl => hold_in.eop
128
  );
129
 
130
  p_pend_src_out : PROCESS(snk_in, src_out_reg, hold_in)
131
  BEGIN
132
    -- Pend data
133
    IF snk_in.valid='1' THEN
134
      i_pend_src_out <= snk_in;       -- Input data
135
    ELSE
136
      i_pend_src_out <= src_out_reg;  -- Hold data
137
    END IF;
138
    i_pend_src_out.valid <= snk_in.valid OR hold_in.valid;
139
    i_pend_src_out.sync  <= snk_in.sync  OR hold_in.sync;
140
    i_pend_src_out.sop   <= snk_in.sop   OR hold_in.sop;
141
    i_pend_src_out.eop   <= snk_in.eop   OR hold_in.eop;
142
  END PROCESS;
143
 
144
  p_next_src_out : PROCESS(i_pend_src_out, src_in)
145
  BEGIN
146
    -- Next data
147
    next_src_out       <= i_pend_src_out;
148
    -- Next control
149
    next_src_out.valid <= i_pend_src_out.valid AND src_in.ready;
150
    next_src_out.sync  <= i_pend_src_out.sync  AND src_in.ready;
151
    next_src_out.sop   <= i_pend_src_out.sop   AND src_in.ready;
152
    next_src_out.eop   <= i_pend_src_out.eop   AND src_in.ready;
153
  END PROCESS;
154
 
155
END rtl;

powered by: WebSVN 2.1.0

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