Вы зациклились на 'Z' состоянии, и по этому вам не ясна суть.
Синтезатор правильно ругается, т.к. у вас we назначен как клок.
Для примера приведу регистр ИР35.
Код
entity ir35 is
port
(
c : in std_logic;
r : in std_logic;
d : in std_logic_vector(7 downto 0);
q : out std_logic_vector(7 downto 0)
);
ent ir35;
architecture rtl of ir15 is
signal q_reg : std_logic_vector(7 downto 0);
begin
q<=q_reg;
reg:process(r,c)
begin
if (r='0') then
q_reg<=(others=>'0');
elsif (c'event and c='1') then
q_reg<=d;
end if;
end process;
end rtl;
Описание:
q_reg - триггеры регистра
d - вход данных регистра
q - выход, состояние триггеров регистра
с - тактовые импульсы
r - сигнал сброса
Когда сигнал "r" имеет активный уровень('0'), все триггеры "q_reg" регистра "ir35" сбрасываются, в противном случае при приходе фронта(положительного) тактового импульса "c" в триггеры "q_reg" записывается значение со входа "d". Сигнал "q" транслирует значение триггеров "q_reg" на выход.
При неактивном уровне уровне('1') сигнала сброса "r", и отсутствии фронта на тактовом входе "c" регистра. Никаких изменений в схеме не происходит, т.е. в регистре "q_reg" хранится информация.
Состояние 'Z' сигналов используется только для работы с внешними по отношению к плис схемами (в некоторых он так же используется для реализации больших мультиплексоров), но ни в коем случае он не используется для описания внутренней логики работы плис.