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

Subversion Repositories funbase_ip_library

[/] [funbase_ip_library/] [trunk/] [TUT/] [ip.hwp.communication/] [pkt_codec_mk2/] [1.0/] [vhd/] [addr_gen.vhd] - Blame information for rev 147

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
-------------------------------------------------------------------------------
2
-- Title      : Address generator for pkt_codec
3
-- Project    : 
4
-------------------------------------------------------------------------------
5
-- File       : addr_gen.vhd
6
-- Author     : Lasse Lehtonen
7
-- Company    : 
8
-- Created    : 2011-10-12
9 147 lanttu
-- Last update: 2012-05-10
10 145 lanttu
-- Platform   : 
11
-- Standard   : VHDL'87
12
-------------------------------------------------------------------------------
13
-- Description:
14
--  Handles address flit repeating when data comes slowly from IP and
15
--  prevents sending only address flits without at least on data flit.
16
--
17
-------------------------------------------------------------------------------
18
-- Copyright (c) 2011 
19
-------------------------------------------------------------------------------
20
-- Revisions  :
21
-- Date        Version  Author  Description
22
-- 2011-10-12  1.0      lehton87        Created
23
-------------------------------------------------------------------------------
24
 
25
library ieee;
26
use ieee.std_logic_1164.all;
27
 
28
 
29
entity addr_gen is
30
 
31
  generic (
32
    cmd_width_g    : positive;
33
    data_width_g   : positive;
34 147 lanttu
    addr_flit_en_g : natural;
35
    noc_type_g     : natural);
36 145 lanttu
 
37
  port (
38
    clk          : in  std_logic;
39
    rst_n        : in  std_logic;
40
    -- from IP side
41
    ip_cmd_in    : in  std_logic_vector(cmd_width_g-1 downto 0);
42
    ip_data_in   : in  std_logic_vector(data_width_g-1 downto 0);
43
    ip_stall_out : out std_logic;
44
    orig_addr_in : in  std_logic_vector(data_width_g-1 downto 0);
45
    -- to NET
46
    net_cmd_out  : out std_logic_vector(cmd_width_g-1 downto 0);
47
    net_data_out : out std_logic_vector(data_width_g-1 downto 0);
48
    net_stall_in : in  std_logic);
49
 
50
end addr_gen;
51
 
52
architecture rtl of addr_gen is
53
 
54
  signal cmd_r        : std_logic_vector(cmd_width_g-1 downto 0);
55
  signal data_r       : std_logic_vector(data_width_g-1 downto 0);
56
  signal addr_r       : std_logic_vector(data_width_g-1 downto 0);
57
  signal stall_r      : std_logic;
58
  signal first_data_r : std_logic;
59
 
60
  type   state_type is (idle, addr, orig, data);
61
  signal state_r : state_type;
62
 
63
begin  -- rtl
64
 
65
  ip_stall_out <= net_stall_in or stall_r;
66
 
67
  fsm_p : process (clk, rst_n)
68
  begin  -- process fsm_p
69
    if rst_n = '0' then                 -- asynchronous reset (active low)
70
      state_r      <= idle;
71
      cmd_r        <= (others => '0');
72
      data_r       <= (others => '0');
73
      addr_r       <= (others => '0');
74
      stall_r      <= '0';
75
      first_data_r <= '0';
76
      net_cmd_out  <= (others => '0');
77
      net_data_out <= (others => '0');
78
    elsif clk'event and clk = '1' then  -- rising clock edge
79
 
80 147 lanttu
      -- FH mesh
81
      if noc_type_g = 3 then
82
        if net_stall_in = '0' then
83
          net_cmd_out <= ip_cmd_in;
84
          net_data_out <= ip_data_in;
85
        end if;
86
      end if;
87 145 lanttu
 
88 147 lanttu
      -- ase nocs
89
      if noc_type_g /= 3 then
90 145 lanttu
 
