注意:后續(xù)技術(shù)分享,第一時間更新,以及更多更及時的技術(shù)資訊和學(xué)習(xí)技術(shù)資料,將在公眾號CTO Plus發(fā)布,請關(guān)注公眾號:CTO Plus
FPGA設(shè)計Verilog基礎(chǔ)之Verilog的運(yùn)算符Verilog是一種硬件描述語言,支持多種運(yùn)算符,包括算術(shù)運(yùn)算符、比較(關(guān)系)運(yùn)算符、邏輯運(yùn)算符、條件運(yùn)算符https://mp.weixin.qq.com/s?__biz=MzIyMzQ5MTY4OQ==&mid=2247485152&idx=1&sn=28ca47f6cae79f6db708086d6f7c3bad&chksm=e81c25e6df6bacf0cd2d04315c716e870add24c8e1c11be0840a1c7e710bdba157a4a545d427#rd
Verilog是一種硬件描述語言,支持多種運(yùn)算符,包括算術(shù)運(yùn)算符、比較(關(guān)系)運(yùn)算符、邏輯運(yùn)算符、條件運(yùn)算符、位運(yùn)算符、移位運(yùn)算符、拼接運(yùn)算符和其他一些運(yùn)算符。在進(jìn)行Verilog開發(fā)時,需要熟悉各種運(yùn)算符的作用和使用方法,以及運(yùn)算符的優(yōu)先級。
在前面的文章中已經(jīng)介紹了一百多個Verilog關(guān)鍵字的特性和使用的總結(jié),詳情請參考文末的推薦閱讀。
FPGA專欄:https://blog.csdn.net/zhouruifu2015/category_5690253
例如:
module comparator(input a, input b, output eq);
? assign eq = (a == b);
endmodule
上述代碼定義了一個比較器模塊,它有兩個輸入端口a和b,一個輸出端口eq。內(nèi)部邏輯使用比較運(yùn)算符實現(xiàn)。
1. 算術(shù)運(yùn)算符
在Verilog HDL語言中,算術(shù)運(yùn)算符又稱為二進(jìn)制運(yùn)算符。
Verilog支持加、減、乘、除和取模等算術(shù)運(yùn)算符,算術(shù)運(yùn)算符,簡單來說,就是數(shù)學(xué)運(yùn)算里面的加減乘除,數(shù)字邏輯處理有時候也需要進(jìn)行數(shù)字運(yùn)算,所以需要算術(shù)運(yùn)算符。這些運(yùn)算符的作用和使用方法如下:
加法運(yùn)算符(+):將兩個數(shù)相加?;蚍Q為正值運(yùn)算符。
減法運(yùn)算符(-):將兩個數(shù)相減?;蚍Q為負(fù)值運(yùn)算符。
乘法運(yùn)算符(*):將兩個數(shù)相乘。
除法運(yùn)算符(/):將兩個數(shù)相除。
取模運(yùn)算符(%):求兩個數(shù)相除的余數(shù)?;蚍Q為求余運(yùn)算符。
例如,下面是一個使用算術(shù)運(yùn)算符的示例:
reg [7:0] a, b, c;
assign c = a + b;
assign c = a - b;
assign c = a * b;
assign c = a / b;
assign c = a % b;
Verilog實現(xiàn)乘除比較浪費組合邏輯資源,尤其是除法。一般2的指數(shù)次冪的乘除法使用移位運(yùn)算來完成運(yùn)算,詳情可以看移位運(yùn)算符部分的內(nèi)容。非2的指數(shù)次冪的乘除法一般是調(diào)用現(xiàn)成的IP,QUARTUS/ISE等工具軟件會有提供,不過這些工具軟件提供的IP也是由最底層的組合邏輯(與或非門等)搭建而成的。
注意:? 在進(jìn)行算術(shù)運(yùn)算操作時,如果某一個操作數(shù)有不確定的值x,則整個結(jié)果也為不定值x。
2. 比較(關(guān)系)運(yùn)算符
Verilog支持等于、不等于、小于、小于等于、大于和大于等于等比較運(yùn)算符,關(guān)系運(yùn)算符主要是用來做一些條件判斷用的,在進(jìn)行關(guān)系運(yùn)算符時,如果聲明的關(guān)系是假的,則返回值是0,如果聲明的關(guān)系是真的,則返回值是1;所有的關(guān)系運(yùn)算符有著相同的優(yōu)先級別,關(guān)系運(yùn)算符的優(yōu)先級別低于算術(shù)運(yùn)算符的優(yōu)先級別。這些運(yùn)算符的作用和使用方法如下:
等于運(yùn)算符(==):判斷兩個數(shù)是否相等。
不等于運(yùn)算符(!=):判斷兩個數(shù)是否不相等。
小于運(yùn)算符(<):判斷第一個數(shù)是否小于第二個數(shù)。
小于等于運(yùn)算符(<=):判斷第一個數(shù)是否小于等于第二個數(shù)。
大于運(yùn)算符(>):判斷第一個數(shù)是否大于第二個數(shù)。
大于等于運(yùn)算符(>=):判斷第一個數(shù)是否大于等于第二個數(shù)。
例如,下面是一個使用比較運(yùn)算符的示例:
reg [7:0] a, b;
wire result;
assign result = (a == b);
assign result = (a != b);
assign result = (a < b);
assign result = (a <= b);
assign result = (a > b);
assign result = (a >= b);
3. 邏輯運(yùn)算符
Verilog支持與、或、非、異或等邏輯運(yùn)算符,邏輯運(yùn)算符是連接多個關(guān)系表達(dá)式用的,可實現(xiàn)更加復(fù)雜的判斷,一般不單獨使用,都需要配合具體語句來實現(xiàn)完整的邏輯。這些運(yùn)算符的作用和使用方法如下:
邏輯與運(yùn)算符(&&):當(dāng)兩個條件都為真時,返回真。
邏輯或運(yùn)算符(||):當(dāng)兩個條件中至少有一個為真時,返回真。
邏輯非運(yùn)算符(!):將一個條件取反。
例如,下面是一個使用邏輯運(yùn)算符的示例:
reg [7:0] a, b;
wire result;
assign result = (a && b);
assign result = (a || b);
assign result = !a;
4. 位(移位)運(yùn)算符
Verilog支持按位與、按位或、按位異或、按位取反、左移和右移等位運(yùn)算符,位運(yùn)算符是一類最基本的運(yùn)算符,可以認(rèn)為它們直接對應(yīng)數(shù)字邏輯中的與、或、非門等邏輯門。
位運(yùn)算符的與、或、非與邏輯運(yùn)算符邏輯與、邏輯或、邏輯非使用時候容易混淆,邏輯運(yùn)算符一般用在條件判斷上,位運(yùn)算符一般用在信號賦值上。
移位運(yùn)算符包括左移位運(yùn)算符和右移位運(yùn)算符,這兩種移位運(yùn)算符都用0來填補(bǔ)移出的空位。這些運(yùn)算符的作用和使用方法如下:
按位與運(yùn)算符(&):將兩個數(shù)的二進(jìn)制位進(jìn)行與運(yùn)算。
按位或運(yùn)算符(|):將兩個數(shù)的二進(jìn)制位進(jìn)行或運(yùn)算。
按位異或運(yùn)算符(^):將兩個數(shù)的二進(jìn)制位進(jìn)行異或運(yùn)算。
按位取反運(yùn)算符(~):將一個數(shù)的二進(jìn)制位進(jìn)行取反運(yùn)算(每個位進(jìn)行取反)。
左移運(yùn)算符(<<):將一個數(shù)的二進(jìn)制位向左移動。
右移運(yùn)算符(>>):將一個數(shù)的二進(jìn)制位向右移動。
例如,下面是一個使用位運(yùn)算符的示例:
reg [7:0] a, b;
wire result;
assign result = (a & b);?? // 將 a 的每個位與 b 相同的位進(jìn)行相與
assign result = (a | b);??? // 將 a 的每個位與 b 相同的位進(jìn)行相或
assign result = (a ^ b);?? // 將 a 的每個位與 b 相同的位進(jìn)行異或
assign result = ~a;????? // 將 a 的每個位進(jìn)行取反
assign result = (a << 2);? 將 a 左移 2 位
assign result = (a >> 2);? 將 a 右移 2 位
假設(shè)a有8bit數(shù)據(jù)位寬,那么a<<2,表示a左移2bit,a還是8bit數(shù)據(jù)位寬,a的最高2bit數(shù)據(jù)被移位丟棄了,最低2bit數(shù)據(jù)固定補(bǔ)0。如果a是3(二進(jìn)制:00000011),那么3左移2bit,3<<2,就是12(二進(jìn)制:00001100)。一般使用左移位運(yùn)算代替乘法,右移位運(yùn)算代替除法,但是這種也只能表示2的指數(shù)次冪的乘除法。
5. 條件運(yùn)算符
條件操作符一般來構(gòu)建從兩個輸入中選擇一個作為輸出的條件選擇結(jié)構(gòu)(在其他語言中也叫三目運(yùn)算符),功能等同于always中的if-else語句。
符號 |
使用方法 |
說明 |
? : |
a ? b : c |
如果 a 為真,就選擇 b,否則選擇 c |
代碼示例:
assign out = (sel == 1) ? in1 : in2;
上述代碼中,sel為選擇信號,in1和in2為兩個輸入信號,out為輸出信號。當(dāng)sel等于1時,將in1賦值給out,否則將in2賦值給out。
6. 拼接運(yùn)算符(Concatation)
Verilog中有一個特殊的運(yùn)算符是C語言中沒有的,就是位拼接運(yùn)算符。用這個運(yùn)算符可以把兩個或多個信號的某些位拼接起來進(jìn)行運(yùn)算操作。
符號 |
使用方法 |
說明 |
{} |
{a, b} |
將 a 和 b 拼接起來,作為一個新信號 |
代碼示例:
wire [7:0] a, b, c;
assign d = {a, b, c};
上述代碼中,a、b、c為三個8位輸入信號,d為24位輸出信號。使用拼接運(yùn)算符{}將a、b、c拼接成一個24位的信號d。
7. 其他運(yùn)算符
Verilog還支持其他一些運(yùn)算符,包括條件運(yùn)算符(?:)、括號運(yùn)算符(())、逗號運(yùn)算符(,)等。這些運(yùn)算符的作用和使用方法如下:
條件運(yùn)算符(?:):根據(jù)一個條件的真假返回兩個不同的值。
括號運(yùn)算符(()):用于改變運(yùn)算符的優(yōu)先級。
逗號運(yùn)算符(,):用于將多個表達(dá)式連接起來。
例如,下面是一個使用其他運(yùn)算符的示例:
reg [7:0] a, b;
wire result;
assign result = (a > b) ? a : b;
assign result = (a + b) * c;
assign result = (a, b, c);
wire out;
assign out = (a == 1) ? b : c, d;
上述代碼中,a為輸入信號,b、c、d為三個輸出信號,使用逗號運(yùn)算符將b和c、d連接起來,當(dāng)a等于1時,將b賦值給out,否則將c和d賦值給out。
8. 運(yùn)算符的優(yōu)先級
在Verilog中,不同運(yùn)算符的優(yōu)先級不同,需要注意運(yùn)算順序,可以使用括號運(yùn)算符改變運(yùn)算符的優(yōu)先級。
下面是Verilog運(yùn)算符的優(yōu)先級,從高到低依次排列:
1. 括號運(yùn)算符(())
2. 取反運(yùn)算符(!、~)
3. 乘法運(yùn)算符(*)、除法運(yùn)算符(/)、取模運(yùn)算符(%)
4. 加法運(yùn)算符(+)、減法運(yùn)算符(-)
5. 左移運(yùn)算符(<<)、右移運(yùn)算符(>>)
6. 比較運(yùn)算符(<、<=、>、>=、==、!=、===、!==)
6. 按位與運(yùn)算符(&)
7. 按位異或運(yùn)算符(^、^~)
8. 按位或運(yùn)算符(|)
8. 與運(yùn)算符(&&)
9. 或運(yùn)算符(||)
10. 條件運(yùn)算符(?:)
11. 逗號運(yùn)算符(,)
SteveRocket的博客_CSDN博客-Python進(jìn)階,Django進(jìn)階,C進(jìn)階領(lǐng)域博主SteveRocket擅長Python進(jìn)階,Django進(jìn)階,C進(jìn)階,等方面的知識https://blog.csdn.net/zhouruifu2015/
更多資料 · 微信公眾號搜索【CTO Plus】關(guān)注后,獲取更多,我們一起學(xué)習(xí)交流。
關(guān)于公眾號的描述訪問如下鏈接
?
關(guān)于Articulate“做一個知識和技術(shù)的搬運(yùn)工。做一個終身學(xué)習(xí)的愛好者。做一個有深度和廣度的技術(shù)圈。”一直以來都想把專業(yè)領(lǐng)域的技https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q
推薦閱讀:
-
FPGA在工業(yè)缺陷檢測上的應(yīng)用實踐
-
FPGA設(shè)計Verilog基礎(chǔ)之Verilog全局變量和局部變量定義
-
FPGA設(shè)計Verilog基礎(chǔ)之Verilog中clk為什么要用posedge,而不用negedge
-
初學(xué)者必須弄懂的一些基本FPGA設(shè)計概念(1)
-
工作總結(jié)之全網(wǎng)最全的103個Verilog關(guān)鍵字總結(jié)(上)
-
工作總結(jié)之全網(wǎng)最全的103個Verilog關(guān)鍵字總結(jié)(下)?
-
5G時代的FPGA發(fā)展趨勢和應(yīng)用分析
-
FPGA結(jié)合chatgpt的應(yīng)用開發(fā)實踐
-
FPGA | FPGA設(shè)計流程指南 v2.0
-
設(shè)計規(guī)范 | 總結(jié)開發(fā)過程中DDR3和FPGA部分的設(shè)計規(guī)范
-
術(shù)語一覽 | 總結(jié)開發(fā)過程中關(guān)于FPGA的專業(yè)術(shù)語文章來源:http://www.zghlxwxcb.cn/news/detail-771460.html
-
用AI幫我寫一篇關(guān)于FPGA的文章,并推薦最熱門的FPGA開源項目文章來源地址http://www.zghlxwxcb.cn/news/detail-771460.html
到了這里,關(guān)于FPGA設(shè)計Verilog基礎(chǔ)之Verilog的運(yùn)算符的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!