Визуальная электроника

Статические последовательные примитивы

Поведение статических [реагирующих на уровень сигнала] примитивов представляется тем же самым способом, как это делается для комбинационных схем, за исключением того, что выход объявляется регистрового типа, а в строках таблицы имеется дополнительное поле. Это поле представляет текущее состояние примитива.

  • Выход объявляется регистром для индикации внутреннего состояния. Значение выхода всегда совпадает с внутренним состоянием.
  • Добавляется поле для текущего состояния. Это поле отделяется двоеточием от входов и выходов.

Последовательные примитивы имеют дополнительное поле, вставляемое между входным и выходным полями, если сравнивать с комбинационными UDP. Оно представляет текущее состояние примитива и определяет эквивалент состояния выхода. Отделяется двоеточиями.

Verilog Code:
  1. primitive udp_seq (.....);
  2.  
  3. table
  4. 0 0 0 : 0 : 0;
  5. ...
  6. endtable
  7.  
  8. endprimitive

Пример

Verilog Code:
  1. primitive udp_latch(q, clk, d) ;
  2. output q;
  3. input clk, d;
  4.  
  5. reg q;
  6.  
  7. table
  8. //clk d q q+
  9. 0 1 : ? : 1 ;
  10. 0 0 : ? : 0 ;
  11. 1 ? : ? : - ;
  12. endtable
  13.  
  14. endprimitive

Динамические примитивы

В статических схемах значений входов и текущего состояния достаточно для описания состояния выходов. Динамические отличаются от статических тем, что их состояние изменяется в момент перепада фронтов входных сигналов.

Как и в комбинационных и статических примитивах, ? означает итерацию по значениям 0, 1, и x. Тире (−) в колонке выхода показывает, что значение выхода не изменяется.

Все не описанные переходы по умолчанию означают, что на выходе будет x. Следовательно, в предыдущем примере переход тактового сигнала от 0 к x с данными 0 и текущим состоянием 1 приводит к 1 на прямом выходе и x на выходе q.

Все переходы, не имеющие влияния на выход, должны быть явно описаны. В противном случае, они приведут выход к состоянию x. Если примитив днамический по любому из входов, желательный переход должен быть описан для всех фронтов сигнала на входах.

Пример

Verilog Code:
  1. primitive udp_sequential(q, clk, d);
  2. output q;
  3. input clk, d;
  4.  
  5. reg q;
  6.  
  7. table
  8. // выход изменяется передним фронтом clk
  9. // clk d q q+
  10. (01) 0 : ? : 0 ;
  11. (01) 1 : ? : 1 ;
  12. (0?) 1 : 1 : 1 ;
  13. (0?) 0 : 0 : 0 ;
  14. // игнорируем спад импульса clk
  15. (?0) ? : ? : - ;
  16. // игнорируем изменение d в установившемся состоянии clk
  17. ? (??) : ? : - ;
  18. endtable
  19.  
  20. endprimitive

Пример примитва с initial

Verilog Code:
  1. primitive udp_sequential_initial(q, clk, d);
  2. output q;
  3. input clk, d;
  4.  
  5. reg q;
  6.  
  7. initial begin
  8. q = 0;
  9. end
  10.  
  11. table
  12. // вход изменяется передним фронтом clk
  13. // clk d q q+
  14. (01) 0 : ? : 0 ;
  15. (01) 1 : ? : 1 ;
  16. (0?) 1 : 1 : 1 ;
  17. (0?) 0 : 0 : 0 ;
  18. // игнорируем спад импульса clk
  19. (?0) ? : ? : - ;
  20. // игнорируем изменение d в установившемся состоянии clk
  21. ? (??) : ? : - ;
  22. endtable
  23.  
  24. endprimitive