運算符、賦值語句和結構說明語句
一、邏輯運算符:
(1)&& 邏輯與;
(2)|| 邏輯或;
(3)!邏輯非。
“&&”和“||”是雙目運算符,“!”是單目運算符
邏輯運算符是對整體進行運算的,注意與位運算符的區分;邏輯運算符中的&&和||低於關係運算符,!高於算術運算符,不過爲了提高程序的可讀性,建議使用括號。
二、關係運算符:
(1)<,小於;
(2)>,大於;
(3)<=,小於或等於;
(4)>=,大於或等於;
結果是假的,返回0;結果是真的,返回1;結果是模糊的,返回不定值
所有的關係運算符有着相同的優先級別。關係運算符的優先級別低於運算符的優先級別。
三、等式運算符:
(1)==(等於);
(2)!=(不等於);
(3)===(等於);
(4)!==(不等於)。
注意:求反號、雙等號、三個等號之間不能有空格
“==”和“!=”又稱邏輯等式運算符,當操作數中的某些位是不定值x或高阻值z時,結果爲不定值x;而“===”和“!==”對不定值和高阻值也進行比較,另兩個操作數必須完全一樣,結果才爲1,“===”和“!==”常用與case表達式的判別,所以又稱爲“case等式表達式”。
四、移位運算符:
(1)“<<”(左移位運算符);
(2)“>>”(右移位運算符)。
注意:左移運算符和右移運算符都用0來填補移出的空位,其中左移會使位得以拓展,右移位數不變。
五、位拼接運算符:
{信號1的某幾位,信號2的某幾位,...,...,信號n的某幾位},中間用逗號隔開,最後用大括號括起來表示一個信號整體。
位拼接表達式中不允許出現沒有指明位數的信號;位拼接可以用重複法來簡化表達式:{4{w}}等同於{w,w,w,w};位拼接還可以用嵌套的方式來表達:{b,{3{a,b}}}等同於{b,a,b,a,b,a,b}。
六、縮減運算符:
&是單目運算符,如:
reg [3:0] B ;
reg C;
C = &B;
相當於:
C=((B[0]&B[1])&B[2])&B[3];
具體運算過程是這樣的:第一步先將操作數的第1位與第2位進與、或、非運算;第二步將運算結果與第三位進行與、或、非運算,直至最後一位。
七、優先級別
八、阻塞賦值與非阻塞賦值:
(1)非阻塞賦值(“<=”)
1.在語句塊中,上面語句所賦的變量值不能立即就爲下面的語句所使用;
2.塊結束後才能完成這次賦值操作,而所賦的值是上一次賦值得到的;
3.在編寫可綜合時序邏輯模塊時,這是最常用的賦值方法。
例子:用非阻塞賦值法確定reg型信號b和c
always@( posedge clk)
begin
b<=a;
c<=b;
end
上述代碼綜合後得到如下電路圖:
4.7.2阻塞賦值(“=”)
1.在賦值語句執行完後,塊才結束;
2. b的值在賦值語句執行完後立刻就改變;
3.在時序邏輯中使用,可能會產生意想不到的結果。
例子:用阻塞賦值法確定reg型信號b和c
always@( posedge clk)
begin
b=a;
c=b;
end
上述代碼綜合後得到如下電路圖:
b<=a;
always塊內的下一條語句執行後,b並不等於a,而是保持原來的值,always塊結束後,才進行賦值。
b=a;
這種賦值是馬上執行的,也就是說執行下一條語句時,b已等於a。
九、塊語句
(1)順序塊(begin_end):
1.塊內語句是按順序執行的,即只有上面一條語句執行完後下面的語句才能執行。
2.每條語句的延遲時間是相對於前一條語句的仿真時間而言的。
3.直到下一條語句執行完,程序流程控制才跳出該語句塊。
begin
語句1;
語句2;
語句n;
end
或
begin :塊名
語句1;
語句2;
語句n;
end
begin 後可加塊名,塊內聲明語句可以是參數聲明語句,reg型變量聲明語句,integer型聲明語句和real型變量聲明語句。
(2)並行塊(fork_join):
1.塊內語句是同時執行的,即程序流程一進入到該並行塊,塊內語句則開始同時並行地執行。
2.塊內每條語句的延遲時間是相對於程序流程控制進入到塊內的仿真時間。
3.延遲時間是用來給賦值語句提供執行時序的。
4.當按時間順序排序在最後的語句執行完後或一個disable語句執行時,程序流程控制跳出該程序塊。
格式如下:
fork
語句1;
語句2;
語句n;
end
或:
fork:塊名
語句1;
語句2;
語句n;
end
fork後可加塊名,語句塊內的說明語句可以是參數說明語句、reg型變量聲明語句、integer型變量聲明語句、real型變量聲明語句、time型變量聲明語句和事件(event)說明語句。如果兩條語句在同一時刻對同一個變量產生影響,那麼將會引起隱含的競爭。
(3)塊名:
1可以在塊內定義局部變量,即只在塊內使用的變量;
2可以通過塊名被其他塊調用,如disable語句。
3在Verilog語言中,所有的變量都是靜態的,即所有的變量都只有一個唯一的存儲地址,因此進入或跳出塊並不影響存儲在變量的值。
(4)起始時間和結束時間
對於順序塊,起始時間就是第一條語句開始被執行的時間,結束時間就是最後一條語句執行完的時間;對於並行快,起始時間對於塊內所有的語句都是相同的,即程序流程控制進入該塊的時間,其結束時間是按時間排序在最後的語句執行結束的時間。
當把一個塊嵌入到另一個塊時,塊的起始時間和結束時間是很重要的。至於跟在塊後面的語句只有在該塊的結束時間到了纔開始執行。也就是說,只有該塊完全執行完後,跟在後面的語句纔可以執行。