Чтобы избежать защелок, вы должны убедиться, что все ваши выходы назначены во всех возможных ветвях кода.
например,
if a = '1' then
b(0) <= '1';
else
b(1 downto 0) <= "00";
end if;
будет генерировать защелку, потому что в первом условии значение b (1) не указано, поэтому компилятор решил, что вы хотите сохранить предыдущее значение b (1). Один из способов написать это, который не будет генерировать защелку:
if a = '1' then
b <= prev_b;
b(0) <= '1';
else
b(1 downto 0) <= "00";
end if;
...
if rising_edge (clk)
prev_b <= b;
end if;
Здесь вы явно заявляете, что b должен сохранить свое старое значение, а затем перезаписать b (0) новым значением.
Другой способ - указать значение ba по умолчанию, как в ответе @ TomiJ.
Если вы опубликуете код, на который получаете защелку, мы можем помочь вам найти конкретную причину.