Vhdl фазовращатель на двух сдвиговых регистрах

Фазовращатель на сдвиговых регистрахТема фазовращателя на VHDL уже подымалась на нашем сайте. Обычно цифровой фазовращатель строится на счетчике который отсчитывает необходимую задержку фронта и спада цифрового сигнала и формирует задержанные фронт и спад изменяя таким образом фазу изначального сигнала. Если необходимо построить многоканальный фазовращатель, то создается цепочка счетчиков, где каждый последующий является продолжением предыдущего. В цифровой технике часто возникает необходимость построения многоканального фазовращателя на несколько десятков ячеек. Такой фазовращатель довольно ресурсоемкий, если применять в качестве ячеек его цепи все те же счетчики. Но есть возможность уменьшить затраты ресурсов FPGA на многоканальный фазовращатель применив для этой цели два сдвиговых регистра.

Все достаточно просто. Фронт сигнала который нужно вращать по фазе двигается по одному сдвиговому регистру, а спад по другому. Далее выходы сдвиговых регистров объединяются по и. Для управления сдвиговыми регистрами необходимы будут всего два счетчика. Один из них отсчитывает задержку каждого последующего фронта сигнала, начиная с исходного, другой задержку спада сигнала. В коде на VHDL это выглядит так:

	
	-- счетчики задержки
	signal s_clk_shift_rs	: std_logic_vector(7 downto 0);	
	signal s_clk_shift_fl	: std_logic_vector(7 downto 0);	
	-- счетчики элементов цепи фазовр.
	signal s_nb_shift_rs	: std_logic_vector(3 downto 0);	
	signal s_nb_shift_fl	: std_logic_vector(3 downto 0);	
	-- исходный цифровой сигнал  
	signal s_gn_chirp_tm	: std_logic;
	--выходы цепи фазовращателей
	signal s_gn_chirp_rs	: std_logic_vector(13 downto 0);	
	signal s_gn_chirp_fl	: std_logic_vector(13 downto 0);	
      --
	signal s_chirp_rs	: std_logic;	
	signal s_chirp_fl	: std_logic;	
	-- 				
	signal s_bl_rs		: std_logic;
	signal s_bl_fl		: std_logic;

      -- процесс на фазовращателях
	process(clk, clr)
	begin
		if clk'event and clk = '1' then
		if clr = '0' or enable = '0' then 
			s_gn_chirp_rs <= (others => '0');
			s_clk_shift_rs <= (others => '0');
			s_clk_shift_fl <= (others => '0');
			s_nb_shift_rs <= (others => '0'); 
			s_nb_shift_fl <= (others => '0'); 
			s_bl_rs <= '0'; 
			s_bl_fl <= '1'; 
			s_chirp_rs <= '0';
			s_chirp_fl <= '1';
			s_gn_chirp_fl <= "11111111111111";
		else 
			if s_bl_rs = '0' and s_gn_chirp_tm = '1' then
				s_chirp_rs <= '1';
				s_bl_rs <= '1';
				s_bl_fl <= '0';
				s_gn_chirp_rs <= "00000000000001";
				s_gn_chirp_fl <= "11111111111111";
				s_clk_shift_rs <= (others => '0'); 
				s_nb_shift_rs <= "0001";
			end if;	
     		if s_bl_rs = '1' then
				s_clk_shift_rs <= s_clk_shift_rs + 1;
				if s_clk_shift_rs = 24 then
					s_clk_shift_rs <= (others => '0');	
					s_nb_shift_rs <= s_nb_shift_rs + 1;	
					s_gn_chirp_rs(13 downto 1) <= s_gn_chirp_rs(12 downto 1) & s_chirp_rs;
					if s_nb_shift_rs = 13 then
						s_nb_shift_rs <= (others => '0');
						s_bl_rs <= '0'; 	
					end if;
				end if;
			end if;	
			if s_bl_fl = '0' and s_gn_chirp_tm = '0' then
				s_chirp_fl <= '0';
				s_bl_fl <= '1'; 
				s_gn_chirp_fl <= "11111111111110";
				s_clk_shift_fl <= (others => '0'); 
				s_nb_shift_fl <= "0001";
			end if;	
			if s_bl_fl = '1' then
				s_clk_shift_fl <= s_clk_shift_fl + 1;
				if s_clk_shift_fl = 24 then 
					s_clk_shift_fl <= (others => '0');	
					s_nb_shift_fl <= s_nb_shift_fl + 1;	
					s_gn_chirp_fl(13 downto 1) <= s_gn_chirp_fl(12 downto 1) & s_chirp_fl;
					if s_nb_shift_fl = 13 then
						s_nb_shift_fl <= (others => '0');	
						s_bl_fl <= '1'; 
						s_gn_chirp_rs <= "00000000000000";
					end if;
				end if;
			end if;
		end if;
		end if;
	end process;
	
	-- выходы фазовращателя
	gn_chirp <= s_gn_chirp_rs and s_gn_chirp_fl;
	

Выше приведен код фазовращателя на сдвиговых регистрах. Код намеренно не имеет комментариев по двум причинам. 1. Кому эта тема не интересна комменты в коде тоже будут не интересны. 2. Кого тема заинтересует тот легко разберет код самостоятельно, а если возникнут трудности опишет их через форму для добавления комментов данного сайта.

Для затравки - все названия сигналов в коде с начальной буквой s - внутренние сигналы. Исходный цифровой сигнал фаза которого вращается называется s_gn_chirp_tm. Количество ячеек в цепи фазовращателей 0...13.

Изменить количество ячеек цепи элементарно. Нужно сигналам s_nb_shift_rs, s_nb_shift_fl присвоить соответствующие значения, не забыв также откорректировать соответствующие циферки на сдвиговых регистрах. Для того, чтобы изменить количество тактов задержки фронтов и спадов цифрового сигнала необходимо изменить цифру сравнения для сигналов s_clk_shift_rs, s_clk_shift_fl.

Дерзайте...

Top.Mail.Ru