Verilog-operators
Gegevens die niet kunnen worden verwerkt, zijn vrij nutteloos, er zal altijd een vorm van berekening nodig zijn in digitale circuits en computersystemen. Laten we eens kijken naar enkele van de operators in Verilog waarmee synthesetools geschikte hardware-elementen kunnen realiseren.
Verilog rekenkundige operatoren
Als de tweede operand van een deling- of modulus-operator nul is, dan is het resultaat X. Als een van de operanden van de power-operator reëel is, dan zal het resultaat ook reëel zijn. Het resultaat is 1 als de tweede operand van een energieoperator 0 is (a 0 ).
Operator | Beschrijving |
---|---|
a + b | a plus b |
a - b | a min b |
a * b | a vermenigvuldigd met b |
a / b | a gedeeld door b |
a % b | a modulo b |
a ** b | a tot de macht van b |
Hieronder vindt u een voorbeeld van hoe rekenkundige operatoren worden gebruikt.
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
Simulatielogboek ncsim> run Add + = 54 Sub - = 36 Mul * = 149 Div / = 5 Mod % = 0 Pow ** = 81 ncsim: *W,RNQUIE: Simulation is complete.
Verilog relationele operators
Een uitdrukking met de relationele operator resulteert in een 1 als de uitdrukking als waar wordt beoordeeld, en 0 als deze onwaar is. Als een van de operanden X of Z is, is het resultaat X. Relationele operatoren hebben een lagere prioriteit dan rekenkundige operatoren en alle relationele operatoren hebben dezelfde prioriteit.
Operator | Beschrijving |
---|---|
a | a minder dan b |
a> b | a groter dan b |
a <=b | a kleiner dan of gelijk aan b |
a>=b | a groter dan of gelijk aan 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
Simulatielogboek 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 Equality Operators
Gelijkheidsoperatoren hebben dezelfde prioriteit en hebben een lagere prioriteit dan relationele exploitanten. Het resultaat is 1 indien waar, en 0 indien onwaar. Als een van de operanden van logische gelijkheid (==) of logische ongelijkheid (!=) X of Z is, dan is het resultaat X. U kunt de operator voor hoofdlettergelijkheid (===) of de operator voor hoofdletterongelijkheid gebruiken (!==) om overeen te komen, inclusief X en Z en zal altijd een bekende waarde hebben.
Operator | Beschrijving |
---|---|
a ===b | a gelijk aan b, inclusief x en z |
a !==b | a niet gelijk aan b, inclusief x en z |
a ==b | a gelijk aan b, resultaat kan onbekend zijn |
a !=b | a niet gelijk aan b, resultaat kan onbekend zijn |
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
Simulatielogboek 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 logische operators
Het resultaat van een logische en (&&) is 1 of waar als beide operanden waar of niet-nul zijn. Het resultaat van een logische of (||) is 1 of waar als een van de operanden waar of niet-nul is. Als een van de operanden X is, is het resultaat ook X. De logische ontkenning (!) operator zal een niet-nul of een echte operand omzetten in 0 en een nul of een valse operand in 1, terwijl een X een X blijft.
Operator | Beschrijving |
---|---|
een &&b | evalueert naar waar als een en b zijn waar |
een || b | evalueert naar waar als een of b zijn waar |
!a | Converteert een waarde die niet nul is naar nul en vice versa |
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
Simulatielogboek 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 Bitwise Operators
Deze operator combineert een bit in de ene operand met de bijbehorende bit in de andere operand om een enkel bitresultaat te berekenen.
& | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | x | x |
x | 0 | x | x | x |
z | 0 | x | x | x |
| | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | 1 | x | x |
1 | 1 | 1 | 1 | 1 |
x | x | 1 | x | x |
z | x | 1 | x | 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
Simulatielogboek 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 Shift Operators
Er zijn twee soorten ploegendienstoperators:
- Logische ploegoperators     :<< and>>
- Rekenkundige ploegendiensten:<<
>>
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
Simulatielogboek 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