Antworten:
Es ist nicht ähnlich zu ==/ ===, wenn der linke Operand signiert ist, >>>führt er eine Vorzeichenerweiterung durch.
reg signed [9:0] b = 10'sb11_0101_0101;
reg signed [9:0] a_signed;
reg [9:0] a_unsigned;
always_comb begin
a_signed = b >>> 2;
a_unsigned = b >> 2;
end
Ergebnis:
#a_signed 1111010101
#a_unsigned 0011010101
Beispiel auf dem EDA-Spielplatz .
integerTyp) und die arithmetischen Verschiebungsoperatoren wurden erst in Verilog-2001 in Verilog eingeführt.
>>1985 eine logische Verschiebung bedeuten (entnommen aus Pascal, das aus dem Jahr 1970 stammt). Also musste es >>>für die arithmetische Verschiebung verwendet werden.
Gemäß IEEE1800-2012 >>handelt es sich um eine binäre logische Verschiebung, während >>>es sich um eine binäre arithmetische Verschiebung handelt.
Grundsätzlich verwendet die arithmetische Verschiebung den Kontext, um die Füllbits zu bestimmen, also:
>>>) - Verschiebung der angegebenen Anzahl von Bits nach rechts, mit dem Wert des Vorzeichenbits füllen, wenn der Ausdruck vorzeichenbehaftet ist , andernfalls mit Null füllen,<<<) - Verschiebt die angegebene Anzahl von Bits nach links und füllt sie mit Null.Andererseits füllt die logische Verschiebung ( <<, >>) die frei gewordenen Bitpositionen immer mit Nullen.
Zum Beispiel:
a = 5'b10100;
b = a <<< 2; //b == 5'b10000
c = a >>> 2; //c == 5'b11101, 'cause sign bit was `1`
d = a << 2; //d == 5'b10000
e = a >> 2; //e == 5'b00101
c: Wenn Sie verwenden reg [4:0] c, erhalten Sie 5'b00101nicht 5'b11101. Ich denke, es wäre nützlich, das Beispiel zu aktualisieren, um die Typen zu verdeutlichen.
>>und>>>Operatoren ... böse.