Сдвиговый регистр представляет собой разновидность регистра, для которого по фронту тактового сигнала происходит сдвиг содержимого на один или несколько разрядов в какую-либо сторону.
Сдвиговый регистр можно представить следующим текстом.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entityshift_reg is
Port ( clk : in STD_LOGIC;
din : in STD_LOGIC;
dout : out STD_LOGIC);
endshift_reg;
architecture Behavioral of shift_reg is
signalsr : std_logic_vector(7 downto 0) := x”00”;
begin
process(clk)
begin
ifrising_edge(clk) then
sr<= sr(6 downto 0) & din;
dout<= sr(7);
end if;
end process;
end Behavioral;
В примере производится сдвиг содержимого внутреннего регистра data на один разряд влево. В младший разряд при этом помещается значение, подающееся на вход d_in, а старший разряд теряется. Работа сдвигового регистра управляется входом ce, низкий уровень на котором запрещает сдвиг.
Выход сдвигового регистра q является копией внутреннего сигнала data (в отличие от примера на VHDL значение выходного сигнала устанавливается асинхронно, т.е. появляется на такт раньше) Такое решение выбрано потому, что в строке data<= {data[15:1], d_in} производится как запись, так и чтение переменной data. Таким образом, эта переменная не может быть портом типа output, так как для такого порта допустима только операция записи.
Регистр, сдвигающий свое содержимое на регулируемое число разрядов, называется регистром (устройством) барабанного сдвига (barrelshifter). Это более сложное для реализации устройство, чем обычный сдвиговый регистр, поскольку требует дополнительного мультиплексора, из-за чего занимаемый в ПЛИС объем существенно возрастает. Регистр барабанного сдвига применяется, например, для сложения и вычитания чисел с плавающей точкой, где он производит нормализацию мантисс – сдвиг одной из мантисс на число разрядов, равное разнице двоичных порядков складываемых чисел. Поскольку для операций с плавающей точкой желательна высокая производительность, а обычный сдвиговый регистр может потребовать от 1 до N тактов для нормализации (где N – число двоичных разрядов мантиссы, которое для чисел двойной точности равно 53), применение устройства барабанного сдвига для этой цели является оправданным. Пример описания устройства барабанного сдвига показан ниже:
withselselect
q<= dwhen “00”,
dshl 1 when “01”,
dshl 2 when “10”,
dshl 3 whenothers;
Приведенный пример может быть дополнен регистром, поскольку в описании показан только асинхронный мультиплексор, сдвигающий входной сигнал d на 0, 1, 2 или 3 разряда.