Довльно нужная вещь этот ваш сдвиговый регистр…
Напишем простейший вариант реализации на 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 Байт данных будет выводить неопределённое состояние на выход.
Как видно из временной диаграммы, всё получилось 😉 Сдвиговый регистр действует.




