БПФ 16 с прореживанием по времени

PTA
Сообщения: 2
Зарегистрирован: 10 сен 2019, 13:46

БПФ 16 с прореживанием по времени

Сообщение PTA »

Здравствуйте, я только постигаю азы цифровой обработки сигналов. Ознакомившись с алгоритмом БПФ16, была предпринята попытка описать его. Результат моделирования показывает, что описание неверно. Помогите разобраться,пожалуйста, почему.

Код: Выделить всё

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;
use IEEE.numeric_std.all;

entity fft16vhd is
	Generic (
		-- размерность входных данных
		b_size: natural := 15;
		-- размерность пов. множит
		w_size: natural := 12
		);
	Port (
		-- тактовая частота
		clk : in std_logic;
		-- общий сброс
		rst	: in std_logic;
		-- входные данные реал
		dinr0	: in std_logic_vector(b_size downto 0);
		dinr1	: in std_logic_vector(b_size downto 0);
		dinr2	: in std_logic_vector(b_size downto 0);
		dinr3	: in std_logic_vector(b_size downto 0);
		dinr4	: in std_logic_vector(b_size downto 0);
		dinr5	: in std_logic_vector(b_size downto 0);
		dinr6	: in std_logic_vector(b_size downto 0);
		dinr7	: in std_logic_vector(b_size downto 0);	
		dinr8	: in std_logic_vector(b_size downto 0);
		dinr9	: in std_logic_vector(b_size downto 0);
		dinr10	: in std_logic_vector(b_size downto 0);
		dinr11	: in std_logic_vector(b_size downto 0);
		dinr12	: in std_logic_vector(b_size downto 0);
		dinr13	: in std_logic_vector(b_size downto 0);
		dinr14	: in std_logic_vector(b_size downto 0);
		dinr15	: in std_logic_vector(b_size downto 0);
		-- входные данные мним
		dini0	: in std_logic_vector(b_size downto 0);
		dini1	: in std_logic_vector(b_size downto 0);
		dini2	: in std_logic_vector(b_size downto 0);
		dini3	: in std_logic_vector(b_size downto 0);
		dini4	: in std_logic_vector(b_size downto 0);
		dini5	: in std_logic_vector(b_size downto 0);
		dini6	: in std_logic_vector(b_size downto 0);
		dini7	: in std_logic_vector(b_size downto 0);	  
		
		dini8	: in std_logic_vector(b_size downto 0);
		dini9	: in std_logic_vector(b_size downto 0);
		dini10	: in std_logic_vector(b_size downto 0);
		dini11	: in std_logic_vector(b_size downto 0);
		dini12	: in std_logic_vector(b_size downto 0);
		dini13	: in std_logic_vector(b_size downto 0);
		dini14	: in std_logic_vector(b_size downto 0);
		dini15	: in std_logic_vector(b_size downto 0);
		-- импульс записи данных 
		wrdata	: in std_logic;

		-- выход счетчика стадий 
		ctfout	: out std_logic_vector(3 downto 0);
		-- выходы данных реал
		doutr0	: out std_logic_vector(b_size downto 0);
		doutr1	: out std_logic_vector(b_size downto 0);
		doutr2	: out std_logic_vector(b_size downto 0);
		doutr3	: out std_logic_vector(b_size downto 0);
		doutr4	: out std_logic_vector(b_size downto 0);
		doutr5	: out std_logic_vector(b_size downto 0);
		doutr6	: out std_logic_vector(b_size downto 0);
		doutr7	: out std_logic_vector(b_size downto 0); 
		doutr8	: out std_logic_vector(b_size downto 0);
		doutr9	: out std_logic_vector(b_size downto 0);
		doutr10	: out std_logic_vector(b_size downto 0);
		doutr11	: out std_logic_vector(b_size downto 0);
		doutr12	: out std_logic_vector(b_size downto 0);
		doutr13	: out std_logic_vector(b_size downto 0);
		doutr14	: out std_logic_vector(b_size downto 0);
		doutr15	: out std_logic_vector(b_size downto 0);
		-- выходы данных мним
		douti0	: out std_logic_vector(b_size downto 0);
		douti1	: out std_logic_vector(b_size downto 0);
		douti2	: out std_logic_vector(b_size downto 0);
		douti3	: out std_logic_vector(b_size downto 0);
		douti4	: out std_logic_vector(b_size downto 0);
		douti5	: out std_logic_vector(b_size downto 0);
		douti6	: out std_logic_vector(b_size downto 0);
		douti7	: out std_logic_vector(b_size downto 0);  
		douti8	: out std_logic_vector(b_size downto 0);
		douti9	: out std_logic_vector(b_size downto 0);
		douti10	: out std_logic_vector(b_size downto 0);
		douti11	: out std_logic_vector(b_size downto 0);
		douti12	: out std_logic_vector(b_size downto 0);
		douti13	: out std_logic_vector(b_size downto 0);
		douti14	: out std_logic_vector(b_size downto 0);
		douti15	: out std_logic_vector(b_size downto 0)

		
		);
end fft16vhd;

architecture behavioural of fft16vhd is
attribute multstyle : string;
-- на базе логики
attribute multstyle of behavioural : architecture is "logic";
-- на базе встроенных умножителей
--attribute multstyle of behavioural : architecture is "dsp";

	-- счетчик стадий
	signal s_ctf 	: std_logic_vector(3 downto 0);
	-- признак загрузки данных 
	signal s_ld 	: std_logic;
	-- флаг разрешения преобразования
	signal s_begpr 	: std_logic;
---------------------------------------------------------------
	-- буферные сигналы реал
	subtype sdbr is signed(b_size downto 0);
	type memory_sdbr is array(15 downto 0) of sdbr;
	signal s_in_r_sig : memory_sdbr;
	-- буферные сигналы мним
	subtype sdbi is signed(b_size downto 0);
	type memory_sdbi is array(15 downto 0) of sdbi;
	signal s_in_i_sig : memory_sdbi;
-----------------------------------------------------------------
	-- сигналы умножения 1_ой стадии реал
	subtype mult1_re_sig is signed(b_size + w_size + 1 downto 0);
	type memory_mult1_re_sig is array(7 downto 0) of mult1_re_sig;
	signal s_mult1_re_sig : memory_mult1_re_sig;
	-- сигналы умножения 1_ой стадии мним
	subtype mult1_im_sig is signed(b_size + w_size + 1 downto 0);
	type memory_mult1_im_sig is array(7 downto 0) of mult1_im_sig;
	signal s_mult1_im_sig : memory_mult1_im_sig;

	-- сигналы суммы 1_ой стадии реал
	subtype sum1_re_sig is signed(b_size downto 0);
	type memory_sum1_re_sig is array(15 downto 0) of sum1_re_sig;
	signal s_sum1_re_sig : memory_sum1_re_sig;
	-- сигналы суммы 1_ой стадии мним
	subtype sum1_im_sig is signed(b_size downto 0);
	type memory_sum1_im_sig is array(15 downto 0) of sum1_im_sig;
	signal s_sum1_im_sig : memory_sum1_im_sig;
