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

Арифметические операторы

  • Бинарные: +, −, *, /, % (оператор модуля)
  • Унарные: +, − (Используются для указания знака)
  • При целочисленном делении отбрасывается дробная часть
  • При получении модуля знак наследуется от первого операнда
  • Если хотя бы один из битовых операндов x, результат будет x
  • Регистровый тип данных используется как беззнаковый (отрицательные числа хранятся в двоичном дополнительном коде)

Пример

Verilog Code:
  1. module arithmetic_operators();
  2.  
  3. initial begin
  4. $display (" 5 + 10 = %d", 5 + 10);
  5. $display (" 5 - 10 = %d", 5 - 10);
  6. $display (" 10 - 5 = %d", 10 - 5);
  7. $display (" 10 * 5 = %d", 10 * 5);
  8. $display (" 10 / 5 = %d", 10 / 5);
  9. $display (" 10 / -5 = %d", 10 / -5);
  10. $display (" 10 %s 3 = %d","%", 10 % 3);
  11. $display (" +5 = %d", +5);
  12. $display (" -5 = %d", -5);
  13. #10 $finish;
  14. end
  15.  
  16. endmodule
Code:
  1. <span style="color: black; font-size: small;"> 5 + 10 = 15
  2. 5 - 10 = -5
  3. 10 - 5 = 5
  4. 10 * 5 = 50
  5. 10 / 5 = 2
  6. 10 / -5 = -2
  7. 10 % 3 = 1
  8. +5 = 5
  9. -5 = -5</span>

Операторы отношений

Оператор

Описание

a<b

a меньше b

a>b

a больше b

a<=b

a меньше или равно b

a>=b

a больше или равно b

  • Результат скалярного типа (пример a<b)
  • 0 если отношение ложно (если a больше b)
  • 1 если отношение истинно (если a меньше или равно b)
  • x если любой из операндов имеет бит x (если a или b содержат x)

Примечание: При значении x или z, результат теста ложный (0)

Пример

