Верилог-операторы
Данные, которые невозможно обработать, совершенно бесполезны, в цифровых схемах и компьютерных системах всегда будут требоваться какие-то расчеты. Давайте рассмотрим некоторые операторы в 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 | 1 | <й>хй> <й>яй>
---|---|---|
0 | <тд>0тд> <тд>0тд> <тд>0тд> <тд>0тд>||
1 | <тд>0тд> <тд>1тд> <тд>хтд> <тд>хтд>||
x | <тд>0тд> <тд>хтд> <тд>хтд> <тд>хтд>||
я | <тд>0тд> <тд>хтд> <тд>хтд> <тд>хтд>
| | 0 | 1 | <й>хй> <й>яй>
---|---|---|
0 | <тд>0тд> <тд>1тд> <тд>хтд> <тд>хтд>||
1 | <тд>1тд> <тд>1тд> <тд>1тд> <тд>1тд>||
x | <тд>хтд> <тд>1тд> <тд>хтд> <тд>хтд>||
я | <тд>хтд> <тд>1тд> <тд>хтд> <тд>хтд>
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
Существует два вида операторов сдвига:
- Операторы логического сдвига     :<< and>>
- Арифметические операторы сдвига:<<<и>>>
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