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/] [hibi_pe_dma/] [1.0/] [tb/] [blocks/] [avalon_cfg_writer.vhd] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
-------------------------------------------------------------------------------
2
-- Title      : Avalon cfg writer
3
-- Project    : 
4
-------------------------------------------------------------------------------
5
-- File       : avalon_cfg_writer.vhd
6
-- Author     : kulmala3
7
-- Created    : 22.03.2005
8
-- Last update: 2011-11-10
9
-- Description: Testbench block to config the dma via avalon.
10
--              Gets the needed values from an ASCII file.
11
-------------------------------------------------------------------------------
12
-- Copyright (c) 2005 
13
-------------------------------------------------------------------------------
14
-- Revisions  :
15
-- Date        Version  Author  Description
16
-- 22.03.2005  1.0      AK      Created
17
-------------------------------------------------------------------------------
18
-------------------------------------------------------------------------------
19
-- Funbase IP library Copyright (C) 2011 TUT Department of Computer Systems
20
--
21
-- This file is part of HIBI
22
--
23
-- This source file may be used and distributed without
24
-- restriction provided that this copyright statement is not
25
-- removed from the file and that any derivative work contains
26
-- the original copyright notice and the associated disclaimer.
27
--
28
-- This source file is free software; you can redistribute it
29
-- and/or modify it under the terms of the GNU Lesser General
30
-- Public License as published by the Free Software Foundation;
31
-- either version 2.1 of the License, or (at your option) any
32
-- later version.
33
--
34
-- This source is distributed in the hope that it will be
35
-- useful, but WITHOUT ANY WARRANTY; without even the implied
36
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
37
-- PURPOSE.  See the GNU Lesser General Public License for more
38
-- details.
39
--
40
-- You should have received a copy of the GNU Lesser General
41
-- Public License along with this source; if not, download it
42
-- from http://www.opencores.org/lgpl.shtml
43
-------------------------------------------------------------------------------
44
 
45
 
46
library ieee;
47
use ieee.std_logic_1164.all;
48
use ieee.std_logic_arith.all;
49
use ieee.std_logic_unsigned.all;
50
use std.textio.all;
51
use work.txt_util.all;
52
--use work.log2_pkg.all;
53
use work.tb_n2h2_pkg.all;
54
 
55
entity avalon_cfg_writer is
56
  generic (
57
    n_chans_g    : integer := 0;
58
    data_width_g : integer := 0;
59
    conf_file_g  : string  := ""
60
    );
61
  port (
62
    clk                      : in  std_logic;
63
    rst_n                    : in  std_logic;
64
    start_in                 : in  std_logic;
65
    avalon_cfg_addr_out      : out std_logic_vector(log2(n_chans_g)+conf_bits_c-1 downto 0);
66
    avalon_cfg_writedata_out : out std_logic_vector(data_width_g-1 downto 0);
67
    avalon_cfg_we_out        : out std_logic;
68
    avalon_cfg_cs_out        : out std_logic;
69
    init_in                  : in  std_logic;
70
    done_out                 : out std_logic
71
    );
72
end avalon_cfg_writer;
73
 
74
architecture rtl of avalon_cfg_writer is
75
 
76
  signal state_r        : integer;
77
  signal init_state_r   : integer;
78
  signal chan_counter_r : integer;
79
 
80
 
81
begin  -- rtl
82
 
83
  --
84
  -- Simple state machine, states are just numbered 0,1,2...8
85
  -- Separate part for init on the bottom
86
  --
87
  process (clk, rst_n)
88
    file conf_file        : text open read_mode is conf_file_g;
89
    variable mem_addr_r   : integer;
90
    variable sender_r     : integer;
91
    variable irq_amount_r : integer;
92
    variable max_amount_r : integer;
93
  begin  -- process
94
    if rst_n = '0' then                 -- asynchronous reset (active low)
95
      chan_counter_r           <= 0;
96
      avalon_cfg_cs_out        <= '0';
97
      avalon_cfg_we_out        <= '0';
98
      avalon_cfg_writedata_out <= (others => '0');
99
      avalon_cfg_addr_out      <= (others => '0');
100
      done_out                 <= '0';
101
      state_r                  <= 0;
102
      init_state_r             <= 0;
103
 
104
    elsif clk'event and clk = '1' then  -- rising clock edge
105
 
106
      case state_r is
107
        when 0 =>
108
          if start_in = '1' then
109
            state_r  <= 1;
110
            done_out <= '0';
111
          else
112
            done_out <= '0';
113
            state_r  <= 0;
114
          end if;
115
 
116
        when 1 =>
117
          -- Read file and configure mem addr
118
 
119
          read_conf_file (
120
            mem_addr   => mem_addr_r ,
121
            dst_addr   => sender_r,
122
            irq_amount => irq_amount_r,
123
            --            max_amount => max_amount_r,
124
            file_txt   => conf_file
125
            );
126
 
127
          assert false report "mem_addr: " & str(mem_addr_r) severity note;
128
          assert false report "dst_addr: " & str(sender_r) severity note;
129
          assert false report "irq_amount: " & str(irq_amount_r) severity note;
130
          --          assert false report "max_amount_r: " & str(max_amount_r) severity note;
131
 
132
          avalon_cfg_writedata_out <= conv_std_logic_vector(mem_addr_r, data_width_g);
133
          avalon_cfg_addr_out      <= conv_std_logic_vector(chan_counter_r, log2(n_chans_g)) &
