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

Операторы приведения

Оператор

Описание

&

И

~&

И-НЕ

|

ИЛИ

~|

ИЛИ-НЕ

^

исключающее ИЛИ

^~ или ~^

исключающее ИЛИ-НЕ

  • Операторы приведения одноместные (унарные).
  • Они выполняют побитовые операции с одним операндом и дают однобитовый результат.
  • Операторы приведения И-НЕ и ИЛИ-НЕ работают подобно И и ИЛИ, но с инверсией выхода.

Биты со значением "неизвестно" обрабатываются по правилам, описанным выше.

Пример

Verilog Code:
  1. module reduction_operators();
  2.  
  3. initial begin
  4. // Побитовое приведение И
  5. $display (" & 4'b1001 = %b", (& 4'b1001));
  6. $display (" & 4'bx111 = %b", (& 4'bx111));
  7. $display (" & 4'bz111 = %b", (& 4'bz111));
  8. // Побитовое приведение И-НЕ
  9. $display (" ~& 4'b1001 = %b", (~& 4'b1001));
  10. $display (" ~& 4'bx001 = %b", (~& 4'bx001));
  11. $display (" ~& 4'bz001 = %b", (~& 4'bz001));
  12. // Побитовое приведение ИЛИ
  13. $display (" | 4'b1001 = %b", (| 4'b1001));
  14. $display (" | 4'bx000 = %b", (| 4'bx000));
  15. $display (" | 4'bz000 = %b", (| 4'bz000));
  16. // Побитовое приведение ИЛИ-НЕ
  17. $display (" ~| 4'b1001 = %b", (~| 4'b1001));
  18. $display (" ~| 4'bx001 = %b", (~| 4'bx001));
  19. $display (" ~| 4'bz001 = %b", (~| 4'bz001));
  20. // Побитовое приведение исключающее ИЛИ
  21. $display (" ^ 4'b1001 = %b", (^ 4'b1001));
  22. $display (" ^ 4'bx001 = %b", (^ 4'bx001));
  23. $display (" ^ 4'bz001 = %b", (^ 4'bz001));
  24. // Побитовое приведение исключающее ИЛИ-НЕ
  25. $display (" ~^ 4'b1001 = %b", (~^ 4'b1001));
  26. $display (" ~^ 4'bx001 = %b", (~^ 4'bx001));
  27. $display (" ~^ 4'bz001 = %b", (~^ 4'bz001));
  28. #10 $finish;
  29. end
  30.  
  31. endmodule
Code:
  1. <span style="color: black; font-size: small;"> & 4'b1001 = 0
  2. & 4'bx111 = x
  3. & 4'bz111 = x
  4. ~& 4'b1001 = 1
  5. ~& 4'bx001 = 1
  6. ~& 4'bz001 = 1
  7. | 4'b1001 = 1
  8. | 4'bx000 = x
  9. | 4'bz000 = x
  10. ~| 4'b1001 = 0
  11. ~| 4'bx001 = 0
  12. ~| 4'bz001 = 0
  13. ^ 4'b1001 = 0
  14. ^ 4'bx001 = x
  15. ^ 4'bz001 = x
  16. ~^ 4'b1001 = 1
  17. ~^ 4'bx001 = x
  18. ~^ 4'bz001 = x</span>

Операторы сдвига

Оператор

Описание

<<

сдвиг влево

>>

сдвиг вправо

  • Левый оператор сдвигается на число бит заданное в правом операнде.
  • Свободные биты заполняются нулями.

Пример

Verilog Code:
  1. module shift_operators();
  2.  
  3. initial begin
  4. // Сдвиг влево
  5. $display (" 4'b1001 << 1 = %b", (4'b1001 << 1));
  6. $display (" 4'b10x1 << 1 = %b", (4'b10x1 << 1));
  7. $display (" 4'b10z1 << 1 = %b", (4'b10z1 << 1));
  8. // Сдвиг вправо
  9. $display (" 4'b1001 >> 1 = %b", (4'b1001 >> 1));
  10. $display (" 4'b10x1 >> 1 = %b", (4'b10x1 >> 1));
  11. $display (" 4'b10z1 >> 1 = %b", (4'b10z1 >> 1));
  12. #10 $finish;
  13. end
  14.  
  15. endmodule
Code:
  1. <span style="color: black; font-size: small;"> 4'b1001 << 1 = 0010
  2. 4'b10x1 << 1 = 0x10
  3. 4'b10z1 << 1 = 0z10
  4. 4'b1001 >> 1 = 0100
  5. 4'b10x1 >> 1 = 010x
  6. 4'b10z1 >> 1 = 010z</span>

Операторы объединения (конкатенации)

  • Конкатенация записывается фигурными скобками { и }, соединяемые части внутри разделяются запятыми.
  • Безразмерные числовые константы в конкатенации не допускаются.

Пример: + {a, b[3:0], c, 4'b1001} // если a и c 8−битовые числа, результат даст 24битовое число.

Пример

Verilog Code:
  1. module concatenation_operator();
  2.  
  3. initial begin
  4. // конкатенация
  5. $display (" {4'b1001,4'b10x1} = %b", {4'b1001,4'b10x1});
  6. #10 $finish;
  7. end
  8.  
  9. endmodule
Code:
  1. <span style="color: black; font-size: small;"> {4'b1001,4'b10x1} = 100110x1</span>

Оператор репликации (повторения)

Этот оператор используется для повторения групп битов n раз. Например, с его помощью можно взять 4-битовую переменную и повторить ее 4 раза для получения 16-битовой переменной.

Оператор

Описание

{{n}m}

повторение значения m, n раз

  • Можно использовать множители повторения:

{3{a}} // равносильно {a, a, a}

  • Можно вкладывать конкатенации и репликации:

{b, {3{c, d}}} // равносильно {b, c, d, c, d, c, d}

Пример

Verilog Code:
  1. module replication_operator();
  2.  
  3. initial begin
  4. // репликация
  5. $display (" {4{4'b1001}} = %b", {4{4'b1001}});
  6. // репликация и конкатенация
  7. $display (" {4{4'b1001,1'bz}} = %b", {4{4'b1001,1'bz}});
  8. #10 $finish;
  9. end
  10.  
  11. endmodule
Code:
  1. <span style="color: black; font-size: small;"> {4{4'b1001} = 1001100110011001
  2. {4{4'b1001,1'bz} = 1001z1001z1001z1001z</span>

Условные операторы

  • Условный оператор выглядит точно как его аналог как в языке C:

cond_expr ? true_expr : false_expr

  • Условное выражение cond_expr если оно истинно, приводит к выполнению true_expr, в противном случае выполняется false_expr

Пример

Verilog Code:
  1. module conditional_operator();
  2.  
  3. wire out;
  4. reg enable,data;
  5. // Трехстабильный буфер
  6. assign out = (enable) ? data : 1'bz;
  7.  
  8. initial begin
  9. $display ("time\t enable data out");
  10. $monitor ("%g\t %b %b %b",$time,enable,data,out);
  11. enable = 0;
  12. data = 0;
  13. #1 data = 1;
  14. #1 data = 0;
  15. #1 enable = 1;
  16. #1 data = 1;
  17. #1 data = 0;
  18. #1 enable = 0;
  19. #10 $finish;
  20. end
  21.  
  22. endmodule
Code:
  1. <span style="color: black; font-size: small;">time enable data out
  2. 0 0 0 z
  3. 1 0 1 z
  4. 2 0 0 z
  5. 3 1 0 0
  6. 4 1 1 1
  7. 5 1 0 0
  8. 6 0 0 z</span>

Приоритет операторов

Оператор

Обозначение

Унарные, Умножение, Деление, Остаток

!,~,*,/,%

Сложение, Вычитание, Сдвиг

+,-,<>

Отношения, Равенство

<=,>=,==,!=,===,!==

Приведения

&,!&,^,^~,|,~|

Логика

&&,||

Условный

?