今天要來介紹的是verilog的條件及迴圈語法~是比較簡單的部份,這兩個對大家來說應該都不陌生XD雖然是大家都熟悉的東西,但因為是初學verilog,還是想寫寫看他的範例~雖然感覺跟C真的差不多XD
就是根據條件來選擇要執行什麼任務啦~
語法結構就像寫C一樣,只是多了begin、end包住欲執行的指令。
if(condition)begin
//欲執行動作
end
else if(condition)begin
//欲執行動作
end
else begin
//上面條件都不成立時,執行這裡的指令
end
跟C真的很像吧XD
接著就來點舉例啦~
module newwork(A,B,C);
input wire [3:0] A,B;
output reg [3:0] C;
always @(*)begin
if( A > B )begin
C = A;
end
else begin
C = B;
end
end
endmodule
這是一個很簡單的比較A、B兩個信號,把值較大的傳給C。
module newwork(A,C);
input wire [3:0] A;
output reg [3:0] C;
always @(*)begin
if( A == 4'b0001 )begin
C = 4'b1110;
end
else if( A == 4'b0101 )begin
C = 4'b1010;
end
else if( A == 4'b1100 )begin
C = 4'b0011;
end
else begin
C = 4'b0000;
end
end
endmodule
這一個則是根據A的數值來決定C要存取的值是多少,如果A不符合某三個特定值,C則為0。
迴圈的部分有for、while及repeat,repeat應該是比較少被使用到的部分,畢竟我平常自己寫
程式都只有用for及while XD看身邊的人也很少在用repeat。
首先先來看for~跟C語言差不多,就直接打語法結構跟範例了~
for( initialization; condition; increment/decrement )begin
//loop body
end
欸,當我在自己練習打舉例時,我發現verilog的for跟C還是有蠻大的差異耶。
在C中,for迴圈可以直接寫在main裡,但在verilog,如果for直接寫在module然後沒有寫在initial、always之類的裡面,就會編譯錯誤。
大概就是:
沒有用initial包住:
module newwork(A,C);
input wire A;
output reg C;
integer i;
for( i = 0; i < 10; i = i + 1 )begin
C = A << 1;
end
endmodule
有用initial包住:
module newwork(A,C);
input wire A;
output reg C;
integer i;
initial begin
for( i = 0; i < 10; i = i + 1 )begin
C = A << 1;
end
end
endmodule
就根據需求來選擇要使用initial或always啦~目前用這兩個是都能夠成功執行的!
喔對,還有一個與C的差異是,最後面( i = i + 1 )的部分,在C可以直接寫( ++i ),但在verilog中似乎會編譯錯誤(我自己寫的時候會)。
如果需要用for迴圈來進行初始化的工作,那就會寫在initial裡;always則是在特定條件達成後開始執行,如果有要求在某條件下啟動迴圈就用always。
那還有一個很常見的是使用generate來行使迴圈,他的結構長這樣:
genvar i;
generate
for( i = 0; i < 4; i = i + 1 ) begin: gen_block //gen_block為這個區塊的名稱
//for_loop body
end
endgenerate
最後就是for也可以寫在之前介紹過的task及function中,每呼叫一次task或function,就會執行一次for迴圈。
再來是while迴圈的部分,他跟for功能都是在滿足一定的條件下,重複執行區塊內的指令,宣告方式那些的也都跟C語言差不多,這是他的結構:
while( condition )begin
//loop body
end
while的括號內只需要寫條件就可以了,所以可能要注意一下有沒有在迴圈內寫入可以讓迴圈停止的條件,否則可能會因為變成無窮迴圈而產生錯誤喔~
舉個小例子:
module newwork(C);
output C;
reg Q;
integer i;
initial begin
i = 0;
Q = 1;
while( i < 3 ) begin
Q = Q << i;
i = i + 1;
end
end
assign C = Q;
endmodule
這個迴圈中,停止條件是當i的值大於或等於3的時候。迴圈每執行一次,i值就會+1,且Q的值會左移i格。
那while跟for一樣,都要寫在initial、awlays等區塊內,不能直接寫在module裡喔~
最後一個迴圈是repeat~這個在C中應該是沒有看過XD我是沒看過啦,那來看看他的特性跟結構吧~
repeat與for、while功能一樣就是重複執行特定指令,那他跟for及while不同的地方是,repeat不需要條件或increment,只要給一個執行次數就可以了。他通常被用在特定情況下的重複操作,例如clock脈衝的module。
結構是這樣:
repeat(次數)begin
//loop body
end
那來舉個小例子:
module newwork(C);
output C;
reg Q;
integer i;
initial begin
i = 0;
Q = 0;
repeat(10)begin
i = i + 1;
Q = Q + i;
end
end
assign C = Q;
endmodule
在這個例子中,repeat會執行10次,每一次i的值都會+1、Q的值都會加上i的值,所以i最後的值會是10、Q最後的值會是55。
repeat一樣要寫在initial、always、generate等區塊內,不然會編譯錯誤。
那今天就這樣~謝謝。