Как можно оптимизировать схему, чтобы уменьшить задержку?
architecture right_arch of right_entity is
signal q: std_logic_vector(3 downto 0);
begin
q <= ('0' & q(3 downto 1)) and d;
....
end right_arch;
architecture right_arch of right_entity is
signal q: std_logic_vector(3 downto 0);
begin
q(3) <= '0' and d(3);
q(2) <= q(3) and d(2);
q(1) <= q(2) and d(1);
q(0) <= q(1) and d(0);
....
end right_arch;
С другой стороны, код справа корректен:
Он эквивалентен следующему коду:
Синтез оператора условного назначения сигналов
сигнал <= выражение_1 when условие_1 else
выражение_2 when условие_2 else
....
выражение_(n-1) when условие_(n-1) else
выражение_n;
Реализуется на основе абстрактного мультиплексора 2-в-1:
Параллельный оператор:
with задающее_выражение select
сигнал <=
выражение_1 when выбор_1,
выражение_2 when выбор_2,
выражение_3 when выбор_3,
...
выражение_n when выбор_n;
Значения, не условия
others
Компактное перечисление вариантов
Абстрактный мультиплексор k-в-1.
Все входы равноправны, приоритета нет.
Для комбинационной схемы ВСЕ входы должны быть в списке чувствительности!
Здесь y не равно a or c
wait on список_чувствительности until условие for тайм-аут;
wait on a, b; -- Процесс возобновится, когда изменится a или b.
wait until (c = 0); -- Процесс возобновится, когда c изменит свое
-- значение из 1 в 0.
wait for 50 ns; -- Процесс возобновится через 50 нс.
wait; -- Процесс больше не возобновится, если не
-- поместить такой оператор в конце процесса,
-- то выполнение процесса начнется сначала.
-- Такой оператор можно использовать в конце
-- stim_proc для окончания симуляции.
Используйте wait только для СИМУЛЯЦИИ.
Написание!
Отличия:
По структуре. Внутри IF может быть еще один IF.
По пониманию: легче понять смысл.
В одной ветке можно назначить несколько сигналов.
сигнал <= выражение_1 when условие_1 else
выражение_2 when условие_2 else
....
выражение_n;
process(...)
begin
if условие_1 then
сигнал <= выражение_1;
elsif условие_2 then
сигнал <= выражение_2;
...
else
сигнал <= выражение_n;
end if;
end process;
process(a,b)
begin
if (a = b) then
eq <= '1';
else
eq <= eq;
end if;
end process;
Семантика VHDL такова, что если сигнал не обновляется (при a /= b), то он сохраняет свое значение. Это приводит к образованию обратной связи и элемента памяти (защелки (latch)).
process(a,b)
begin
if (a = b) then
eq <= '1';
else
eq <= '0';
end if;
end process;
Проблема неполного назначения сигналов в операторе IF
Пример: компаратора двух чисел с тремя выходами: gt (greater than, a > b), lt (less than, a < b), eq (equal a=b).
process(a,b)
begin
if (a > b) then
gt <= '1';
elsif (a = b) then
eq <= '1';
else
lt <= '1';
end if;
end process;
Неправильно:
process(a,b)
begin
if (a > b) then
gt <= '1';
eq <= '0';
lt <= '0';
elsif (a = b) then
gt <= '0';
eq <= '1';
lt <= '0';
else
gt <= '0';
eq <= '0';
lt <= '1';
end if;
end process;
Присвоение значения комбинационному сигналу по умолчанию
process(...)
begin
case задающее_выражение is
when выбор_1 => сигнал <= выражение_1;
when выбор_2 => сигнал <= выражение_2;
...
when выбор_n => сигнал <= выражение_n;
end case;
end process;
process(a)
begin
case a is
when "100" | "101" | "110" | "111" =>
high <= '1';
when "010" | "011" =>
middle <= '1';
when others =>
low <= '1';
end case;
end process;
Как исправить?
Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть