Довльно нужная вещь этот ваш сдвиговый регистр…
Напишем простейший вариант реализации на VHDL. Из входов у нас будет: тактирование (С, он же CLK), вход данных (serial input) и выход (serial output).
Принципиальных ограничений на разрядность нет, но мы сегодня будем стереотипными пацанами 😉 сделаем 8-ми битный регистр.
Будем использовать тип std_logic. Для чего будем использовать библиотеки:
library ieee; use ieee.std_logic_1164.all;
Секция entity нашего сдвигового регистра выглядит вот так:
entity shift is port(C, SI : in std_logic; SO : out std_logic); end shift;
Тут мы просто описали нужные входы и выходы.
Архитектура ничего крутого тоже не представляет. Тут мы просто создаем внутренний сигнал tmp разрядностью 8 бит, в который собственно и будем вносить данные и сдвигать. Сдвигаем просто проходом цикла, а затем вносим в tmp(0) входящий сигнал SI, а из tmp(7) данные выводим на выход SO.
architecture archi of shift is signal tmp: std_logic_vector(7 downto 0); begin process (C) begin if (C'event and C='1') then for i in 0 to 6 loop tmp(i+1) <= tmp(i); end loop; tmp(0) <= SI; end if; end process; SO <= tmp(7); end archi;
Таким образом мы получаем весьма абстрактный регистр, который первые 1 Байт данных будет выводить неопределённое состояние на выход.
Как видно из временной диаграммы, всё получилось 😉 Сдвиговый регистр действует.