-------------------------------------------------------------------
	-- сигналы умножения 2_ой стадии реал
	subtype mult2_re_sig is signed(b_size + w_size + 1 downto 0);
	type memory_mult2_re_sig is array(7 downto 0) of mult2_re_sig;
	signal s_mult2_re_sig : memory_mult2_re_sig;
	-- сигналы умножения 2_ой стадии мним
	subtype mult2_im_sig is signed(b_size + w_size + 1 downto 0);
	type memory_mult2_im_sig is array(7 downto 0) of mult2_im_sig;
	signal s_mult2_im_sig : memory_mult2_im_sig;

	-- сигналы суммы 2_ой стадии реал
	subtype sum2_re_sig is signed(b_size downto 0);
	type memory_sum2_re_sig is array(15 downto 0) of sum2_re_sig;
	signal s_sum2_re_sig : memory_sum2_re_sig;
	-- сигналы суммы 2_ой стадии мним
	subtype sum2_im_sig is signed(b_size downto 0);
	type memory_sum2_im_sig is array(15 downto 0) of sum2_im_sig;
	signal s_sum2_im_sig : memory_sum2_im_sig;
-----------------------------------------------------------------
	-- сигналы умножения 3_й стадии реал
	subtype mult3_re_sig is signed(b_size + w_size + 1 downto 0);
	type memory_mult3_re_sig is array(7 downto 0) of mult3_re_sig;
	signal s_mult3_re_sig : memory_mult3_re_sig;
	-- сигналы умножения 3_й стадии мним
	subtype mult3_im_sig is signed(b_size + w_size + 1 downto 0);
	type memory_mult3_im_sig is array(7 downto 0) of mult3_im_sig;
	signal s_mult3_im_sig : memory_mult3_im_sig;

	-- сигналы суммы 3_й стадии реал
	subtype sum3_re_sig is signed(b_size downto 0);
	type memory_sum3_re_sig is array(15 downto 0) of sum3_re_sig;
	signal s_sum3_re_sig : memory_sum3_re_sig;
	-- сигналы суммы 3_й стадии мним
	subtype sum3_im_sig is signed(b_size downto 0);
	type memory_sum3_im_sig is array(15 downto 0) of sum3_im_sig;
	signal s_sum3_im_sig : memory_sum3_im_sig;

-----------------------------------------------------------	 
-- сигналы умножения 4_й стадии реал
	subtype mult4_re_sig is signed(b_size + w_size + 1 downto 0);
	type memory_mult4_re_sig is array(7 downto 0) of mult4_re_sig;
	signal s_mult4_re_sig : memory_mult4_re_sig;
	-- сигналы умножения 4_й стадии мним
	subtype mult4_im_sig is signed(b_size + w_size + 1 downto 0);
	type memory_mult4_im_sig is array(7 downto 0) of mult4_im_sig;
	signal s_mult4_im_sig : memory_mult4_im_sig;

	-- сигналы суммы 4_й стадии реал
	subtype sum4_re_sig is signed(b_size downto 0);
	type memory_sum4_re_sig is array(15 downto 0) of sum4_re_sig;
	signal s_sum4_re_sig : memory_sum4_re_sig;
	-- сигналы суммы 4_й стадии мним
	subtype sum4_im_sig is signed(b_size downto 0);
	type memory_sum4_im_sig is array(15 downto 0) of sum4_im_sig;
	signal s_sum4_im_sig : memory_sum4_im_sig;

-----------------------------------------------------------

	-- сигналы для поворачивающих множителей реал
	signal s_w_r_16_0_sig: signed(w_size - 1 downto 0);
	signal s_w_r_16_1_sig: signed(w_size - 1 downto 0);
	signal s_w_r_16_2_sig: signed(w_size - 1 downto 0);
	signal s_w_r_16_3_sig: signed(w_size - 1 downto 0); 
	
	signal s_w_r_16_4_sig: signed(w_size - 1 downto 0);
	signal s_w_r_16_5_sig: signed(w_size - 1 downto 0);
	signal s_w_r_16_6_sig: signed(w_size - 1 downto 0);
	signal s_w_r_16_7_sig: signed(w_size - 1 downto 0);
	-- сигналы для поворачивающих множителей мним
	signal s_w_i_16_0_sig: signed(w_size - 1 downto 0);
	signal s_w_i_16_1_sig: signed(w_size - 1 downto 0);
	signal s_w_i_16_2_sig: signed(w_size - 1 downto 0);
	signal s_w_i_16_3_sig: signed(w_size - 1 downto 0);	 
	
	signal s_w_i_16_4_sig: signed(w_size - 1 downto 0);
	signal s_w_i_16_5_sig: signed(w_size - 1 downto 0);
	signal s_w_i_16_6_sig: signed(w_size - 1 downto 0);
	signal s_w_i_16_7_sig: signed(w_size - 1 downto 0);

	-- поворачивающие множители
	-- round(cos(2*pi*n/8)*1024)
	-- round(sin(2*pi*n/8)*1024)
	-- n = 0...3
	-- реал
	constant c_w_re_0  : integer := 1024;	
	constant c_w_re_1  : integer := 946;	
	constant c_w_re_2  : integer := 724;	
	constant c_w_re_3  : integer := 392;	
	constant c_w_re_4  : integer := 0;	
	constant c_w_re_5  : integer := -392;	
	constant c_w_re_6  : integer := -724;	
	constant c_w_re_7  : integer := -946;	
	-- мним
	constant c_w_im_0  : integer := 0;	
	constant c_w_im_1  : integer := -392;	
	constant c_w_im_2  : integer := -724;	
	constant c_w_im_3  : integer := -946;	
	constant c_w_im_4  : integer := -1024;	
	constant c_w_im_5  : integer := -946;	
	constant c_w_im_6  : integer := -724;	
	constant c_w_im_7  : integer := -392;	

begin

-- счетчик стадий
process(clk, s_ctf)
begin
	if clk'event and clk = '1' then
		if rst = '0' then	
			s_ctf <= (others => '0');
			s_begpr <= '0';
		elsif s_ld = '1' and s_begpr = '0' then 
			s_begpr <= '1';
		end if;
		if s_begpr = '1' then	
			s_ctf <= s_ctf + 1;	
			if s_ctf = 8 then
				s_ctf <= (others => '0');
				s_begpr <= '0';
			end if;	
		end if;
	end if;

	ctfout <= s_ctf;
	
end process;		
	