91 147 lanttu
        -- default
92
        if net_stall_in = '0' then
93
          stall_r <= '0';
94
        end if;
95 145 lanttu
 
96 147 lanttu
        case state_r is
97 145 lanttu
          ---------------------------------------------------------------------
98 147 lanttu
          -- IDLE
99 145 lanttu
          ---------------------------------------------------------------------
100 147 lanttu
          when idle =>
101
            if net_stall_in = '0' then
102
              if ip_cmd_in = "00" then
103
                net_cmd_out  <= "00";
104 145 lanttu
                first_data_r <= '0';
105 147 lanttu
              elsif ip_cmd_in = "01" then
106
                net_cmd_out  <= "00";
107
                first_data_r <= '1';
108
                addr_r       <= ip_data_in;
109
                state_r      <= addr;
110 145 lanttu
              else
111 147 lanttu
                first_data_r <= '1';
112
                data_r       <= ip_data_in;
113
                net_cmd_out  <= "01";
114
                net_data_out <= addr_r;
115
                state_r      <= data;
116
              end if;
117
            end if;
118
 
119
            -------------------------------------------------------------------
120
            -- ADDR
121
            -------------------------------------------------------------------
122
          when addr =>
123
            if net_stall_in = '0' then
124
              if ip_cmd_in = "00" then
125 145 lanttu
                state_r      <= idle;
126 147 lanttu
                net_cmd_out  <= "00";
127 145 lanttu
                first_data_r <= '0';
128 147 lanttu
              elsif ip_cmd_in = "01" then
129 145 lanttu
                addr_r       <= ip_data_in;
130
                state_r      <= addr;
131 147 lanttu
                net_cmd_out  <= "00";
132
                first_data_r <= '1';
133 145 lanttu
              else
134 147 lanttu
                net_cmd_out  <= "01";
135
                net_data_out <= addr_r;
136 145 lanttu
                data_r       <= ip_data_in;
137 147 lanttu
                state_r      <= data;
138 145 lanttu
              end if;
139
            end if;
140
 
141 147 lanttu
            -------------------------------------------------------------------
142
            -- DATA
143
            -------------------------------------------------------------------
144
          when data =>
145
            if net_stall_in = '0' then
146
              if ip_cmd_in = "00" then
147
                if first_data_r = '1' and addr_flit_en_g = 1 then
148
                  stall_r      <= '1';
149
                  net_cmd_out  <= "10";
150
                  net_data_out <= orig_addr_in;
151
                  first_data_r <= '0';
152
                else
153
                  net_data_out <= data_r;
154
                  net_cmd_out  <= "10";
155
                  state_r      <= idle;
156
                end if;
157
              elsif ip_cmd_in = "01" then
158
                if first_data_r = '1' and addr_flit_en_g = 1 then
159
                  stall_r      <= '1';
160
                  net_cmd_out  <= "10";
161
                  net_data_out <= orig_addr_in;
162
                  first_data_r <= '0';
163
                else
164
                  net_data_out <= data_r;
165
                  net_cmd_out  <= "10";
166
                  addr_r       <= ip_data_in;
167
                  state_r      <= addr;
168
                  first_data_r <= '1';  -- ase 25-10-2011
169
                end if;
170
              else
171
                if first_data_r = '1' and addr_flit_en_g = 1 then
172
                  stall_r      <= '1';
173
                  net_cmd_out  <= "10";
174
                  net_data_out <= orig_addr_in;
175
                  first_data_r <= '0';
176
                else
177
                  net_data_out <= data_r;
178
                  net_cmd_out  <= "10";
179
                  data_r       <= ip_data_in;
180
                end if;
181
              end if;
182
            end if;
183
 
184
          when others => null;
185
        end case;
186
 
187
      end if;
188 145 lanttu
 
189
    end if;
190
  end process fsm_p;
191
 
192
end rtl;

powered by: WebSVN 2.1.0

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