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

Subversion Repositories astron_r2sdf_fft

[/] [astron_r2sdf_fft/] [trunk/] [rTwoSDFStage.vhd] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 danv
--------------------------------------------------------------------------------
2
--   Author: Raj Thilak Rajan : rajan at astron.nl: Nov 2009
3
--   Copyright (C) 2009-2010
4
--   ASTRON (Netherlands Institute for Radio Astronomy)
5
--   P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
6
--
7
--   This file is part of the UniBoard software suite.
8
--   The file is free software: you can redistribute it and/or modify
9
--   it under the terms of the GNU General Public License as published by
10
--   the Free Software Foundation, either version 3 of the License, or
11
--   (at your option) any later version.
12
--
13
--   This program is distributed in the hope that it will be useful,
14
--   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
--   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
--   GNU General Public License for more details.
17
--
18
--   You should have received a copy of the GNU General Public License
19
--   along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
--------------------------------------------------------------------------------
21
 
22
library ieee, common_pkg_lib, common_components_lib, common_counter_lib, common_requantize_lib;
23
use IEEE.std_logic_1164.all;
24
use common_pkg_lib.common_pkg.all;
25
use work.twiddlesPkg.all;
26
use work.rTwoSDFPkg.all;
27
 
28
entity rTwoSDFStage is
29
  generic (
30
    g_nof_chan       : natural := 0;     -- Exponent of nr of subbands (0 means 1 subband)
31
    g_stage          : natural := 8;
32
    g_stage_offset   : natural := 0; -- The Stage offset: 0 for normal FFT. Other than 0 in wideband FFT
33
    g_twiddle_offset : natural := 0; -- The twiddle offset: 0 for normal FFT. Other than 0 in wideband FFT
34
    g_scale_enable   : boolean := TRUE; -- 
35
    g_pipeline       : t_fft_pipeline := c_fft_pipeline  -- internal pipeline settings
36
  );
37
  port (
38
    clk     : in  std_logic;
39
    rst     : in  std_logic;
40
    in_re   : in  std_logic_vector;
41
    in_im   : in  std_logic_vector;
42
    in_val  : in  std_logic;
43
    out_re  : out std_logic_vector;
44
    out_im  : out std_logic_vector;
45
    out_val : out std_logic
46
  );
47
end entity rTwoSDFStage;
48
 
49
architecture str of rTwoSDFStage is
50
 
51
  -- The amplification factor per stage is 2, therefor bit growth defintion of 1.
52
  -- Scale enable is defined by generic.
53
  constant c_rtwo_stage_bit_growth : natural := sel_a_b(g_scale_enable, 1, 0);
54
 
55
  -- counter for ctrl_sel 
56
  constant c_cnt_lat    : integer := 1;
57
  constant c_cnt_init   : integer := 0;
58
 
59
  signal ctrl_sel       : std_logic_vector(g_stage + g_nof_chan downto 1);
60
 
61
  signal in_sel         : std_logic;
62
 
