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

Комбинационные примитивы

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

Комбинационные примитивы имеют один набор значений для каждого входного состояния, и соответствующее поле для значения выхода. Поле для записи значений входов отделяется от поля выхода двоеточием. Каждая строка таблицы завершается точкой с запятой. Например, следующая таблица состояний описывает три входа с нулевыми состояниями, и нулевой выход.

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

Порядок входов в таблице состояний должен соответствовать порядку входов в списке портов в заголовке примитива. Это не относится к порядку объявлений входов.

Каждая строка таблицы описывает частную комбинацию состояний входов. Если все входы описаны как x [неопределенное состояние], то выход также получит состояние x. Все наборы входных сигналов, которые явно не описаны, приведут к x на выходе.

Пример

В примере ниже, ? представляет безразличное условие. Этот символ показывает итеративную замену 1, 0, и X. Его вхождение в строку таблицы означает, что когда входы имеют состояние 0 и 1, выход имеет состояние 1, независимо от значения текущего состояния.

Вы не описываете все возможные входные состояния. Все комбинации, не указанные явно, по умолчанию приводят выход в состояние X.

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

Verilog Code:
  1. // Пример кода с описанием функции
  2. primitive udp_body (
  3. a, // Port a
  4. b, // Port b
  5. c // Port c
  6. );
  7. output a;
  8. input b,c;
  9.  
  10. // Код функции примитива
  11. // A = B | C;
  12. table
  13. // B C : A
  14. ? 1 : 1;
  15. 1 ? : 1;
  16. 0 0 : 0;
  17. endtable
  18.  
  19. endprimitive

Тест кода udp_body

Verilog Code:
  1. `include "udp_body.v"
  2. module udp_body_tb();
  3.  
  4. reg b,c;
  5. wire a;
  6.  
  7. udp_body udp (a,b,c);
  8.  
  9. initial begin
  10. $monitor(" B = %b C = %b A = %b",b,c,a);
  11. b = 0;
  12. c = 0;
  13. #1 b = 1;
  14. #1 b = 0;
  15. #1 c = 1;
  16. #1 b = 1'bx;
  17. #1 c = 0;
  18. #1 b = 1;
  19. #1 c = 1'bx;
  20. #1 b = 0;
  21. #1 $finish;
  22. end
  23.  
  24. endmodule
Code:
  1. <span style="color: black; font-size: small;"> B = 0 C = 0 A = 0
  2. B = 1 C = 0 A = 1
  3. B = 0 C = 0 A = 0
  4. B = 0 C = 1 A = 1
  5. B = x C = 1 A = 1
  6. B = x C = 0 A = x
  7. B = 1 C = 0 A = 1
  8. B = 1 C = x A = 1
  9. B = 0 C = x A = x</span>