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

Subversion Repositories astron_filter

[/] [astron_filter/] [trunk/] [fil_ppf_ctrl.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 danv
-------------------------------------------------------------------------------
2
--
3
-- Copyright (C) 2009
4
-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
5
-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
6
--
7
-- This program is free software: you can redistribute it and/or modify
8
-- it under the terms of the GNU General Public License as published by
9
-- the Free Software Foundation, either version 3 of the License, or
10
-- (at your option) any later version.
11
--
12
-- This program is distributed in the hope that it will be useful,
13
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
14
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
-- GNU General Public License for more details.
16
--
17
-- You should have received a copy of the GNU General Public License
18
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
--
20
-------------------------------------------------------------------------------
21
-- Purpose: Controlling the data streams for the filter units
22
-- 
23
-- Description: This unit prepairs the data streams for the ppf_filter 
24
--              unit. Incoming data (in_dat) is combined with stored 
25
--              data (taps_in_vec) to generate a new vector that is 
26
--              offered to the filter unit: taps_out_vec. 
27
--             
28
--              It also delays the in_val signal in order to generate 
29
--              the out_val that is proper alligned with the output data
30
--              that is coming from the filter unit. 
31
--              
32
 
33
library IEEE, common_pkg_lib;
34
use IEEE.std_logic_1164.ALL;
35
use IEEE.numeric_std.ALL;
36
use common_pkg_lib.common_pkg.ALL;
37
use work.fil_pkg.ALL;
38
 
39
entity fil_ppf_ctrl is
40
  generic (
41
    g_fil_ppf          : t_fil_ppf;
42
    g_fil_ppf_pipeline : t_fil_ppf_pipeline
43
  );
44
  port (
45
    rst         : in  std_logic := '0';
46
    clk         : in  std_logic;
47
    in_dat      : in  std_logic_vector;
48
    in_val      : in  std_logic;
49
    taps_in_vec : in  std_logic_vector;
50
    taps_rdaddr : out std_logic_vector;
51
    taps_wraddr : out std_logic_vector;
52
    taps_wren   : out std_logic;
53
    taps_out_vec: out std_logic_vector;
54
    out_val     : out std_logic
55
  );
56
end fil_ppf_ctrl;
57
 
58
architecture rtl of fil_ppf_ctrl is
59
 
60
  type     t_in_dat_delay is array (g_fil_ppf_pipeline.mem_delay downto 0) of std_logic_vector(g_fil_ppf.in_dat_w*g_fil_ppf.nof_streams-1 downto 0);
61
 
62
  constant c_addr_w             : natural := ceil_log2(g_fil_ppf.nof_bands * (2**g_fil_ppf.nof_chan));
63
  constant c_ctrl_latency       : natural := 1;                               -- due to taps_out_vec register
64
  constant c_mult_latency       : natural := g_fil_ppf_pipeline.mult_input + g_fil_ppf_pipeline.mult_product + g_fil_ppf_pipeline.mult_output;
65
  constant c_adder_latency      : natural := ceil_log2(g_fil_ppf.nof_taps) * g_fil_ppf_pipeline.adder_stage;
66
  constant c_filter_zdly        : natural := g_fil_ppf.nof_bands * (2**g_fil_ppf.nof_chan);
67
 
68
  constant c_tot_latency        : natural := g_fil_ppf_pipeline.mem_delay + c_ctrl_latency + c_mult_latency +
69
                                             c_adder_latency + g_fil_ppf_pipeline.requant_remove_lsb +
70
                                             g_fil_ppf_pipeline.requant_remove_msb;
71
 
72
  constant c_single_taps_vec_w  : natural := g_fil_ppf.in_dat_w*g_fil_ppf.nof_taps;
73
  constant c_taps_vec_w         : natural := c_single_taps_vec_w*g_fil_ppf.nof_streams;
74
 
75
  type reg_type is record
76
    in_dat_arr   : t_in_dat_delay;                             -- Input register for the data
77
    init_dly_cnt : integer range 0 to c_filter_zdly;           -- Counter used to overcome the settling time of the filter. 
78
    val_dly      : std_logic_vector(c_tot_latency-1 downto 0); -- Delay register for the valid signal 
79
    rd_addr      : std_logic_vector(c_addr_w-1 downto 0);      -- The read address
80
    wr_addr      : std_logic_vector(c_addr_w-1 downto 0);      -- The write address
81
    wr_en        : std_logic;                                  -- Write enable signal for the taps memory
82
    taps_out_vec : std_logic_vector(c_taps_vec_w-1 downto 0);  -- Output register containing the next taps data
83
    out_val_ena  : std_logic;                                  -- Output enable 
84
  end record;
85
 
86
  signal r, rin : reg_type;
87
 
88
begin
89
 
90
  comb : process(r, rst, in_val, in_dat, taps_in_vec)
91
    variable v : reg_type;
92
  begin
93
 
94
    v := r;
95
    v.wr_en  := '0';
96
 
97
    -- Perform the shifting for the shiftregister for the valid signal and the input data: 
98
    v.val_dly(0) := in_val;
99
    v.val_dly(c_tot_latency-1 downto 1) := r.val_dly(c_tot_latency-2 downto 0);
100
    v.in_dat_arr(0) := RESIZE_SVEC(in_dat, r.in_dat_arr(0)'LENGTH);
101
    v.in_dat_arr(g_fil_ppf_pipeline.mem_delay downto 1) := r.in_dat_arr(g_fil_ppf_pipeline.mem_delay-1 downto 0);
102
 
103
    if(r.val_dly(0) = '1') then                                 -- Wait for incoming data
104
      v.rd_addr := INCR_UVEC(r.rd_addr, 1);
105
    end if;
106
 
107
    if(r.val_dly(c_tot_latency-2) = '1') then                                 -- Wait for incoming data
108
      if(r.init_dly_cnt < c_filter_zdly) then
109
        v.init_dly_cnt := r.init_dly_cnt + 1;
110
        v.out_val_ena := '0';
111
      else
112
        v.out_val_ena := '1';
113
      end if;
114
    end if;
115
 
116
    if(r.val_dly(g_fil_ppf_pipeline.mem_delay+1) = '1') then
117
      v.wr_addr := INCR_UVEC(r.wr_addr, 1);
118
    end if;
119
 
120
    if(r.val_dly(g_fil_ppf_pipeline.mem_delay) = '1') then
121
      for I in 0 to g_fil_ppf.nof_streams-1 loop
122
        v.taps_out_vec((I+1)*c_single_taps_vec_w-1 downto I*c_single_taps_vec_w) := taps_in_vec((I+1)*c_single_taps_vec_w - g_fil_ppf.in_dat_w -1 downto I*c_single_taps_vec_w) & r.in_dat_arr(g_fil_ppf_pipeline.mem_delay)((I+1)*g_fil_ppf.in_dat_w-1 downto I*g_fil_ppf.in_dat_w);
123
      end loop;
124
      --v.taps_out_vec := taps_in_vec(taps_in_vec'HIGH - g_fil_ppf.in_dat_w downto 0) & r.in_dat_arr(g_fil_ppf_pipeline.mem_delay);
125
      v.wr_en        := '1';
126
    end if;
127
 
128
    if(rst = '1') then
129
      v.init_dly_cnt := 0;
130
      v.in_dat_arr   := (others => (others => '0'));
131
      v.val_dly      := (others => '0');
132
      v.rd_addr      := (others => '0');
133
      v.wr_addr      := (others => '0');
134
      v.wr_en        := '0';
135
      v.taps_out_vec := (others => '0');
136
      v.out_val_ena  := '0';
137
    end if;
138
 
139
    rin <= v;
140
 
141
  end process comb;
142
 
143
  regs : process(clk)
144
  begin
145
    if rising_edge(clk) then
146
      r <= rin;
147
    end if;
148
  end process;
149
 
150
  taps_rdaddr  <= r.rd_addr;
151
  taps_wraddr  <= r.wr_addr;
152
  taps_wren    <= r.wr_en;
153
  taps_out_vec <= r.taps_out_vec;
154
  out_val      <= r.val_dly(c_tot_latency-1) AND r.out_val_ena;
155
 
156
end rtl;

powered by: WebSVN 2.1.0

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