134
                                      conv_std_logic_vector(0, conf_bits_c);
135
          avalon_cfg_we_out <= '1';
136
          avalon_cfg_cs_out <= '1';
137
          state_r           <= 2;
138
 
139
        when 2 =>
140
          -- Configure noc_addr_r (originally called "sender_r")
141
 
142
 
143
          avalon_cfg_writedata_out <= conv_std_logic_vector(sender_r, data_width_g);
144
          avalon_cfg_addr_out      <= conv_std_logic_vector(chan_counter_r, log2(n_chans_g)) &
145
                                      conv_std_logic_vector(1, conf_bits_c);
146
 
147
          avalon_cfg_we_out <= '1';
148
          avalon_cfg_cs_out <= '1';
149
          state_r           <= 3;
150
 
151
        when 3 =>
152
          -- Confgure expexted word count
153
 
154
          avalon_cfg_writedata_out <= conv_std_logic_vector(irq_amount_r, data_width_g);
155
          avalon_cfg_addr_out      <= conv_std_logic_vector(chan_counter_r, log2(n_chans_g)) &
156
                                      conv_std_logic_vector(2, conf_bits_c);
157
 
158
          avalon_cfg_we_out <= '1';
159
          avalon_cfg_cs_out <= '1';
160
          state_r           <= 5;
161
 
162
          -- obsolete
163
--        when 4 =>
164
 
165
--          avalon_cfg_writedata_out <= conv_std_logic_vector(max_amount_r, data_width_g);
166
--          avalon_cfg_addr_out      <= conv_std_logic_vector(chan_counter_r, log2(n_chans_g)) &
167
--                                      conv_std_logic_vector(0, conf_bits_c);
168
--          avalon_cfg_we_out        <= '1';
169
--          avalon_cfg_cs_out        <= '1';
170
--          state_r                  <= 5;
171
 
172
        when 5 =>
173
          -- Set init bit
174
          avalon_cfg_writedata_out                 <= (others => '0');
175
          avalon_cfg_writedata_out(chan_counter_r) <= '1';
176
          avalon_cfg_addr_out                      <= conv_std_logic_vector(chan_counter_r, log2(n_chans_g)) &
177
                                                      conv_std_logic_vector(5, conf_bits_c);
178
          avalon_cfg_we_out <= '1';
179
          avalon_cfg_cs_out <= '1';
180
          state_r           <= 6;
181
 
182
        when 6 =>
183
          -- Set irq_ena bit
184
          avalon_cfg_writedata_out    <= (others => '0');
185
          avalon_cfg_writedata_out(1) <= '1';
186
          avalon_cfg_addr_out         <= conv_std_logic_vector(chan_counter_r, log2(n_chans_g)) &
187
                                         conv_std_logic_vector(4, conf_bits_c);
188
          avalon_cfg_we_out <= '1';
189
          avalon_cfg_cs_out <= '1';
190
          state_r           <= 7;
191
 
192
          -- obsolete
193
--        when 6 =>
194
--          -- reset init
195
--          avalon_cfg_writedata_out <= conv_std_logic_vector(2, data_width_g);
196
--          avalon_cfg_addr_out      <= conv_std_logic_vector(chan_counter_r, log2(n_chans_g)) &
197
--                                      conv_std_logic_vector(0, conf_bits_c);
198
--          avalon_cfg_we_out        <= '1';
199
--          avalon_cfg_cs_out        <= '1';
200
--          state_r <= 7;
201
 
202
        when 7 =>
203
          -- Go to next channel
204
 
205
          avalon_cfg_cs_out <= '0';
206
          chan_counter_r    <= chan_counter_r+1;
207
          state_r           <= 8;
208
 
209
        when 8 =>
210
          -- Configure next channel or start over
211
 
212
          if chan_counter_r = n_chans_g then
213
            state_r           <= 0;
214
            chan_counter_r    <= 0;
215
            avalon_cfg_we_out <= '0';
216
            done_out          <= '1';
217
          else
218
            state_r <= 1;
219
          end if;
220
 
221
        when others => null;
222
      end case;
223
 
224
 
225
 
226
 
227
      if init_in = '1' then
228
        init_state_r <= 1;
229
      end if;
230
 
231
      case init_state_r is
232
        when 1 =>
233
          -- set init bit
234
          avalon_cfg_writedata_out                 <= (others => '0');
235
          avalon_cfg_writedata_out(chan_counter_r) <= '1';
236
 
237
          avalon_cfg_addr_out <= conv_std_logic_vector(chan_counter_r, log2(n_chans_g)) &
238
                                 conv_std_logic_vector(5, conf_bits_c);
239
          avalon_cfg_we_out <= '1';
240
          avalon_cfg_cs_out <= '1';
241
          init_state_r      <= 2;
242
          chan_counter_r    <= chan_counter_r+1;
243
 
244
        when 2 =>
245
          if chan_counter_r = n_chans_g then
246
            init_state_r      <= 0;
247
            avalon_cfg_we_out <= '0';
248
            avalon_cfg_cs_out <= '0';
249
            done_out          <= '1';
250
            chan_counter_r    <= 0;
251
          else
252
            avalon_cfg_we_out <= '0';
253
            init_state_r      <= 1;
254
          end if;
255
 
256
        when others => null;
257
      end case;
258
 
259
    end if;
260
  end process;
261
 
262
 
263
end rtl;

powered by: WebSVN 2.1.0

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