Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Verilog

Верилог-операторы

Данные, которые невозможно обработать, совершенно бесполезны, в цифровых схемах и компьютерных системах всегда будут требоваться какие-то расчеты. Давайте рассмотрим некоторые операторы в Verilog, которые позволят инструментам синтеза реализовать соответствующие аппаратные элементы.

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

Если второй операнд оператора деления или модуля равен нулю, то результатом будет X. Если любой из операндов оператора степени действителен, то результат также будет реален. Результатом будет 1, если второй операнд оператора степени равен 0 (a 0 ).

Оператор Описание
а + б а плюс б
а - б а минус b
а * б а, умноженное на b
а/б а разделить на b
а % б а по модулю b
а ** б a в степени b

Ниже приведен пример использования арифметических операторов.

  
  
module des;
  reg [7:0]  data1;
  reg [7:0]  data2;
  
  initial begin
    data1 = 45;
    data2 = 9;
    
    $display ("Add + = %d", data1 + data2);
    $display ("Sub - = %d", data1 - data2);
    $display ("Mul * = %d", data1 * data2);
    $display ("Div / = %d", data1 / data2);
    $display ("Mod %% = %d", data1 % data2);
    $display ("Pow ** = %d", data2 ** 2);
    
  end
endmodule

  
Журнал моделирования
ncsim> run
Add + =  54
Sub - =  36
Mul * = 149
Div / =   5
Mod % =   0
Pow ** =  81
ncsim: *W,RNQUIE: Simulation is complete.

Операторы отношения Verilog

Выражение с реляционным оператором даст 1, если выражение оценивается как истинное, и 0, если оно ложно. Если любой из операндов X или Z, то результатом будет X. Операторы отношения имеют более низкий приоритет, чем арифметические операторы, и все операторы отношения имеют одинаковый приоритет.

Оператор Описание
а а меньше b
а> б а больше b
а <=b a меньше или равно b
а>=б a больше или равно b
  
  
module des;
  reg [7:0]  data1;
  reg [7:0]  data2;
  
  initial begin
    data1 = 45;
    data2 = 9;
    $display ("Result for data1 >= data2 : %0d", data1 >= data2);
    
    data1 = 45;
    data2 = 45;
    $display ("Result for data1 <= data2 : %0d", data1 <= data2); data1 = 9; data2 = 8; $display ("Result for data1 > data2 : %0d", data1 > data2);
    
    data1 = 22;
    data2 = 22;
    $display ("Result for data1 < data2 : %0d", data1 < data2);
    
  end
endmodule

  
Журнал моделирования
ncsim> run
Result for data1 >= data2 : 1
Result for data1 <= data2 : 1 Result for data1 > data2 : 1
Result for data1 < data2 : 0
ncsim: *W,RNQUIE: Simulation is complete.

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

Операторы равенства имеют одинаковый приоритет среди них и более низкий приоритет, чем реляционные операторы. Результат равен 1, если истина, и 0, если ложь. Если любой из операндов логического равенства (==) или логического неравенства (!=) равен X или Z, то результатом будет X. Вы можете использовать оператор равенства регистров (===) или оператор равенства регистров (!==) для сопоставления, включая X и Z, и всегда будет иметь известное значение.

Оператор Описание
а ===б a равно b, включая x и z
а !==б a не равно b, включая x и z
а ==b a равно b, результат может быть неизвестен
а !=b a не равно b, результат может быть неизвестен
  
  
module des;
  reg [7:0]  data1;
  reg [7:0]  data2;
  
  initial begin
    data1 = 45;     data2 = 9;      $display ("Result for data1(%0d) === data2(%0d) : %0d", data1, data2, data1 === data2);
    data1 = 'b101x; data2 = 'b1011; $display ("Result for data1(%0b) === data2(%0b) : %0d", data1, data2, data1 === data2);
    data1 = 'b101x; data2 = 'b101x; $display ("Result for data1(%0b) === data2(%0b) : %0d", data1, data2, data1 === data2);
    data1 = 'b101z; data2 = 'b1z00; $display ("Result for data1(%0b) !== data2(%0b) : %0d", data1, data2, data1 !== data2);
    data1 = 39;     data2 = 39;     $display ("Result for data1(%0d) == data2(%0d) : %0d", data1, data2, data1 == data2);
    data1 = 14;     data2 = 14;     $display ("Result for data1(%0d) != data2(%0d) : %0d", data1, data2, data1 != data2);  
  end
endmodule

  
Журнал моделирования
ncsim> run
Result for data1(45) === data2(9) : 0
Result for data1(101x) === data2(1011) : 0
Result for data1(101x) === data2(101x) : 1
Result for data1(101z) !== data2(1z00) : 1
Result for data1(39) == data2(39) : 1
Result for data1(14) != data2(14) : 0
ncsim: *W,RNQUIE: Simulation is complete.

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

Результатом логического и (&&) является 1 или истина, когда оба его операнда истинны или не равны нулю. Результатом логического или (||) является 1 или истина, когда любой из его операндов истинен или отличен от нуля. Если любой из операндов равен X, то и результатом будет X. Оператор логического отрицания (!) преобразует ненулевой или истинный операнд в 0, а нулевой или ложный операнд в 1, в то время как X останется как X.

