Операторы приведения
Оператор |
Описание |
& |
И |
~& |
И-НЕ |
| |
ИЛИ |
~| |
ИЛИ-НЕ |
^ |
исключающее ИЛИ |
^~ или ~^ |
исключающее ИЛИ-НЕ |
- Операторы приведения одноместные (унарные).
- Они выполняют побитовые операции с одним операндом и дают однобитовый результат.
- Операторы приведения И-НЕ и ИЛИ-НЕ работают подобно И и ИЛИ, но с инверсией выхода.
Биты со значением "неизвестно" обрабатываются по правилам, описанным выше.
Пример
Verilog Code:
module reduction_operators(); initial begin // Побитовое приведение И $display (" & 4'b1001 = %b", (& 4'b1001)); $display (" & 4'bx111 = %b", (& 4'bx111)); $display (" & 4'bz111 = %b", (& 4'bz111)); // Побитовое приведение И-НЕ $display (" ~& 4'b1001 = %b", (~& 4'b1001)); $display (" ~& 4'bx001 = %b", (~& 4'bx001)); $display (" ~& 4'bz001 = %b", (~& 4'bz001)); // Побитовое приведение ИЛИ $display (" | 4'b1001 = %b", (| 4'b1001)); $display (" | 4'bx000 = %b", (| 4'bx000)); $display (" | 4'bz000 = %b", (| 4'bz000)); // Побитовое приведение ИЛИ-НЕ $display (" ~| 4'b1001 = %b", (~| 4'b1001)); $display (" ~| 4'bx001 = %b", (~| 4'bx001)); $display (" ~| 4'bz001 = %b", (~| 4'bz001)); // Побитовое приведение исключающее ИЛИ $display (" ^ 4'b1001 = %b", (^ 4'b1001)); $display (" ^ 4'bx001 = %b", (^ 4'bx001)); $display (" ^ 4'bz001 = %b", (^ 4'bz001)); // Побитовое приведение исключающее ИЛИ-НЕ $display (" ~^ 4'b1001 = %b", (~^ 4'b1001)); $display (" ~^ 4'bx001 = %b", (~^ 4'bx001)); $display (" ~^ 4'bz001 = %b", (~^ 4'bz001)); #10 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> & 4'b1001 = 0 & 4'bx111 = x & 4'bz111 = x ~& 4'b1001 = 1 ~& 4'bx001 = 1 ~& 4'bz001 = 1 | 4'b1001 = 1 | 4'bx000 = x | 4'bz000 = x ~| 4'b1001 = 0 ~| 4'bx001 = 0 ~| 4'bz001 = 0 ^ 4'b1001 = 0 ^ 4'bx001 = x ^ 4'bz001 = x ~^ 4'b1001 = 1 ~^ 4'bx001 = x ~^ 4'bz001 = x</span>
Операторы сдвига
Оператор |
Описание |
<< |
сдвиг влево |
>> |
сдвиг вправо |
- Левый оператор сдвигается на число бит заданное в правом операнде.
- Свободные биты заполняются нулями.
Пример
Verilog Code:
module shift_operators(); initial begin // Сдвиг влево $display (" 4'b1001 << 1 = %b", (4'b1001 << 1)); $display (" 4'b10x1 << 1 = %b", (4'b10x1 << 1)); $display (" 4'b10z1 << 1 = %b", (4'b10z1 << 1)); // Сдвиг вправо $display (" 4'b1001 >> 1 = %b", (4'b1001 >> 1)); $display (" 4'b10x1 >> 1 = %b", (4'b10x1 >> 1)); $display (" 4'b10z1 >> 1 = %b", (4'b10z1 >> 1)); #10 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> 4'b1001 << 1 = 0010 4'b10x1 << 1 = 0x10 4'b10z1 << 1 = 0z10 4'b1001 >> 1 = 0100 4'b10x1 >> 1 = 010x 4'b10z1 >> 1 = 010z</span>
Операторы объединения (конкатенации)
- Конкатенация записывается фигурными скобками { и }, соединяемые части внутри разделяются запятыми.
- Безразмерные числовые константы в конкатенации не допускаются.
Пример: + {a, b[3:0], c, 4'b1001} // если a и c 8−битовые числа, результат даст 24битовое число.
Пример
Verilog Code:
module concatenation_operator(); initial begin // конкатенация $display (" {4'b1001,4'b10x1} = %b", {4'b1001,4'b10x1}); #10 $finish; end endmodule
Code:
<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:
module replication_operator(); initial begin // репликация $display (" {4{4'b1001}} = %b", {4{4'b1001}}); // репликация и конкатенация $display (" {4{4'b1001,1'bz}} = %b", {4{4'b1001,1'bz}}); #10 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> {4{4'b1001} = 1001100110011001 {4{4'b1001,1'bz} = 1001z1001z1001z1001z</span>
Условные операторы
- Условный оператор выглядит точно как его аналог как в языке C:
cond_expr ? true_expr : false_expr
- Условное выражение cond_expr если оно истинно, приводит к выполнению true_expr, в противном случае выполняется false_expr
Пример
Verilog Code:
module conditional_operator(); wire out; reg enable,data; // Трехстабильный буфер assign out = (enable) ? data : 1'bz; initial begin $display ("time\t enable data out"); $monitor ("%g\t %b %b %b",$time,enable,data,out); enable = 0; data = 0; #1 data = 1; #1 data = 0; #1 enable = 1; #1 data = 1; #1 data = 0; #1 enable = 0; #10 $finish; end endmodule
Code:
<span style="color: black; font-size: small;">time enable data out 0 0 0 z 1 0 1 z 2 0 0 z 3 1 0 0 4 1 1 1 5 1 0 0 6 0 0 z</span>
Приоритет операторов
Оператор |
Обозначение |
Унарные, Умножение, Деление, Остаток |
!,~,*,/,% |
Сложение, Вычитание, Сдвиг |
+,-,<> |
Отношения, Равенство |
<=,>=,==,!=,===,!== |
Приведения |
&,!&,^,^~,|,~| |
Логика |
&&,|| |
Условный |
? |