Как определить, когда выходы из VHDL устанавливаются на свои окончательные значения? - PullRequest
3 голосов
/ 03 ноября 2011

Прежде всего, я хотел бы заявить, что это на практическом экзамене, который я сдаю.Я знаю ответы: cout = 4ns и S = ​​7ns.Просто ищу небольшое объяснение.Заранее спасибо.

Для реализации VHDL полного сумматора, показанной ниже, когда выходы cout и S устанавливают свои конечные значения (рассмотрим временную траекторию наихудшего случая с входными данными наихудшего случая)?

         architecture concurrent_behavior of full_adder is
            signal t1, t2, t3, t4, t5: std_logic;

         begin
             t1 <= not A after 1 ns;
             t2 <= not cin after 1 ns;
             t4 <= not ((A or cin) and B) after 2 ns;
             t3 <= not ((t1 or t2) and (A or cin)) after 2 ns;
             t5 <= t3 nand B after 2 ns;
             S <= not((B or t3) and t5) after 2 ns;
             cout <= not(t1 or t2) and t4) after 2 ns;
         end concurrent_behavior;

1 Ответ

3 голосов
/ 03 ноября 2011

В основном вы просто отслеживаете зависимости и суммируете зависимости для каждого маршрута с помощью логики. Обычно проще всего проследить в обратном направлении от выхода к нужным входам. Например:

cout <= not(t1 or t2) and t4) after 2 ns;

Итак, последний этап для cout имеет задержку 2 нс. Его входами являются t1, t2 и t4, поэтому его задержка в 2 нс не может начаться до тех пор, пока все t1, t2 и t4 не будут готовы (т. Е. Одна самая длинная из этих задержек определяет время запуска для последней стадии).

В этом случае t1 и t2 задерживаются на 1 нс за штуку, а t4 задерживается на 2 нс. Поэтому последний этап начинается через 2 нс после начального ввода. Это дает 2 + 2 = 4 нс от начального ввода до конечного вывода.

Глядя на это с алгоритмической точки зрения, мы могли бы заявить, что задержка для любого сигнала - это задержка конечной «ступени» для этого сигнала плюс максимум задержек для любого из его входов.

Для S:

total = 2 + max_delay(B, t3, t5)
total = 2 + delay(t5);
total = 2 + 2 + max_delay(t3, B)
total = 2 + 2 + delay(t3)
total = 2 + 2 + 2 + max_delay(t1, t2, A, cin)
total = 2 + 2 + 2 + delay(t1) (or delay(t2) -- they're the same).
total = 2 + 2 + 2 + 1
...