Verilog Code:
  1. module relational_operators();
  2.  
  3. initial begin
  4. $display (" 5 <= 10 = %b", (5 <= 10));
  5. $display (" 5 >= 10 = %b", (5 >= 10));
  6. $display (" 1'bx <= 10 = %b", (1'bx <= 10));
  7. $display (" 1'bz <= 10 = %b", (1'bz <= 10));
  8. #10 $finish;
  9. end
  10.  
  11. endmodule
Code:
  1. <span style="color: black; font-size: small;"> 5 <= 10 = 1
  2. 5 >= 10 = 0
  3. 1'bx <= 10 = x
  4. 1'bz <= 10 = x</span>

Операторы равенства

Есть два типа операторов равенства: Case и логическое.

Оператор

Описание

a===b

a равно b, включая x и z (Case равенство)

a!==b

a не равно b, включая x и z (Case неравенство)

a==b

a равно b, результат может быть неизвестным (логическое равенство)

a!=b

a не равно b, результат может быть неизвестным (логическое неравенство)

  • Операнды сравниваются бит за битом, в неравных по размеру операндах больший заполняется нулями
  • Результат 0 (ложный) или 1 (истинный)
  • Для операторов == и != результат окажется x, если хотя бы один из операндов содержит x или z
  • Для операторов === и !== operators биты x и z подлежат сравнению и должны совпадать с результатом для получения значения истины

Примечание: Результат может быть только 0 или 1.

Пример

Verilog Code:
  1. module equality_operators();
  2.  
  3. initial begin
  4. // Case равенство
  5. $display (" 4'bx001 === 4'bx001 = %b", (4'bx001 === 4'bx001));
  6. $display (" 4'bx0x1 === 4'bx001 = %b", (4'bx0x1 === 4'bx001));
  7. $display (" 4'bz0x1 === 4'bz0x1 = %b", (4'bz0x1 === 4'bz0x1));
  8. $display (" 4'bz0x1 === 4'bz001 = %b", (4'bz0x1 === 4'bz001));
  9. // Case неравенство
  10. $display (" 4'bx0x1 !== 4'bx001 = %b", (4'bx0x1 ! == 4'bx001));
  11. $display (" 4'bz0x1 !== 4'bz001 = %b", (4'bz0x1 ! == 4'bz001));
  12. // Логическое равенство
  13. $display (" 5 == 10 = %b", (5 == 10));
  14. $display (" 5 == 5 = %b", (5 == 5));
  15. // Логическое неравенство
  16. $display (" 5 != 5 = %b", (5 ! = 5));
  17. $display (" 5 != 6 = %b", (5 ! = 6));
  18. #10 $finish;
  19. end
  20.  
  21. endmodule
Code:
  1. <span style="color: black; font-size: small;"> 4'bx001 === 4'bx001 = 1
  2. 4'bx0x1 === 4'bx001 = 0
  3. 4'bz0x1 === 4'bz0x1 = 1
  4. 4'bz0x1 === 4'bz001 = 0
  5. 4'bx0x1 !== 4'bx001 = 1
  6. 4'bz0x1 !== 4'bz001 = 1
  7. 5 == 10 = 0
  8. 5 == 5 = 1
  9. 5 != 5 = 0
  10. 5 != 6 = 1</span>

Логические операторы

Оператор

Описание

!

логическое отрицание НЕ

&&

логическое И

||

логическое ИЛИ

  • Выражения, связанные && и || вычисляются слева направо
  • Вычисления прекращаются, как только выясняется результат
  • Результат имеет скалярный тип:
    1. 0 если отношение ложное
    2. 1 если отношение истинное
    3. x если любой из операторов имеет неизвестные (x) биты

Пример

Verilog Code:
  1. module logical_operators();
  2.  
  3. initial begin
  4. // Логическое И
  5. $display ("1'b1 && 1'b1 = %b", (1'b1 && 1'b1));
  6. $display ("1'b1 && 1'b0 = %b", (1'b1 && 1'b0));
  7. $display ("1'b1 && 1'bx = %b", (1'b1 && 1'bx));
  8. // Логическое ИЛИ
  9. $display ("1'b1 || 1'b0 = %b", (1'b1 || 1'b0));
  10. $display ("1'b0 || 1'b0 = %b", (1'b0 || 1'b0));
  11. $display ("1'b0 || 1'bx = %b", (1'b0 || 1'bx));
  12. // Логическое НЕ
  13. $display ("! 1'b1 = %b", ( ! 1'b1));
  14. $display ("! 1'b0 = %b", ( ! 1'b0));
  15. #10 $finish;
  16. end
  17.  
  18. endmodule
Code:
  1. <span style="color: black; font-size: small;"> 1'b1 && 1'b1 = 1
  2. 1'b1 && 1'b0 = 0
  3. 1'b1 && 1'bx = x
  4. 1'b1 || 1'b0 = 1
  5. 1'b0 || 1'b0 = 0
  6. 1'b0 || 1'bx = x
  7. ! 1'b1 = 0
  8. ! 1'b0 = 1</span>

Битовые операторы

Битовые операторы выполняют операции над каждым битом в двух операндах. Операции выполняются поразрядно. Если один из операторов оказывается короче другого, то он расширяется в битах до большего операнда и новые биты заполняются нулями.

Оператор

Описание

~

побитовое отрицание НЕ

&

побитовое И

|

побитовое ИЛИ

^

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

^~ или ~^

 
  • Вычисления включают неизвестнтые биты следующим образом:
    1. ~x = x
    2. 0&x = 0
    3. 1&x = x&x = x
    4. 1|x = 1
    5. 0|x = x|x = x
    6. 0^x = 1^x = x^x = x
    7. 0^~x = 1^~x = x^~x = x
  • Если операнды имеют неравную длину, то короткий операнд заполняется нулями в старших битовых позициях.

Пример

Verilog Code:
  1. module bitwise_operators();
  2.  
  3. initial begin
  4. // Побитовое отрицание
  5. $display (" ~4'b0001 = %b", (~4'b0001));
  6. $display (" ~4'bx001 = %b", (~4'bx001));
  7. $display (" ~4'bz001 = %b", (~4'bz001));
  8. // Побитовое И
  9. $display (" 4'b0001 & 4'b1001 = %b", (4'b0001 & 4'b1001));
  10. $display (" 4'b1001 & 4'bx001 = %b", (4'b1001 & 4'bx001));
  11. $display (" 4'b1001 & 4'bz001 = %b", (4'b1001 & 4'bz001));
  12. // Побитовое ИЛИ
  13. $display (" 4'b0001 | 4'b1001 = %b", (4'b0001 | 4'b1001));
  14. $display (" 4'b0001 | 4'bx001 = %b", (4'b0001 | 4'bx001));
  15. $display (" 4'b0001 | 4'bz001 = %b", (4'b0001 | 4'bz001));
  16. // Побитовое исключающее ИЛИ
  17. $display (" 4'b0001 ^ 4'b1001 = %b", (4'b0001 ^ 4'b1001));
  18. $display (" 4'b0001 ^ 4'bx001 = %b", (4'b0001 ^ 4'bx001));
  19. $display (" 4'b0001 ^ 4'bz001 = %b", (4'b0001 ^ 4'bz001));
  20. // Побитовое исключающее ИЛИ-НЕ
  21. $display (" 4'b0001 ~^ 4'b1001 = %b", (4'b0001 ~^ 4'b1001));
  22. $display (" 4'b0001 ~^ 4'bx001 = %b", (4'b0001 ~^ 4'bx001));
  23. $display (" 4'b0001 ~^ 4'bz001 = %b", (4'b0001 ~^ 4'bz001));
  24. #10 $finish;
  25. end
  26.  
  27. endmodule
Code:
  1. <span style="color: black; font-size: small;"> ~4'b0001 = 1110
  2. ~4'bx001 = x110
  3. ~4'bz001 = x110
  4. 4'b0001 & 4'b1001 = 0001
  5. 4'b1001 & 4'bx001 = x001
  6. 4'b1001 & 4'bz001 = x001
  7. 4'b0001 | 4'b1001 = 1001
  8. 4'b0001 | 4'bx001 = x001
  9. 4'b0001 | 4'bz001 = x001
  10. 4'b0001 ^ 4'b1001 = 1000
  11. 4'b0001 ^ 4'bx001 = x000
  12. 4'b0001 ^ 4'bz001 = x000
  13. 4'b0001 ~^ 4'b1001 = 0111
  14. 4'b0001 ~^ 4'bx001 = x111
  15. 4'b0001 ~^ 4'bz001 = x111</span>