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.
Дерзайте...
Электроника :
- Техника электроника (11)
- Полезная электроника (4)
- Электроника для всех (5)
- Техника для дома (6)
- Cхемотехника ПЛИС (11)
- Пректирование PCAD (4)
Программирование :
- Микроконтроллеры (9)
- ПЛИС VHDL Verilog (29)
- C++ Builder (7)
- Visual Studio C++ C# (7)
- Java programming (7)
- Matlab programming (4)
Сайтостроение :
- Сайтостроение HTML (5)
- Сайтостроение PHP (8)
- PHP CMS на файлах (3)
- Web инструменты (9)
- Полезное вебмастеру (11)
- SEO раскрутка сайта (4)
- PHP скрипты (3)
Реклама :
Книги и учебники :
- Шаблоны сайтов (6)
- Книги и учебники (2)
Компьютер и интернет :
Поиск по сайту :
Реклама :
Облако меток :
Бесплатная подписка :
Статистика :
- Популярность (3)
- Посещаемость (3)
- Поисковые запросы (3)