63
  signal bf_re          : std_logic_vector(in_re'range);
64
  signal bf_im          : std_logic_vector(in_im'range);
65
  signal bf_sel         : std_logic;
66
  signal bf_val         : std_logic;
67
 
68
  signal weight_addr    : std_logic_vector(g_stage-1 downto 1);
69
  signal weight_re      : wTyp;
70
  signal weight_im      : wTyp;
71
 
72
  signal mul_out_re     : std_logic_vector(out_re'range);
73
  signal mul_out_im     : std_logic_vector(out_im'range);
74
  signal mul_out_val    : std_logic;
75
 
76
  signal quant_out_re   : std_logic_vector(out_re'range);
77
  signal quant_out_im   : std_logic_vector(out_im'range);
78
 
79
begin
80
 
81
  ------------------------------------------------------------------------------
82
  -- stage counter
83
  ------------------------------------------------------------------------------
84
  u_control : entity common_counter_lib.common_counter
85
  generic map (
86
    g_latency   => c_cnt_lat,
87
    g_init      => c_cnt_init,
88
    g_width     => g_stage + g_nof_chan,
89
    g_step_size => 1
90
  )
91
  port map (
92
    rst         => rst,
93
    clk         => clk,
94
    cnt_en      => in_val,
95
    count       => ctrl_sel
96
  );
97
 
98
  ------------------------------------------------------------------------------
99
  -- complex butterfly
100
  ------------------------------------------------------------------------------
101
  in_sel <= ctrl_sel(g_stage + g_nof_chan);
102
 
103
  u_butterfly: entity work.rTwoBFStage
104
  generic map (
105
    g_nof_chan      => g_nof_chan,
106
    g_stage         => g_stage,
107
    g_bf_lat        => g_pipeline.bf_lat,
108
    g_bf_use_zdly   => g_pipeline.bf_use_zdly,
109
    g_bf_in_a_zdly  => g_pipeline.bf_in_a_zdly,
110
    g_bf_out_d_zdly => g_pipeline.bf_out_d_zdly
111
  )
112
  port map (
113
    clk       => clk,
114
    rst       => rst,
115
    in_re     => in_re,
116
    in_im     => in_im,
117
    in_sel    => in_sel,
118
    in_val    => in_val,
119
    out_re    => bf_re,
120
    out_im    => bf_im,
121
    out_sel   => bf_sel,
122
    out_val   => bf_val
123
  );
124
 
125
  ------------------------------------------------------------------------------
126
  -- get twiddles
127
  ------------------------------------------------------------------------------
128
  weight_addr <= ctrl_sel(g_stage + g_nof_chan-1 downto g_nof_chan + 1);
129
 
130
  u_weights: entity work.rTwoWeights
131
  generic map (
132
    g_stage          => g_stage,
133
    g_twiddle_offset => g_twiddle_offset,
134
    g_stage_offset   => g_stage_offset,
135
    g_lat            => g_pipeline.weight_lat
136
  )
137
  port map (
138
    clk       => clk,
139
    in_wAdr   => weight_addr,
140
    weight_re => weight_re,
141
    weight_im => weight_im
142
  );
143
 
144
  ------------------------------------------------------------------------------
145
  -- twiddle multiplication
146
  ------------------------------------------------------------------------------
147
  u_TwiddleMult: entity work.rTwoWMul
148
  generic map (
149
    g_stage => g_stage,
150
    g_lat   => g_pipeline.mul_lat
151
  )
152
  port map (
153
    clk         => clk,
154
    rst         => rst,
155
    weight_re   => weight_re,
156
    weight_im   => weight_im,
157
    in_re       => bf_re,
158
    in_im       => bf_im,
159
    in_val      => bf_val,
160
    in_sel      => bf_sel,
161
    out_re      => mul_out_re,
162
    out_im      => mul_out_im,
163
    out_val     => mul_out_val
164
  );
165
 
166
  ------------------------------------------------------------------------------
167
  -- stage requantization
168
  ------------------------------------------------------------------------------
169
  u_requantize_re : entity common_requantize_lib.common_requantize
170
  generic map (
171
    g_representation      => "SIGNED",
172
    g_lsb_w               => c_rtwo_stage_bit_growth,
173
    g_lsb_round           => TRUE,
174
    g_lsb_round_clip      => FALSE,
175
    g_msb_clip            => FALSE,
176
    g_msb_clip_symmetric  => FALSE,
177
    g_pipeline_remove_lsb => 0,
178
    g_pipeline_remove_msb => 0,
179
    g_in_dat_w            => in_re'LENGTH,
180
    g_out_dat_w           => out_re'LENGTH
181
  )
182
  port map (
183
    clk        => clk,
184
    clken      => '1',
185
    in_dat     => mul_out_re,
186
    out_dat    => quant_out_re,
187
    out_ovr    => open
188
  );
189
 
190
  u_requantize_im : entity common_requantize_lib.common_requantize
191
  generic map (
192
    g_representation      => "SIGNED",
193
    g_lsb_w               => c_rtwo_stage_bit_growth,
194
    g_lsb_round           => TRUE,
195
    g_lsb_round_clip      => FALSE,
196
    g_msb_clip            => FALSE,
197
    g_msb_clip_symmetric  => FALSE,
198
    g_pipeline_remove_lsb => 0,
199
    g_pipeline_remove_msb => 0,
200
    g_in_dat_w            => in_im'LENGTH,
201
    g_out_dat_w           => out_im'LENGTH
202
  )
203
  port map (
204
    clk        => clk,
205
    clken      => '1',
206
    in_dat     => mul_out_im,
207
    out_dat    => quant_out_im,
208
    out_ovr    => open
209
  );
210
 
211
  ------------------------------------------------------------------------------
212
  -- output
213
  ------------------------------------------------------------------------------
214
  u_re_lat : entity common_components_lib.common_pipeline
215
  generic map (
216
    g_pipeline  => g_pipeline.stage_lat,
217
    g_in_dat_w  => out_re'length,
218
    g_out_dat_w => out_re'length
219
  )
220
  port map (
221
    clk     => clk,
222
    in_dat  => quant_out_re,
223
    out_dat => out_re
224
  );
225
 
226
  u_im_lat : entity common_components_lib.common_pipeline
227
  generic map (
228
    g_pipeline  => g_pipeline.stage_lat,
229
    g_in_dat_w  => out_im'length,
230
    g_out_dat_w => out_im'length
231
  )
232
  port map (
233
    clk     => clk,
234
    in_dat  => quant_out_im,
235
    out_dat => out_im
236
  );
237
 
238
  u_val_lat : entity common_components_lib.common_pipeline_sl
239
  generic map (
240
    g_pipeline => g_pipeline.stage_lat
241
  )
242
  port map (
243
    clk     => clk,
244
    in_dat  => mul_out_val,
245
    out_dat => out_val
246
  );
247
 
248
end str;

powered by: WebSVN 2.1.0

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