Оператор Описание
а &&б принимает значение true, если и б верны
а || б принимает значение true, если или б верны
!a Преобразует ненулевое значение в ноль и наоборот
  
  
module des;
  reg [7:0]  data1;
  reg [7:0]  data2;
  
  initial begin
    data1 = 45;     data2 = 9; $display ("Result of data1(%0d) && data2(%0d) : %0d", data1, data2, data1 && data2);
    data1 = 0;      data2 = 4; $display ("Result of data1(%0d) && data2(%0d) : %0d", data1, data2, data1 && data2);
    data1 = 'dx;    data2 = 3; $display ("Result of data1(%0d) && data2(%0d) : %0d", data1, data2, data1 && data2);
    data1 = 'b101z; data2 = 5; $display ("Result of data1(%0d) && data2(%0d) : %0d", data1, data2, data1 && data2);
    data1 = 45;     data2 = 9; $display ("Result of data1(%0d) || data2(%0d) : %0d", data1, data2, data1 || data2);
    data1 = 0;      data2 = 4; $display ("Result of data1(%0d) || data2(%0d) : %0d", data1, data2, data1 || data2);
    data1 = 'dx;    data2 = 3; $display ("Result of data1(%0d) || data2(%0d) : %0d", data1, data2, data1 || data2);
    data1 = 'b101z; data2 = 5; $display ("Result of data1(%0d) || data2(%0d) : %0d", data1, data2, data1 || data2);
    data1 = 4;                 $display ("Result of !data1(%0d) : %0d", data1, !data1);
    data1 = 0;                 $display ("Result of !data1(%0d) : %0d", data1, !data1);    
  end
endmodule

  
Журнал моделирования
ncsim> run
Result of data1(45) && data2(9) : 1
Result of data1(0) && data2(4) : 0
Result of data1(x) && data2(3) : x
Result of data1(Z) && data2(5) : 1
Result of data1(45) || data2(9) : 1
Result of data1(0) || data2(4) : 1
Result of data1(x) || data2(3) : 1
Result of data1(Z) || data2(5) : 1
Result of !data1(4) : 0
Result of !data1(0) : 1
ncsim: *W,RNQUIE: Simulation is complete.

Побитовые операторы Verilog

Этот оператор объединяет бит в одном операнде с соответствующим ему битом в другом операнде для вычисления однобитового результата.

<й>х <й>я <тд>0 <тд>0 <тд>0 <тд>0 <тд>0 <тд>1 <тд>х <тд>х <тд>0 <тд>х <тд>х <тд>х <тд>0 <тд>х <тд>х <тд>х
& 0 1
0
1
x
я
<й>х <й>я <тд>0 <тд>1 <тд>х <тд>х <тд>1 <тд>1 <тд>1 <тд>1 <тд>х <тд>1 <тд>х <тд>х <тд>х <тд>1 <тд>х <тд>х
| 0 1
0
1
x
я
  
  
module des;
  reg 		 data1 [4] ;
  reg 		 data2 [4] ;
  int 		 i, j;
  
  initial begin
    data1[0] = 0;  data2[0] = 0;
    data1[1] = 1;  data2[1] = 1;
    data1[2] = 'x; data2[2] = 'x;
    data1[3] = 'z; data2[3] = 'z;
    
    for (i = 0; i < 4; i += 1) begin
      for (j = 0; j < 4; j += 1) begin
        $display ("data1(%0d) & data2(%0d) = %0d", data1[i], data2[j], data1[i] & data2[j]);
      end
    end
  end
endmodule

  
Журнал моделирования
ncsim> run
data1(0) & data2(0) = 0
data1(0) & data2(1) = 0
data1(0) & data2(x) = 0
data1(0) & data2(z) = 0
data1(1) & data2(0) = 0
data1(1) & data2(1) = 1
data1(1) & data2(x) = x
data1(1) & data2(z) = x
data1(x) & data2(0) = 0
data1(x) & data2(1) = x
data1(x) & data2(x) = x
data1(x) & data2(z) = x
data1(z) & data2(0) = 0
data1(z) & data2(1) = x
data1(z) & data2(x) = x
data1(z) & data2(z) = x
ncsim: *W,RNQUIE: Simulation is complete.

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

Существует два вида операторов сдвига:

  
  
module des;
  reg [7:0] data;
  int       i;
  
  initial begin
    data = 8'h1;
    $display ("Original data = 'd%0d or 'b%0b", data, data);
    for (i = 0; i < 8; i +=1 ) begin
      $display ("data << %0d = 'b%b", i, data << i);
    end
    
    data = 8'h80;
    $display ("Original data = 'd%0d or 'b%0b", data, data);
    for (i = 0; i < 8; i +=1 ) begin $display ("data >> %0d = 'b%b", i, data >> i);
    end
    
    data = 8'h1;
    $display ("
data >> 1 = 'b%b", data >> 1);
  end
endmodule

  
Журнал моделирования
ncsim> run
Original data = 'd1 or 'b00000001
data << 0 = 'b00000001
data << 1 = 'b00000010
data << 2 = 'b00000100
data << 3 = 'b00001000
data << 4 = 'b00010000
data << 5 = 'b00100000
data << 6 = 'b01000000
data << 7 = 'b10000000
Original data = 'd128 or 'b10000000
data >> 0 = 'b10000000
data >> 1 = 'b01000000
data >> 2 = 'b00100000
data >> 3 = 'b00010000
data >> 4 = 'b00001000
data >> 5 = 'b00000100
data >> 6 = 'b00000010
data >> 7 = 'b00000001

data >> 1 = 'b00000000
ncsim: *W,RNQUIE: Simulation is complete.


Verilog

  1. Операторы С#
  2. Учебник Verilog
  3. Конкатенация Verilog
  4. Верилог Задания
  5. Блокировка и неблокировка Verilog
  6. Верилог-функции
  7. Верилог Задача
  8. Генератор часов Verilog
  9. Математические функции Verilog
  10. Формат времени Verilog