-- загрузка данных
process(clk)
begin
	if clk'event and clk = '1' then
		if rst = '0' or s_ctf = 8 then	
			s_ld <= '0';
		elsif wrdata = '1' and s_ld = '0' then 
			-- реал входные данные
			s_in_r_sig(0) <= signed(dinr0);
			s_in_r_sig(1) <= signed(dinr1);
			s_in_r_sig(2) <= signed(dinr2);
			s_in_r_sig(3) <= signed(dinr3);
			s_in_r_sig(4) <= signed(dinr4);
			s_in_r_sig(5) <= signed(dinr5);
			s_in_r_sig(6) <= signed(dinr6);
			s_in_r_sig(7) <= signed(dinr7);
			s_in_r_sig(8) <= signed(dinr8);
			s_in_r_sig(9) <= signed(dinr9);
			s_in_r_sig(10) <= signed(dinr10);
			s_in_r_sig(11) <= signed(dinr11);
			s_in_r_sig(12) <= signed(dinr12);
			s_in_r_sig(13) <= signed(dinr13);
			s_in_r_sig(14) <= signed(dinr14);
			s_in_r_sig(15) <= signed(dinr15);
			-- мним входные данные
			s_in_i_sig(0) <= signed(dini0);
			s_in_i_sig(1) <= signed(dini1);
			s_in_i_sig(2) <= signed(dini2);
			s_in_i_sig(3) <= signed(dini3);
			s_in_i_sig(4) <= signed(dini4);
			s_in_i_sig(5) <= signed(dini5);
			s_in_i_sig(6) <= signed(dini6);
			s_in_i_sig(7) <= signed(dini7);	
			s_in_i_sig(8) <= signed(dini8);
			s_in_i_sig(9) <= signed(dini9);
			s_in_i_sig(10) <= signed(dini10);
			s_in_i_sig(11) <= signed(dini11);
			s_in_i_sig(12) <= signed(dini12);
			s_in_i_sig(13) <= signed(dini13);
			s_in_i_sig(14) <= signed(dini14);
			s_in_i_sig(15) <= signed(dini15);
			-- реал поворачивающие множители
			s_w_r_16_0_sig <= to_signed(c_w_re_0, w_size);
			s_w_r_16_1_sig <= to_signed(c_w_re_1, w_size);
			s_w_r_16_2_sig <= to_signed(c_w_re_2, w_size);
			s_w_r_16_3_sig <= to_signed(c_w_re_3, w_size);
			s_w_r_16_4_sig <= to_signed(c_w_re_4, w_size);
			s_w_r_16_5_sig <= to_signed(c_w_re_5, w_size);
			s_w_r_16_6_sig <= to_signed(c_w_re_6, w_size);
			s_w_r_16_7_sig <= to_signed(c_w_re_7, w_size);
			-- мним поворачивающие множители
			s_w_i_16_0_sig <= to_signed(c_w_im_0, w_size);
			s_w_i_16_1_sig <= to_signed(c_w_im_1, w_size);
			s_w_i_16_2_sig <= to_signed(c_w_im_2, w_size);
			s_w_i_16_3_sig <= to_signed(c_w_im_3, w_size);
			s_w_i_16_4_sig <= to_signed(c_w_im_4, w_size);
			s_w_i_16_5_sig <= to_signed(c_w_im_5, w_size);
			s_w_i_16_6_sig <= to_signed(c_w_im_6, w_size);
			s_w_i_16_7_sig <= to_signed(c_w_im_7, w_size);
			-- загрузка состоялась
			s_ld <= '1';
		end if;
	end if;

end process;	

-- операция fft8 (прореживание по времени)

-- architecture behavioral of fft_radix_2 is
-- signal product_1,product_2 : std_logic_vector(32 downto 0);
-- begin
-- product_1 <= (y_r*w_r) - (y_i*w_i);
-- product_2 <= (y_r*w_i) + (y_i*w_r);
-- A_r <= x_r + product_1(15 downto 0);
-- A_i <= x_i + product_2(15 downto 0);
-- B_r <= x_r - product_1(15 downto 0);
-- B_i <= x_i - product_2(15 downto 0);

