可程式設計邏輯/Verilog 運算子
本頁將討論一些 Verilog 運算子。
算術運算子如下
- + (加法)
- - (減法)
- * (乘法)
- / (除法)
- % (模運算或餘數)。
實際上,除法和模運算子通常僅在模擬中可用,而不是在綜合中可用。除法是一個特別複雜的運算,大多數可程式設計晶片沒有專門的除法模組。
有許多邏輯運算子。邏輯運算子作用於整個值(多個位),並將“零”值視為“假”,並將“非零”值視為“真”。
- ! (邏輯非)
- && (邏輯與)
- || (邏輯或)
歸約運算子是
- ! 非
- && 與
- || 或
Verilog 會將整個數字轉換為 1(如果包含非零位)或 0(如果僅包含零),然後執行等效的位運算。因此,答案也是一位。
示例
!0000 = ~0 = 1
!1101 = ~1 = 0
!1000 = ~1 = 0
!(任何非零二進位制數) = ~1 = 0
0000 && 1101 = 0 & 1 = 0
0010 && 1101 = 1 & 1 = 1
0000 || 0110 = 0 | 1 = 1
0000 || 0000 = 0 | 0 = 0
有許多位運算子,可以在匯流排中的每個單獨位上執行布林運算。
- ~ (位非)
- & (位與)
- | (位或)
- ^ (位異或)
- ~^ (位異或非)

module FullAdder(a, b, s, cin, cout); input a, b, cin; output s, cout; wire axorb; wor partial; assign axorb = a ^ b; assign s = axorb ^ cin; assign partial = (axorb & cin); assign partial = (a & b); assign cout = partial; endmodule
這將有助於說明這些位運算是如何執行的。
有三個賦值運算子,每個運算子都執行不同的任務,並且與不同的資料型別一起使用
- assign (連續賦值)
- <= (非阻塞賦值)
- = (阻塞賦值)
連續賦值通常與沒有儲存器的線和其他結構一起使用。連續賦值是連續發生的,並且與所有其他計算任務並行進行。連續賦值的順序或它們在程式碼中的位置無關緊要。
非阻塞賦值是一次性發生的賦值,但可以同時發生。這些賦值通常與暫存器和整數資料型別以及其他具有儲存器的其他資料型別一起使用。以下兩個帶有非阻塞賦值的程式碼片段是等效的
a <= a + b; b <= b + a;
和
b <= b + a; a <= a + b;
單個程式碼塊中的所有非阻塞賦值同時發生。它們只發生一次,並且在執行操作之前讀取所有此類賦值的輸入值(這需要在綜合中使用額外的鎖存器結構)。
阻塞賦值也用於暫存器和整數(以及其他儲存器資料型別)。阻塞賦值按順序發生,並且賦值後的程式碼只有在賦值發生後才會執行。
如果要右移,則分配 shr = a >> 1 // 將 a 右移 1 位。
例如 a=8'b10011011 則 x=8'b01001101
分配 shr = a >> 2 // 將 a 右移 2 位。
例如 a=8'b10010101 則 x=8'b00100101
如果要左移,則分配 shl = a << 1 // 將 a 左移 1 位。
例如 a=8'b10011011 則 x=8'b00110110
分配 shl = a << 2 // 將 a 左移 2 位。
例如 a=8'b10011011 則 x=8'b01101100
組合 2 個或多個運算元
這些與上面的位運算相同。
<condition> ? <if true> : <else>;
如果條件為真,則將使用 <if true> 的值,否則將使用 <else> 的值。示例
assign EDB = ram_rd_en ? ram[EAB[9:0]] : 32'bz;
如果 ram_rd_en 為真,則 ram[EAB[9:0]] 將被分配給 EDB。