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

Subversion Repositories astron_r2sdf_fft

[/] [astron_r2sdf_fft/] [trunk/] [rTwoBFStage.vhd] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 danv
--------------------------------------------------------------------------------
2
--
3 3 danv
-- Copyright 2020
4
-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
5
-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
6
-- 
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, common_pkg_lib, common_components_lib;
22
use IEEE.std_logic_1164.all;
23
use common_pkg_lib.common_pkg.all;
24
 
25
entity rTwoBFStage is
26
  generic (
27
    -- generics for this stage
28
    g_nof_chan      : natural := 0;   -- Exponent of nr of subbands (0 means 1 subband)
29
    g_stage         : natural;        -- The stage indices are ..., 3, 2, 1. The input stage has the highest index, the output stage has index 1.
30
    g_bf_lat        : natural := 1;   -- Digital pipelining latency
31
    -- generics for rTwoBF
32
    g_bf_use_zdly   : natural := 1;   -- >= 1. Stage high downto g_bf_use_zdly will will use g_bf_in_a_zdly and g_bf_out_zdly
33
    g_bf_in_a_zdly  : natural := 0;   -- g_bf_in_a_zdly+g_bf_out_d_zdly must be <= the stage z^(-1) delay, note that stage 1 has only one z^(-1) delay
34
    g_bf_out_d_zdly : natural := 0    -- The stage z^(-1) delays are ..., 4, 2, 1.
35
  );
36
  port (
37
    clk      : in  std_logic;
38
    rst      : in  std_logic;
39
    in_re    : in  std_logic_vector;
40
    in_im    : in  std_logic_vector;
41
    in_val   : in  std_logic;
42
    in_sel   : in  std_logic;
43
    out_re   : out std_logic_vector;
44
    out_im   : out std_logic_vector;
45
    out_val  : out std_logic;
46
    out_sel  : out std_logic
47
  );
48
end entity rTwoBFStage;
49
 
50
architecture str of rTwoBFStage is
51
 
52
  -- Optionally move some z-1 delay into this BF stage, default 0
53
  constant c_bf_in_a_zdly   : natural := sel_a_b(g_stage >= g_bf_use_zdly, g_bf_in_a_zdly, 0);
54
  constant c_bf_out_b_zdly  : natural := sel_a_b(g_stage >= g_bf_use_zdly, g_bf_out_d_zdly, 0);
55
 
56
  constant c_bf_zdly        : natural := c_bf_in_a_zdly+c_bf_out_b_zdly;
57
  constant c_feedback_zdly  : natural := pow2(g_stage-1);
58
 
59
  -- The BF adds, subtracts or passes the data on, so typically c_out_dat_w = c_in_dat_w + 1
60
  constant c_in_dat_w       : natural := in_re'length;   -- re and im have same width
61
  constant c_out_dat_w      : natural := out_re'length;  -- re and im have same width
62
 
63
  -- Concatenate im & re into complex data to potentially ease synthesis to make more efficient use of block RAM memory for z-1 data feedback line
64
  signal bf_complex        : std_logic_vector(c_nof_complex*c_in_dat_w-1 downto 0);
