Введение в стандарт IEEE. Справочное руководство по языку VHDL (Пересмотр стандарта IEEE. 1076-1987), страница 16

     Регистры - обычно это массивы из 8, 16, 32 или большего количества триггеров T или D-типа. В VHDL, регистры чаще всего кодируются так, что все триггеры синхронизированы с системными часами и используют другое средство управления, типа предварительной установки или сброса. Каждый активный переход часов вызывает массив триггеров. Если приходит асинхронный сигнал сброса, выход регистра должен обнуляться. Исходный текст, для блоков регистра подобен тексту показанному в отдельных моделях D-триггера, в разделе Сброса и предварительной установки.

Ниже вы найдете пример строительства блоков регистра на VHDL.

library ieee;

use ieee.std_logic_1164.all;

use ieee.numeric_std.all;

entity reg8 is

port(reset, ck : in std_logic;

d         : in std_logic_vector (7 downto 0);

q         : out std_logic_vector (7 downto 0));

end;

architecture behavior of reg8 is

begin

process (reset, ck)

begin

if reset = '1' then

q <= "00000000";

elsif (ck = '1' and ck'event) then

q <= d;

end if;

end process;

end;


dn = указывает состояние соответствующего входа до активного перехода часов.

Диаграмма работы иллюстрирует моделирование блока регистра.


Сдвиговый регистр.

     Сдвиговый регистр, сдвигает набор сигналов данных на определенное количество разрядов, в течение одного периода.

     Чтобы создать сдвиговый регистр в VHDL, желательно использовать стандартный числовой пакет, чтобы воспользоваться преимуществом сдвига для операторов знакового и без знакового типов данных, как показано в следующих примерах:

shift_left     (data, shift_amount)

shift_right  (data, shift_amount)

rotate_left  (data, rotate_amount)

rotate_right (data, rotate_amount)

Фрагмент кода демонстрирует строительство сдвигового регистра, используя VHDL.

library ieee;

use ieee.std_logic_1164.all;

use ieee.numeric_std.all;

entity shiftl is

port(clk : in std_logic;                  -- часы

ldst: in std_logic;                  -- загрузка управления

s: in std_logic_vector (2 downto 0); -- сдвиг на выбранное количество разрядов

d: in std_logic_vector (7 downto 0); -- данные

q: in std_logic_vector (7 downto 0));-- выход сдвигающего устройства

end;

architecture behavior of shiftl is

signal s_sig : unsigned (2 downto 0);

signal d_sig : unsigned (7 downto 0);

  signal q_sig : unsigned (7 downto 0);

begin

-- преобразование типов

s_sig <= unsigned(s);

d_sig <= unsigned(d);

q <= std_logic_vector(q_sig);

-- сдвигающее устройство барабанного типа

process (clk,ldst,s_sig,d_sig)

begin

if (clk='1' and clk'event) then

if (ldst='1') then

q_sig <= d_sig;

elsif (s_sig=b"000") then

q_sig <= shift_right(q_sig,0);

elsif (s_sig=b"001") then

q_sig <= shift_right(q_sig,1);

elsif (s_sig=b"010") then

q_sig <= shift_right(q_sig,2);

elsif (s_sig=b"011") then

q_sig <= shift_right(q_sig,3);

elsif (s_sig=b"100") then

q_sig <= shift_right(q_sig,4);

elsif (s_sig=b"101") then

q_sig <= shift_right(q_sig,5);

elsif (s_sig=b"110") then

q_sig <= shift_right(q_sig,6);

elsif (s_sig=b"111") then

q_sig <= shift_right(q_sig,7);

end if;

end if;

end process;

end;


qn+s = (где s - 0 .. 7) указывает состояние выхода после передачи активных часов

Таблица ниже иллюстрирует моделирование сдвигового регистра.