循環語句分為以下4種:
for語句——通過三個步驟來決定語句的循環執行:
1.給控制循環次數的變量賦初值;
2.判定循環執行條件,若為假則跳出循環;若為真,則執行指定語句后,轉到第三步
3.修改循環變量的值,返回第二步
repeat——連續執行一條語句n次;
while——執行一條語句,直到循環條件不滿足;若一開始條件不滿足,則該語句一次也不能執行
forever——無限連續的執行語句,可用disable語句中斷。
for語句
形式:
for(循環變量賦初值;循環執行條件;循環變量增值) 執行語句
例:用for語句描述7人投票表決器:超過4人投贊成票,則表決通過
module vote7( output pass, input [6:0] vote ); reg [2:0] sum; //sum 為reg變量,用于統計贊成的人數 integer i; regpass; always @(vote) begin sum = 0; //sum初始值為0 for(i=0;i<=6;i++) //for語句 if(vote[i]) sum=sum+1; //只要有人投贊成票,sum加1 if(sum[2]) pass =1; //若超過4人,pass為1 else pass =0; end endmodule例:用for語句初始化memory
begin:init_mem reg [7:0] tempi; //存儲器的地址變量 for(tempi=0;tempi例:用for語句實現兩個二進制數乘法 module mult_for (outcome,a,b); parameter size =8; output [2*size:1] outcome; input [size;1] a,b; reg [2*size:1] outcome; integer i; always@(a or b) begin outcome = 0; for(i=1;i<=size;i=i+1) if(b[i]) outcome = outcome +(a<<(i-1)); end endmodule
repeat語句(不可綜合)
無條件連續執行一條或多條語句n次
格式:repeat(循環次數表達式)語句
例:用repeat語句和移位操作實現兩個8位二進制數乘法
module mult_repeat(outcome,a,b); parameter size=8; output[2*size:1] outcome; input [size:1] a,b; //a 為被乘數,b為乘數 reg [2*size:1] outcome; reg [2*size:1] temp_a; //中間變量,存放操作數a左移移位的結果 reg[2*size:1]temp_b;//中間變量,存放操作數b右移移位的結果 always@(a or b) begin outcome = 0; temp_a = a; temp_b = b; repeat(size) begin if(temp_b[1]) //如果tem_b的最低位是1,則執行下面加法 outcome = outcome + temp_a; temp_a = temp_a <<1; //操作數a左移一位,以便代入上式,求部分積 temp_b = temp_b >>1; //操作數b右移一位,以便取temp_b【1】 end end endmodule
while 語句
有條件地執行一條或多條語句
首先判斷循環執行條件表達式是否為真。若為真,則執行后面的語句或語句塊;然后再回頭判斷循環執行條件表達式是否為真,若為真,再執行一次后邊的語句;如此不斷,直到條件表達式不為真.
格式:while(循環執行條件表達式) 語句
注1:首先判斷循環執行條件表達式是否為真,若為假,則其后的語句一次也不執行
注2:在執行語句中,必須有一條改變循環執行條件表達式的值的語句
注3:while語句只有當循環塊有事件控制(即@(posedge clk))時才可綜合。
例:用while語句對一個8位二進制中值為1的位進行計數
module count1s_while(count,rega,clk); output [3:0] count; input [7:0] rega; input clk; reg [3:0] count; always@(posedge clk) begin:count1 reg[7:0] tempreg; //用作循環執行條件表達式 count =0; //count初始值為0 tempreg = rega; //tempreg初值為rega while(tempreg) //若tempreg非0,則執行下邊語句 begin if(tempreg[0]) count = count + 1; //只要tempreg最低位為1,則count加1 tempreg = tempreg >>1; //右移1位 end end endmodule例:用for語句對一個8位二進制中值為1的位進行計數module count1s_for_good(count,rega); output [3:0] count; input [7:0] rega; reg [3:0] count; always@(rega) begin:block integer i; count = 0; for(i=0;i<=7;i++) if(rega[i]) count = count +1; end endmodule
forever語句
無條件連續執行forever后面的語句或語句塊。
格式:forever 語句;
常用disable語句跳出循環。
注:不同于always語句,不能獨立寫在程序中,一般用在initial語句塊中。
語句的順序執行
在always模塊內,邏輯按書寫的順序執行。
順序語句——always模塊內的語句
在always模塊內,若隨意顛倒賦值語句的書寫順序,可能導致不同的結果
module serial2(q,a,clk); output q,a; input clk; reg q,a; always @(posedge clk) begin a = ~q; q = ~q; end endmodule
always模塊,assign語句,實例元件都是同時執行的,它們在程序中的先后順序對結果并沒有影響。
module parall1(q,a,clk); output q,a; input clk; reg q,a; always @(posedge clk) begin q = ~q; end always @(posedge clk) begin a = ~q; end endmodule module parall2(q,a,clk); output q,a; input clk; reg q,a; always @(posedge clk) begin a = ~q; end always @(posedge clk) begin q = ~q; end endmodule
審核編輯:劉清
-
存儲器
+關注
關注
38文章
7518瀏覽量
164072 -
二進制
+關注
關注
2文章
795瀏覽量
41701 -
Verilog語言
+關注
關注
0文章
113瀏覽量
8284
原文標題:IC學霸筆記 | Verilog語法之循環語句
文章出處:【微信號:IC修真院,微信公眾號:IC修真院】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論