process(clk, s_sum3_re_sig, s_sum3_im_sig, s_sum1_re_sig, s_sum1_im_sig, s_sum2_re_sig, s_sum2_im_sig)
begin
	if clk'event and clk = '1' then
		-- 1_я стадия fft8 s_ctf = 1,2
		if s_ctf = 1 and s_begpr = '1' then
			-- комплексное умножение 1_я стадия (результат в b_size + w_size + 2)
			-- 1_я бабочка
			s_mult1_re_sig(0) <= resize((s_in_r_sig(8)*s_w_r_16_0_sig - s_in_i_sig(8)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult1_im_sig(0) <= resize((s_in_r_sig(8)*s_w_i_16_0_sig + s_in_i_sig(8)*s_w_r_16_0_sig), b_size + w_size + 2);
			-- 2_я бабочка
			s_mult1_re_sig(1) <= resize((s_in_r_sig(12)*s_w_r_16_0_sig - s_in_i_sig(12)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult1_im_sig(1) <= resize((s_in_r_sig(12)*s_w_i_16_0_sig + s_in_i_sig(12)*s_w_r_16_0_sig), b_size + w_size + 2);
			-- 3_я бабочка
			s_mult1_re_sig(2) <= resize((s_in_r_sig(10)*s_w_r_16_0_sig - s_in_i_sig(10)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult1_im_sig(2) <= resize((s_in_r_sig(10)*s_w_i_16_0_sig + s_in_i_sig(10)*s_w_r_16_0_sig), b_size + w_size + 2);
			-- 4_я бабочка
			s_mult1_re_sig(3) <= resize((s_in_r_sig(14)*s_w_r_16_0_sig - s_in_i_sig(14)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult1_im_sig(3) <= resize((s_in_r_sig(14)*s_w_i_16_0_sig + s_in_i_sig(14)*s_w_r_16_0_sig), b_size + w_size + 2); 
			
			s_mult1_re_sig(4) <= resize((s_in_r_sig(9)*s_w_r_16_0_sig - s_in_i_sig(9)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult1_im_sig(4) <= resize((s_in_r_sig(9)*s_w_i_16_0_sig + s_in_i_sig(9)*s_w_r_16_0_sig), b_size + w_size + 2);
			
			s_mult1_re_sig(5) <= resize((s_in_r_sig(13)*s_w_r_16_0_sig - s_in_i_sig(13)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult1_im_sig(5) <= resize((s_in_r_sig(13)*s_w_i_16_0_sig + s_in_i_sig(13)*s_w_r_16_0_sig), b_size + w_size + 2);
			
			s_mult1_re_sig(6) <= resize((s_in_r_sig(11)*s_w_r_16_0_sig - s_in_i_sig(11)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult1_im_sig(6) <= resize((s_in_r_sig(11)*s_w_i_16_0_sig + s_in_i_sig(11)*s_w_r_16_0_sig), b_size + w_size + 2);
			
			s_mult1_re_sig(7) <= resize((s_in_r_sig(15)*s_w_r_16_0_sig - s_in_i_sig(15)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult1_im_sig(7) <= resize((s_in_r_sig(15)*s_w_i_16_0_sig + s_in_i_sig(15)*s_w_r_16_0_sig), b_size + w_size + 2);
			
		elsif s_ctf = 2 and s_begpr = '1' then
			-- комплексное суммирование 1-я стадия (результат в b_size)
			-- 0_вой выход 1_ой стадии
			s_sum1_re_sig(0) <= s_in_r_sig(0) + s_mult1_re_sig(0)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(0) <= s_in_i_sig(0) + s_mult1_im_sig(0)(b_size + w_size - 2 downto w_size - 2);
			-- 1_вый выход 1_ой стадии
			s_sum1_re_sig(1) <= s_in_r_sig(0) - s_mult1_re_sig(0)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(1) <= s_in_i_sig(0) - s_mult1_im_sig(0)(b_size + w_size - 2 downto w_size - 2);

			-- 2_ой выход 1_ой стадии
			s_sum1_re_sig(2) <= s_in_r_sig(2) + s_mult1_re_sig(1)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(2) <= s_in_i_sig(2) + s_mult1_im_sig(1)(b_size + w_size - 2 downto w_size - 2);
			-- 3_ий выход 1_ой стадии
			s_sum1_re_sig(3) <= s_in_r_sig(2) - s_mult1_re_sig(1)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(3) <= s_in_i_sig(2) - s_mult1_im_sig(1)(b_size + w_size - 2 downto w_size - 2);
			
			-- 4_ый выход 1_ой стадии
			s_sum1_re_sig(4) <= s_in_r_sig(4) + s_mult1_re_sig(2)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(4) <= s_in_i_sig(4) + s_mult1_im_sig(2)(b_size + w_size - 2 downto w_size - 2);
			-- 5_ый выход 1_ой стадии
			s_sum1_re_sig(5) <= s_in_r_sig(4) - s_mult1_re_sig(2)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(5) <= s_in_i_sig(4) - s_mult1_im_sig(2)(b_size + w_size - 2 downto w_size - 2);
			
			-- 6_ой выход 1_ой стадии
			s_sum1_re_sig(6) <= s_in_r_sig(6) + s_mult1_re_sig(3)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(6) <= s_in_i_sig(6) + s_mult1_im_sig(3)(b_size + w_size - 2 downto w_size - 2);
			-- 7_ой выход 1_ой стадии
			s_sum1_re_sig(7) <= s_in_r_sig(6) - s_mult1_re_sig(3)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(7) <= s_in_i_sig(6) - s_mult1_im_sig(3)(b_size + w_size - 2 downto w_size - 2); 
			
			s_sum1_re_sig(8) <= s_in_r_sig(8) + s_mult1_re_sig(4)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(8) <= s_in_i_sig(8) + s_mult1_im_sig(4)(b_size + w_size - 2 downto w_size - 2);
	
			s_sum1_re_sig(9) <= s_in_r_sig(8) - s_mult1_re_sig(4)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(9) <= s_in_i_sig(8) - s_mult1_im_sig(4)(b_size + w_size - 2 downto w_size - 2);

			
			s_sum1_re_sig(10) <= s_in_r_sig(10) + s_mult1_re_sig(5)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(10) <= s_in_i_sig(10) + s_mult1_im_sig(5)(b_size + w_size - 2 downto w_size - 2);
		
			s_sum1_re_sig(11) <= s_in_r_sig(10) - s_mult1_re_sig(5)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(11) <= s_in_i_sig(10) - s_mult1_im_sig(5)(b_size + w_size - 2 downto w_size - 2);
			
			
			s_sum1_re_sig(12) <= s_in_r_sig(12) + s_mult1_re_sig(6)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(12) <= s_in_i_sig(12) + s_mult1_im_sig(6)(b_size + w_size - 2 downto w_size - 2);
			
			s_sum1_re_sig(13) <= s_in_r_sig(12) - s_mult1_re_sig(6)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(13) <= s_in_i_sig(12) - s_mult1_im_sig(6)(b_size + w_size - 2 downto w_size - 2);
			
			
			s_sum1_re_sig(14) <= s_in_r_sig(14) + s_mult1_re_sig(7)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(14) <= s_in_i_sig(14) + s_mult1_im_sig(7)(b_size + w_size - 2 downto w_size - 2);
		
			s_sum1_re_sig(15) <= s_in_r_sig(14) - s_mult1_re_sig(7)(b_size + w_size - 2 downto w_size - 2);
			s_sum1_im_sig(15) <= s_in_i_sig(14) - s_mult1_im_sig(7)(b_size + w_size - 2 downto w_size - 2);

---------------------------------------------------------------------------------------
						
		-- 2_я стадия fft8 s_ctf = 3,4
		elsif (s_ctf = 3) and s_begpr = '1' then
			-- комплексное умножение 2_я стадия (результат в b_size + w_size + 2)
			-- 1_я бабочка
			s_mult2_re_sig(0) <= resize((s_sum1_re_sig(2)*s_w_r_16_0_sig - s_sum1_im_sig(2)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult2_im_sig(0) <= resize((s_sum1_re_sig(2)*s_w_i_16_0_sig + s_sum1_im_sig(2)*s_w_r_16_0_sig), b_size + w_size + 2);
			-- 2_я бабочка
			s_mult2_re_sig(1) <= resize((s_sum1_re_sig(3)*s_w_r_16_4_sig - s_sum1_im_sig(3)*s_w_i_16_4_sig), b_size + w_size + 2);
			s_mult2_im_sig(1) <= resize((s_sum1_re_sig(3)*s_w_i_16_4_sig + s_sum1_im_sig(3)*s_w_r_16_4_sig), b_size + w_size + 2);
			-- 3_я бабочка
			s_mult2_re_sig(2) <= resize((s_sum1_re_sig(6)*s_w_r_16_0_sig - s_sum1_im_sig(6)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult2_im_sig(2) <= resize((s_sum1_re_sig(6)*s_w_i_16_0_sig + s_sum1_im_sig(6)*s_w_r_16_0_sig), b_size + w_size + 2);
			-- 4_я бабочка
			s_mult2_re_sig(3) <= resize((s_sum1_re_sig(7)*s_w_r_16_4_sig - s_sum1_im_sig(7)*s_w_i_16_4_sig), b_size + w_size + 2);
			s_mult2_im_sig(3) <= resize((s_sum1_re_sig(7)*s_w_i_16_4_sig + s_sum1_im_sig(7)*s_w_r_16_4_sig), b_size + w_size + 2);
			
			s_mult2_re_sig(4) <= resize((s_sum1_re_sig(10)*s_w_r_16_0_sig - s_sum1_im_sig(10)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult2_im_sig(4) <= resize((s_sum1_re_sig(10)*s_w_i_16_0_sig + s_sum1_im_sig(10)*s_w_r_16_0_sig), b_size + w_size + 2);
			-- 6_я бабочка
			s_mult2_re_sig(5) <= resize((s_sum1_re_sig(11)*s_w_r_16_4_sig - s_sum1_im_sig(11)*s_w_i_16_4_sig), b_size + w_size + 2);
			s_mult2_im_sig(5) <= resize((s_sum1_re_sig(11)*s_w_i_16_4_sig + s_sum1_im_sig(11)*s_w_r_16_4_sig), b_size + w_size + 2);
			-- 7_я бабочка
			s_mult2_re_sig(6) <= resize((s_sum1_re_sig(14)*s_w_r_16_0_sig - s_sum1_im_sig(14)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult2_im_sig(6) <= resize((s_sum1_re_sig(14)*s_w_i_16_0_sig + s_sum1_im_sig(14)*s_w_r_16_0_sig), b_size + w_size + 2);
			-- 8_я бабочка
			s_mult2_re_sig(7) <= resize((s_sum1_re_sig(15)*s_w_r_16_4_sig - s_sum1_im_sig(15)*s_w_i_16_4_sig), b_size + w_size + 2);
			s_mult2_im_sig(7) <= resize((s_sum1_re_sig(15)*s_w_i_16_4_sig + s_sum1_im_sig(15)*s_w_r_16_4_sig), b_size + w_size + 2);

		elsif s_ctf = 4 and s_begpr = '1' then
			-- комплексное суммирование 2_я стадия (результат в b_size)
			-- 0_вой выход 2_й стадии
			s_sum2_re_sig(0) <= s_sum1_re_sig(0) + s_mult2_re_sig(0)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(0) <= s_sum1_im_sig(0) + s_mult2_im_sig(0)(b_size + w_size - 2 downto w_size - 2);
			-- 2_ой выход 2_ой стадии
			s_sum2_re_sig(2) <= s_sum1_re_sig(0) - s_mult2_re_sig(0)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(2) <= s_sum1_im_sig(0) - s_mult2_im_sig(0)(b_size + w_size - 2 downto w_size - 2);

			-- 1_й выход 2_й стадии
			s_sum2_re_sig(1) <= s_sum1_re_sig(1) + s_mult2_re_sig(1)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(1) <= s_sum1_im_sig(1) + s_mult2_im_sig(1)(b_size + w_size - 2 downto w_size - 2);
			-- 3_й выход 2_ой стадии
			s_sum2_re_sig(3) <= s_sum1_re_sig(1) - s_mult2_re_sig(1)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(3) <= s_sum1_im_sig(1) - s_mult2_im_sig(1)(b_size + w_size - 2 downto w_size - 2);

			-- 4_й выход 2_й стадии
			s_sum2_re_sig(4) <= s_sum1_re_sig(4) + s_mult2_re_sig(2)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(4) <= s_sum1_im_sig(4) + s_mult2_im_sig(2)(b_size + w_size - 2 downto w_size - 2);
			-- 6_й выход 2_ой стадии
			s_sum2_re_sig(6) <= s_sum1_re_sig(4) - s_mult2_re_sig(2)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(6) <= s_sum1_im_sig(4) - s_mult2_im_sig(2)(b_size + w_size - 2 downto w_size - 2);

			-- 5_й выход 2_й стадии
			s_sum2_re_sig(5) <= s_sum1_re_sig(5) + s_mult2_re_sig(3)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(5) <= s_sum1_im_sig(5) + s_mult2_im_sig(3)(b_size + w_size - 2 downto w_size - 2);
			-- 7_й выход 2_ой стадии
			s_sum2_re_sig(7) <= s_sum1_re_sig(5) - s_mult2_re_sig(3)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(7) <= s_sum1_im_sig(5) - s_mult2_im_sig(3)(b_size + w_size - 2 downto w_size - 2); 
			
			
			-- 8_вой выход 2_й стадии
			s_sum2_re_sig(8) <= s_sum1_re_sig(8) + s_mult2_re_sig(4)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(8) <= s_sum1_im_sig(8) + s_mult2_im_sig(4)(b_size + w_size - 2 downto w_size - 2);
			-- 9_ой выход 2_ой стадии
			s_sum2_re_sig(10) <= s_sum1_re_sig(8) - s_mult2_re_sig(4)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(10) <= s_sum1_im_sig(8) - s_mult2_im_sig(4)(b_size + w_size - 2 downto w_size - 2);

			-- 10_й выход 2_й стадии
			s_sum2_re_sig(9) <= s_sum1_re_sig(9) + s_mult2_re_sig(5)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(9) <= s_sum1_im_sig(9) + s_mult2_im_sig(5)(b_size + w_size - 2 downto w_size - 2);
			-- 11_й выход 2_ой стадии
			s_sum2_re_sig(11) <= s_sum1_re_sig(9) - s_mult2_re_sig(5)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(11) <= s_sum1_im_sig(9) - s_mult2_im_sig(5)(b_size + w_size - 2 downto w_size - 2);

			-- 12_й выход 2_й стадии
			s_sum2_re_sig(12) <= s_sum1_re_sig(12) + s_mult2_re_sig(6)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(12) <= s_sum1_im_sig(12) + s_mult2_im_sig(6)(b_size + w_size - 2 downto w_size - 2);
			-- 13_й выход 2_ой стадии
			s_sum2_re_sig(14) <= s_sum1_re_sig(12) - s_mult2_re_sig(6)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(14) <= s_sum1_im_sig(12) - s_mult2_im_sig(6)(b_size + w_size - 2 downto w_size - 2);

			-- 14_й выход 2_й стадии
			s_sum2_re_sig(13) <= s_sum1_re_sig(13) + s_mult2_re_sig(7)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(13) <= s_sum1_im_sig(13) + s_mult2_im_sig(7)(b_size + w_size - 2 downto w_size - 2);
			-- 15_й выход 2_ой стадии
			s_sum2_re_sig(15) <= s_sum1_re_sig(13) - s_mult2_re_sig(7)(b_size + w_size - 2 downto w_size - 2);
			s_sum2_im_sig(15) <= s_sum1_im_sig(13) - s_mult2_im_sig(7)(b_size + w_size - 2 downto w_size - 2);


---------------------------------------------------------------------------------------

		-- 3_я стадия fft8 s_ctf = 5,6
		elsif (s_ctf = 5) and s_begpr = '1' then
			-- комплексное умножение 3_я стадия (результат в b_size + w_size + 2)
			-- 1_я бабочка
			s_mult3_re_sig(0) <= resize((s_sum2_re_sig(4)*s_w_r_16_0_sig - s_sum2_im_sig(4)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult3_im_sig(0) <= resize((s_sum2_re_sig(4)*s_w_i_16_0_sig + s_sum2_im_sig(4)*s_w_r_16_0_sig), b_size + w_size + 2);
			-- 2_я бабочка
			s_mult3_re_sig(1) <= resize((s_sum2_re_sig(5)*s_w_r_16_2_sig - s_sum2_im_sig(5)*s_w_i_16_2_sig), b_size + w_size + 2);
			s_mult3_im_sig(1) <= resize((s_sum2_re_sig(5)*s_w_i_16_2_sig + s_sum2_im_sig(5)*s_w_r_16_2_sig), b_size + w_size + 2);
			-- 3_я бабочка
			s_mult3_re_sig(2) <= resize((s_sum2_re_sig(6)*s_w_r_16_4_sig - s_sum2_im_sig(6)*s_w_i_16_4_sig), b_size + w_size + 2);
			s_mult3_im_sig(2) <= resize((s_sum2_re_sig(6)*s_w_i_16_4_sig + s_sum2_im_sig(6)*s_w_r_16_4_sig), b_size + w_size + 2);
			-- 4_я бабочка
			s_mult3_re_sig(3) <= resize((s_sum2_re_sig(7)*s_w_r_16_6_sig - s_sum2_im_sig(7)*s_w_i_16_6_sig), b_size + w_size + 2);
			s_mult3_im_sig(3) <= resize((s_sum2_re_sig(7)*s_w_i_16_6_sig + s_sum2_im_sig(7)*s_w_r_16_6_sig), b_size + w_size + 2);	
			
			-- 5_я бабочка
			s_mult3_re_sig(4) <= resize((s_sum2_re_sig(12)*s_w_r_16_0_sig - s_sum2_im_sig(12)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult3_im_sig(4) <= resize((s_sum2_re_sig(12)*s_w_i_16_0_sig + s_sum2_im_sig(12)*s_w_r_16_0_sig), b_size + w_size + 2);
			-- 6_я бабочка
			s_mult3_re_sig(5) <= resize((s_sum2_re_sig(13)*s_w_r_16_2_sig - s_sum2_im_sig(13)*s_w_i_16_2_sig), b_size + w_size + 2);
			s_mult3_im_sig(5) <= resize((s_sum2_re_sig(13)*s_w_i_16_2_sig + s_sum2_im_sig(13)*s_w_r_16_2_sig), b_size + w_size + 2);
			-- 7_я бабочка
			s_mult3_re_sig(6) <= resize((s_sum2_re_sig(14)*s_w_r_16_4_sig - s_sum2_im_sig(14)*s_w_i_16_4_sig), b_size + w_size + 2);
			s_mult3_im_sig(6) <= resize((s_sum2_re_sig(14)*s_w_i_16_4_sig + s_sum2_im_sig(14)*s_w_r_16_4_sig), b_size + w_size + 2);
			-- 8_я бабочка
			s_mult3_re_sig(7) <= resize((s_sum2_re_sig(15)*s_w_r_16_6_sig - s_sum2_im_sig(15)*s_w_i_16_6_sig), b_size + w_size + 2);
			s_mult3_im_sig(7) <= resize((s_sum2_re_sig(15)*s_w_i_16_6_sig + s_sum2_im_sig(15)*s_w_r_16_6_sig), b_size + w_size + 2);

		elsif s_ctf = 6 and s_begpr = '1' then
			-- комплексное суммирование 3_я стадия (результат в b_size)
			-- 0_вой выход 3_й стадии
			s_sum3_re_sig(0) <= s_sum2_re_sig(0) + s_mult3_re_sig(0)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(0) <= s_sum2_im_sig(0) + s_mult3_im_sig(0)(b_size + w_size - 2 downto w_size - 2);
			-- 1_ой выход 3_ой стадии
			s_sum3_re_sig(1) <= s_sum2_re_sig(1) + s_mult3_re_sig(1)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(1) <= s_sum2_im_sig(1) + s_mult3_im_sig(1)(b_size + w_size - 2 downto w_size - 2);

			-- 2_й выход 3_й стадии
			s_sum3_re_sig(2) <= s_sum2_re_sig(2) + s_mult3_re_sig(2)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(2) <= s_sum2_im_sig(2) + s_mult3_im_sig(2)(b_size + w_size - 2 downto w_size - 2);
			-- 3_й выход 3_ой стадии
			s_sum3_re_sig(3) <= s_sum2_re_sig(3) + s_mult3_re_sig(3)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(3) <= s_sum2_im_sig(3) + s_mult3_im_sig(3)(b_size + w_size - 2 downto w_size - 2);

			-- 4_й выход 3_й стадии
			s_sum3_re_sig(4) <= s_sum2_re_sig(0) - s_mult3_re_sig(0)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(4) <= s_sum2_im_sig(0) - s_mult3_im_sig(0)(b_size + w_size - 2 downto w_size - 2);
			-- 5_й выход 3_ой стадии
			s_sum3_re_sig(5) <= s_sum2_re_sig(1) - s_mult3_re_sig(1)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(5) <= s_sum2_im_sig(1) - s_mult3_im_sig(1)(b_size + w_size - 2 downto w_size - 2);

			-- 6_й выход 3_й стадии
			s_sum3_re_sig(6) <= s_sum2_re_sig(2) - s_mult3_re_sig(2)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(6) <= s_sum2_im_sig(2) - s_mult3_im_sig(2)(b_size + w_size - 2 downto w_size - 2);
			-- 8_й выход 3_ой стадии
			s_sum3_re_sig(7) <= s_sum2_re_sig(3) - s_mult3_re_sig(3)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(7) <= s_sum2_im_sig(3) - s_mult3_im_sig(3)(b_size + w_size - 2 downto w_size - 2); 
			
			s_sum3_re_sig(8) <= s_sum2_re_sig(8) + s_mult3_re_sig(4)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(8) <= s_sum2_im_sig(8) + s_mult3_im_sig(4)(b_size + w_size - 2 downto w_size - 2);
			-- 9_ой выход 3_ой стадии
			s_sum3_re_sig(9) <= s_sum2_re_sig(9) + s_mult3_re_sig(5)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(9) <= s_sum2_im_sig(9) + s_mult3_im_sig(5)(b_size + w_size - 2 downto w_size - 2);

			-- 10_й выход 3_й стадии
			s_sum3_re_sig(10) <= s_sum2_re_sig(10) + s_mult3_re_sig(6)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(10) <= s_sum2_im_sig(10) + s_mult3_im_sig(6)(b_size + w_size - 2 downto w_size - 2);
			-- 3_й выход 3_ой стадии
			s_sum3_re_sig(11) <= s_sum2_re_sig(11) + s_mult3_re_sig(7)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(11) <= s_sum2_im_sig(11) + s_mult3_im_sig(7)(b_size + w_size - 2 downto w_size - 2);

			-- 11_й выход 3_й стадии
			s_sum3_re_sig(12) <= s_sum2_re_sig(8) - s_mult3_re_sig(4)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(12) <= s_sum2_im_sig(8) - s_mult3_im_sig(4)(b_size + w_size - 2 downto w_size - 2);
			-- 12_й выход 3_ой стадии
			s_sum3_re_sig(13) <= s_sum2_re_sig(9) - s_mult3_re_sig(5)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(13) <= s_sum2_im_sig(9) - s_mult3_im_sig(5)(b_size + w_size - 2 downto w_size - 2);

			-- 13й выход 3_й стадии
			s_sum3_re_sig(14) <= s_sum2_re_sig(10) - s_mult3_re_sig(6)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(14) <= s_sum2_im_sig(10) - s_mult3_im_sig(6)(b_size + w_size - 2 downto w_size - 2);
			-- 14_й выход 3_ой стадии
			s_sum3_re_sig(15) <= s_sum2_re_sig(11) - s_mult3_re_sig(7)(b_size + w_size - 2 downto w_size - 2);
			s_sum3_im_sig(15) <= s_sum2_im_sig(11) - s_mult3_im_sig(7)(b_size + w_size - 2 downto w_size - 2);
		  
			
			
			elsif (s_ctf = 7) and s_begpr = '1' then
			-- комплексное умножение 3_я стадия (результат в b_size + w_size + 2)
			-- 1_я бабочка
			s_mult4_re_sig(0) <= resize((s_sum3_re_sig(8)*s_w_r_16_0_sig - s_sum3_im_sig(8)*s_w_i_16_0_sig), b_size + w_size + 2);
			s_mult4_im_sig(0) <= resize((s_sum3_re_sig(8)*s_w_i_16_0_sig + s_sum3_im_sig(8)*s_w_r_16_0_sig), b_size + w_size + 2);
			-- 2_я бабочка
			s_mult4_re_sig(1) <= resize((s_sum3_re_sig(9)*s_w_r_16_1_sig - s_sum3_im_sig(9)*s_w_i_16_1_sig), b_size + w_size + 2);
			s_mult4_im_sig(1) <= resize((s_sum3_re_sig(9)*s_w_i_16_1_sig + s_sum3_im_sig(9)*s_w_r_16_1_sig), b_size + w_size + 2);
			-- 3_я бабочка
			s_mult4_re_sig(2) <= resize((s_sum3_re_sig(10)*s_w_r_16_2_sig - s_sum3_im_sig(10)*s_w_i_16_2_sig), b_size + w_size + 2);
			s_mult4_im_sig(2) <= resize((s_sum3_re_sig(10)*s_w_i_16_2_sig + s_sum3_im_sig(10)*s_w_r_16_2_sig), b_size + w_size + 2);
			-- 4_я бабочка
			s_mult4_re_sig(3) <= resize((s_sum3_re_sig(11)*s_w_r_16_3_sig - s_sum3_im_sig(11)*s_w_i_16_3_sig), b_size + w_size + 2);
			s_mult4_im_sig(3) <= resize((s_sum3_re_sig(11)*s_w_i_16_3_sig + s_sum3_im_sig(11)*s_w_r_16_3_sig), b_size + w_size + 2);	
			
			-- 5_я бабочка
			s_mult4_re_sig(4) <= resize((s_sum3_re_sig(12)*s_w_r_16_4_sig - s_sum3_im_sig(12)*s_w_i_16_4_sig), b_size + w_size + 2);
			s_mult4_im_sig(4) <= resize((s_sum3_re_sig(12)*s_w_i_16_4_sig + s_sum3_im_sig(12)*s_w_r_16_4_sig), b_size + w_size + 2);
			-- 6_я бабочка
			s_mult4_re_sig(5) <= resize((s_sum3_re_sig(13)*s_w_r_16_5_sig - s_sum3_im_sig(13)*s_w_i_16_5_sig), b_size + w_size + 2);
			s_mult4_im_sig(5) <= resize((s_sum3_re_sig(13)*s_w_i_16_5_sig + s_sum3_im_sig(13)*s_w_r_16_5_sig), b_size + w_size + 2);
			-- 7_я бабочка
			s_mult4_re_sig(6) <= resize((s_sum3_re_sig(14)*s_w_r_16_6_sig - s_sum3_im_sig(14)*s_w_i_16_6_sig), b_size + w_size + 2);
			s_mult4_im_sig(6) <= resize((s_sum3_re_sig(14)*s_w_i_16_6_sig + s_sum3_im_sig(14)*s_w_r_16_6_sig), b_size + w_size + 2);
			-- 8_я бабочка
			s_mult4_re_sig(7) <= resize((s_sum3_re_sig(15)*s_w_r_16_7_sig - s_sum3_im_sig(15)*s_w_i_16_7_sig), b_size + w_size + 2);
			s_mult4_im_sig(7) <= resize((s_sum3_re_sig(15)*s_w_i_16_7_sig + s_sum3_im_sig(15)*s_w_r_16_7_sig), b_size + w_size + 2);

		elsif s_ctf = 8 and s_begpr = '1' then
			s_sum4_re_sig(0) <= s_sum3_re_sig(0) + s_mult4_re_sig(0)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(0) <= s_sum3_im_sig(0) + s_mult4_im_sig(0)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_re_sig(1) <= s_sum3_re_sig(1) + s_mult4_re_sig(1)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(1) <= s_sum3_im_sig(1) + s_mult4_im_sig(1)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_re_sig(2) <= s_sum3_re_sig(2) + s_mult4_re_sig(2)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(2) <= s_sum3_im_sig(2) + s_mult4_im_sig(2)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_re_sig(3) <= s_sum3_re_sig(3) + s_mult4_re_sig(3)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(3) <= s_sum3_im_sig(3) + s_mult4_im_sig(3)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_re_sig(4) <= s_sum3_re_sig(4) + s_mult4_re_sig(4)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(4) <= s_sum3_im_sig(4) + s_mult4_im_sig(4)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_re_sig(5) <= s_sum3_re_sig(5) + s_mult4_re_sig(5)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(5) <= s_sum3_im_sig(5) + s_mult4_im_sig(5)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_re_sig(6) <= s_sum3_re_sig(6) + s_mult4_re_sig(6)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(6) <= s_sum3_im_sig(6) + s_mult4_im_sig(6)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_re_sig(7) <= s_sum3_re_sig(7) + s_mult4_re_sig(7)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(7) <= s_sum3_im_sig(7) + s_mult4_im_sig(7)(b_size + w_size - 2 downto w_size - 2); 
			s_sum4_re_sig(8) <= s_sum3_re_sig(0) - s_mult4_re_sig(0)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(8) <= s_sum3_im_sig(0) - s_mult4_im_sig(0)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_re_sig(9) <= s_sum3_re_sig(1) - s_mult4_re_sig(1)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(9) <= s_sum3_im_sig(1) - s_mult4_im_sig(1)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_re_sig(10) <= s_sum3_re_sig(2) - s_mult4_re_sig(2)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(10) <= s_sum3_im_sig(2) - s_mult4_im_sig(2)(b_size + w_size - 2 downto w_size - 2);	
			s_sum4_re_sig(11) <= s_sum3_re_sig(3) - s_mult4_re_sig(3)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(11) <= s_sum3_im_sig(3) - s_mult4_im_sig(3)(b_size + w_size - 2 downto w_size - 2);	
			s_sum4_re_sig(12) <= s_sum3_re_sig(4) - s_mult4_re_sig(4)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(12) <= s_sum3_im_sig(4) - s_mult4_im_sig(4)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_re_sig(13) <= s_sum3_re_sig(5) - s_mult4_re_sig(5)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(13) <= s_sum3_im_sig(5) - s_mult4_im_sig(5)(b_size + w_size - 2 downto w_size - 2);									 
			s_sum4_re_sig(14) <= s_sum3_re_sig(6) - s_mult4_re_sig(6)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(14) <= s_sum3_im_sig(6) - s_mult4_im_sig(6)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_re_sig(15) <= s_sum3_re_sig(7) - s_mult4_re_sig(7)(b_size + w_size - 2 downto w_size - 2);
			s_sum4_im_sig(15) <= s_sum3_im_sig(7) - s_mult4_im_sig(7)(b_size + w_size - 2 downto w_size - 2);

		end if;	 
	end if; 
		 
	
	-- выходной результат 
	doutr0 <= std_logic_vector(s_sum4_re_sig(0));
	doutr1 <= std_logic_vector(s_sum4_re_sig(1));
	doutr2 <= std_logic_vector(s_sum4_re_sig(2));
	doutr3 <= std_logic_vector(s_sum4_re_sig(3));
	doutr4 <= std_logic_vector(s_sum4_re_sig(4));
	doutr5 <= std_logic_vector(s_sum4_re_sig(5));
	doutr6 <= std_logic_vector(s_sum4_re_sig(6));
	doutr7 <= std_logic_vector(s_sum4_re_sig(7));

	douti0 <= std_logic_vector(s_sum4_im_sig(0));
	douti1 <= std_logic_vector(s_sum4_im_sig(1));
	douti2 <= std_logic_vector(s_sum4_im_sig(2));
	douti3 <= std_logic_vector(s_sum4_im_sig(3));
	douti4 <= std_logic_vector(s_sum4_im_sig(4));
	douti5 <= std_logic_vector(s_sum4_im_sig(5));
	douti6 <= std_logic_vector(s_sum4_im_sig(6));
	douti7 <= std_logic_vector(s_sum4_im_sig(7)); 
	
	doutr8 <= std_logic_vector(s_sum4_re_sig(8));
	doutr9 <= std_logic_vector(s_sum4_re_sig(9));
	doutr10 <= std_logic_vector(s_sum4_re_sig(10));
	doutr11 <= std_logic_vector(s_sum4_re_sig(11));
	doutr12 <= std_logic_vector(s_sum4_re_sig(12));
	doutr13 <= std_logic_vector(s_sum4_re_sig(13));
	doutr14 <= std_logic_vector(s_sum4_re_sig(14));
	doutr15 <= std_logic_vector(s_sum4_re_sig(15));

	douti8 <= std_logic_vector(s_sum4_im_sig(8));
	douti9 <= std_logic_vector(s_sum4_im_sig(9));
	douti10 <= std_logic_vector(s_sum4_im_sig(10));
	douti11 <= std_logic_vector(s_sum4_im_sig(11));
	douti12 <= std_logic_vector(s_sum4_im_sig(12));
	douti13 <= std_logic_vector(s_sum4_im_sig(13));
	douti14 <= std_logic_vector(s_sum4_im_sig(14));
	douti15 <= std_logic_vector(s_sum4_im_sig(15));

				   
end process;	

end behavioural;




module tb;
	  	
			reg clk,rst,wrdata;
			reg [15:0] 	dinr0,dinr1,dinr2,dinr3,dinr4,dinr5,dinr6,dinr7,dinr8,dinr9,dinr10,dinr11,dinr12,dinr13,dinr14,dinr15;
			reg [15:0]  dini0,dini1,dini2,dini3,dini4,dini5,dini6,dini7,dini8,dini9,dini10,dini11,dini12,dini13,dini14,dini15;	   
			
			wire [3:0] ctfout;
			
			wire [15:0]	 doutr0,doutr1,doutr2,doutr3,doutr4,doutr5,doutr6,doutr7,doutr8,doutr9,doutr10,doutr11,doutr12,doutr13,doutr14,doutr15;  
			wire [15:0]  douti0,douti1,douti2,douti3,douti4,douti5,douti6,douti7,douti8,douti9,douti10,douti11,douti12,douti13,douti14,douti15;
			
			
 fft16vhd b
	
	(
		
		.clk (clk) ,
		.rst	(rst),
		.dinr0	(dinr0),
		.dinr1	(dinr1),
		.dinr2	(dinr2),
		.dinr3	(dinr3),
		.dinr4	(dinr4),
		.dinr5	(dinr5),
		.dinr6	(dinr6),
		.dinr7	(dinr7),
		.dinr8	(dinr8),
		.dinr9	(dinr9),
		.dinr10	(dinr10),
		.dinr11	(dinr11),
		.dinr12	(dinr12),
		.dinr13	(dinr13),
		.dinr14	(dinr14),
		.dinr15	(dinr15),
		
		.dini0	(dini0),
		.dini1	(dini1),
		.dini2	(dini2),
		.dini3	(dini3),
		.dini4	(dini4),
		.dini5	(dini5),
		.dini6	(dini6),
		.dini7	(dini7), 
		.dini8	(dini8),
		.dini9	(dini9),
		.dini10	(dini10),
		.dini11	(dini11),
		.dini12	(dini12),
		.dini13	(dini13),
		.dini14	(dini14),
		.dini15	(dini15),
		
		.wrdata	(wrdata),

	
		.ctfout	(ctfout),
		
		.doutr0	(doutr0),
		.doutr1	(doutr1),
		.doutr2	(doutr2),
		.doutr3	(doutr3),
		.doutr4	(doutr4),
		.doutr5	(doutr5),
		.doutr6	(doutr6),
		.doutr7	(doutr7), 
		.doutr8	(doutr8),
		.doutr9	(doutr9),
		.doutr10	(doutr10),
		.doutr11	(doutr11),
		.doutr12	(doutr12),
		.doutr13	(doutr13),
		.doutr14	(doutr14),
		.doutr15	(doutr15),
		
		.douti0	(douti0),
		.douti1	(douti1),
		.douti2	(douti2),
		.douti3	(douti3),
		.douti4	(douti4),
		.douti5	(douti5),
		.douti6	(douti6),
		.douti7	(douti7),  
		.douti8	(douti8),
		.douti9	(douti9),
		.douti10(douti10),
		.douti11(douti11),
		.douti12(douti12),
		.douti13(douti13),
		.douti14(douti14),
		.douti15(douti15)

	   
		);	
			always #1 clk=~clk;
		initial begin
			
			clk<=1'b0;
			rst<=1'b1;
			wrdata<=1'b0;
			
			dinr0 <=  16'd  1024;
			dinr1 <=  16'd  0;
			dinr2 <=  -16'd  1024;
			dinr3 <=  16'd  0;		
			dinr4 <=  16'd  1024;	
			dinr5 <=  16'd  0;	
			dinr6 <=  -16'd  1024;	
			dinr7 <=  16'd  0;	
			dinr8 <=  16'd  1024;
			dinr9 <=  16'd  0;
			dinr10 <= -16'd  1024;
			dinr11 <= 16'd  0;		
			dinr12 <= 16'd  1024;	
			dinr13 <= 16'd  0;	
			dinr14 <= -16'd  1024;	
			dinr15 <= 16'd  0;	
			
			dini0 <=  16'd0;
			dini1 <=  16'd0;
			dini2 <=  16'd0;
			dini3 <=  16'd0;		
			dini4 <=  16'd0;		
			dini5 <=  16'd0;		
			dini6 <=  16'd0;		
			dini7 <=  16'd0;
			dini8 <=  16'd0;
			dini9 <=  16'd0;
			dini10 <=  16'd0;
			dini11 <=  16'd0;		
			dini12 <=  16'd0;		
			dini13 <=  16'd0;		
			dini14 <=  16'd0;		
			dini15 <=  16'd0;
			
			#2;
			rst<=1'b0;
			#2;
			rst<=1'b1;
			#2;
			wrdata<=1'b1;
			#2;
			wrdata<=1'b0; 
			
			
			end
		
		
		
		endmodule
		

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: БПФ 16 с прореживанием по времени

Сообщение Бахурин Сергей »

Нет мне конечно льстит, что кто-то считает, что я могу легко найти ошибку в 870 строках vhdl кода...

Но на самом деле это процесс отладки. Вы бы начали сначала с размера 4, потом перешли бы на 8 и после отладки 8-точечного можно переходить на 16 точек. Причём надо иметь некий референсный код, который будет давать все промежуточные результаты, иначе не найти.

PTA
Сообщения: 2
Зарегистрирован: 10 сен 2019, 13:46

Re: БПФ 16 с прореживанием по времени

Сообщение PTA »

На 8 точек все работает верно. А на 16 - нет, хотя все абсолютно идентично. Магия :cry:

Ответить