VHDL фазовращатель на ПЛИС

Фазовращатель на ПЛИСЦифровой фазовращатель это один из основных модулей фазосдвигающего устройства которое применяется в имитаторе гидроакустических сигналов. Работает фазовращатель достаточно просто. По фронтам и спадам изначального сигнала формируются импульсы загрузки счетчика который отсчитывает необходимую задержку, формируя таким образом фазовый сдвиг фронтов и спадов сигнала.

VHDL код фазовращателя представлен ниже по тексту

 


--------------------------------------------------------------------
-- фазовращатель 
--------------------------------------------------------------------
-- File    : shift 
-- Site    : http://acvarif.info 
-- Date    : 27/09/14 
-- Version : 1.0
--------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;


entity shift is
	port 
	(
		-- общий срос
		rst 		:	in std_logic ;
		-- частота 
		clk			:	in std_logic ;
		-- сдвиг 
		shdata	:	in std_logic_vector(4 downto 0);
		--  
		short_out 	:	out std_logic;
		--  
		shift_out 	:	out std_logic;
		--  
		clk32_out 	:	out std_logic
	) ;
end shift;

architecture behav of shift is

	-- 
	signal clkdiv 			: std_logic_vector(4 downto 0);
	-- 
	signal shiftdiv			: std_logic_vector(4 downto 0);
	-- 
	signal clk32x 			: std_logic;
	-- 
	signal short 				: std_logic;
	-- 
	signal q_out				: std_logic;
	-- 
	signal shift				: std_logic;

begin

-- делитель 
process (rst,clk)
begin
	if rst = '1' then
		clkdiv <= (others => '0');
	elsif clk'event and clk = '1' then
		clkdiv <= clkdiv + 1;
	end if ;
end process ;
 
clk32x <= clkdiv(4);
clk32_out <= clk32x;

-- короткие по фронтам и срезам
process (rst,clk32x)
begin
	if rst = '1' then
		q_out <= '0';
		short <= '0';
	elsif clk'event and clk = '0' then
		if  clk32x = '1' then
			q_out <= '1';
		elsif clk32x = '0' then	
			q_out <= '0';
		end if ;
	end if ;

short <= q_out xor clk32x;

end process ;

short_out <= short;

-- фазовращатель 
process (rst,clk)
begin
	if rst = '1' then
		shiftdiv <= (others => '0');
	elsif short = '1' then 	
		shiftdiv <= shdata;
	elsif clk'event and clk = '1' then
		if shiftdiv >= 0 then
			shiftdiv <= shiftdiv - 1;
		end if;	
	end if ;
end process ;

process (rst,clk)
begin
	if rst = '1' then
		shift <= '0';
	elsif shiftdiv(4)'event and shiftdiv(4) = '1' then
		if  clk32x = '1' then
			shift <= '1';
		elsif clk32x = '0' then	
			shift <= '0';
		end if ;
	end if ;
end process ;

shift_out <= shift;

end behav;

Для наглядности выбрана частота 2.88 мГц которая поделена на 32(clk32_out). Далее полученный сигнал необходимо двигать по фазе с шагом в один период исходной частоты. Величина сдвига определяется входным регистром shdata, причем так, что 0 - это сдвиг на один период исходной частоты. На картинке 12 - сдвиг на 13 периодов исходной частоты.

Для постороения многоканального фазовращателя необходимо создавать ветви где каждая последующая будет продолжением предыдущей. Проще говоря фазовращатели нужно соединять последовательно друг за другом. Кстати таким образом можно вращать фазу любого сигнала в том числе ЛЧМ.

Top.Mail.Ru