65
  signal bf_complex_dly    : std_logic_vector(bf_complex'range);
66
  signal bf_re             : std_logic_vector(in_re'range);
67
  signal bf_re_dly         : std_logic_vector(in_re'range);
68
  signal bf_im             : std_logic_vector(in_im'range);
69
  signal bf_im_dly         : std_logic_vector(in_im'range);
70
  signal bf_sel            : std_logic;
71
  signal bf_val            : std_logic;
72
  signal bf_val_dly        : std_logic;
73
 
74
  signal stage_complex     : std_logic_vector(c_nof_complex*c_out_dat_w-1 downto 0);
75
  signal stage_complex_dly : std_logic_vector(stage_complex'range);
76
  signal stage_re          : std_logic_vector(out_re'range);
77
  signal stage_im          : std_logic_vector(out_im'range);
78
  signal stage_sel         : std_logic;
79
  signal stage_val         : std_logic;
80
 
81
begin
82
 
83
  ------------------------------------------------------------------------------
84
  -- butterfly
85
  ------------------------------------------------------------------------------
86
 
87
  u_bf_re : entity work.rTwoBF
88
  generic map (
89
    g_in_a_zdly  => c_bf_in_a_zdly,
90
    g_out_d_zdly => c_bf_out_b_zdly
91
  )
92
  port map (
93
    clk     => clk,
94
    in_a    => bf_re_dly,
95
    in_b    => in_re,
96
    in_sel  => in_sel,
97
    in_val  => in_val,
98
    out_c   => stage_re,
99
    out_d   => bf_re
100
  );
101
 
102
  u_bf_im : entity work.rTwoBF
103
  generic map (
104
    g_in_a_zdly  => c_bf_in_a_zdly,
105
    g_out_d_zdly => c_bf_out_b_zdly
106
  )
107
  port map (
108
    clk     => clk,
109
    in_a    => bf_im_dly,
110
    in_b    => in_im,
111
    in_sel  => in_sel,
112
    in_val  => in_val,
113
    out_c   => stage_im,
114
    out_d   => bf_im
115
  );
116
 
117
 
118
  ------------------------------------------------------------------------------
119
  -- feedback fifo
120
  ------------------------------------------------------------------------------
121
 
122
  bf_sel <= in_sel;
123
  bf_val <= in_val;
124
 
125
  bf_complex <= bf_im & bf_re;
126
  bf_re_dly  <= bf_complex_dly(  c_in_dat_w-1 downto 0);
127
  bf_im_dly  <= bf_complex_dly(2*c_in_dat_w-1 downto c_in_dat_w);
128
 
129
  -- share FIFO for Im & Re
130
  u_feedback : entity common_components_lib.common_delay
131
  generic map (
132
    g_dat_w  => bf_complex'length,
133
    g_depth  => c_feedback_zdly*(2**g_nof_chan)-c_bf_zdly
134
  )
135
  port map (
136
    clk     => clk,
137
    in_dat  => bf_complex,
138
    in_val  => bf_val,
139
    out_dat => bf_complex_dly
140
  );
141
 
142
  -- compensate for feedback fifo
143
  u_stage_sel : entity common_components_lib.common_bit_delay
144
  generic map (
145
    g_depth => c_feedback_zdly*(2**g_nof_chan)
146
  )
147
  port map (
148
    clk     => clk,
149
    rst     => rst,
150
    in_clr  => '0',
151
    in_val  => bf_val,
152
    in_bit  => bf_sel,
153
    out_bit => stage_sel
154
  );
155
 
156
  -- compensate for feedback fifo
157
  u_stage_val : entity common_components_lib.common_bit_delay
158
  generic map (
159
    g_depth => c_feedback_zdly*(2**g_nof_chan)
160
  )
161
  port map (
162
    clk     => clk,
163
    rst     => rst,
164
    in_clr  => '0',
165
    in_val  => bf_val,
166
    in_bit  => bf_val,
167
    out_bit => bf_val_dly
168
  );
169
 
170
  -- after the z^(-1) stage delay the bf_val_dly goes high and remains high and acts as an enable for in_val to out_val
171
  stage_val <= in_val and bf_val_dly;
172
 
173
 
174
  ------------------------------------------------------------------------------
175
  -- stage output pipelining
176
  ------------------------------------------------------------------------------
177
 
178
  stage_complex <= stage_im & stage_re;
179
 
180
  u_pipeline_out : entity common_components_lib.common_pipeline
181
  generic map (
182
    g_pipeline  => g_bf_lat,
183
    g_in_dat_w  => stage_complex'length,
184
    g_out_dat_w => stage_complex'length
185
  )
186
  port map (
187
    clk     => clk,
188
    in_dat  => stage_complex,
189
    out_dat => stage_complex_dly
190
  );
191
 
192
  out_re <= stage_complex_dly(  c_out_dat_w-1 downto 0);
193
  out_im <= stage_complex_dly(2*c_out_dat_w-1 downto c_out_dat_w);
194
 
195
  u_out_sel : entity common_components_lib.common_pipeline_sl
196
  generic map (
197
    g_pipeline => g_bf_lat
198
  )
199
  port map (
200
    clk     => clk,
201
    in_dat  => stage_sel,
202
    out_dat => out_sel
203
  );
204
 
205
  u_out_val : entity common_components_lib.common_pipeline_sl
206
  generic map (
207
    g_pipeline => g_bf_lat
208
  )
209
  port map (
210
    clk     => clk,
211
    in_dat  => stage_val,
212
    out_dat => out_val
213
  );
214
 
215
end str;

powered by: WebSVN 2.1.0

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