Verilog中的條件語句\多分支語句\循環(huán)語句
一、背景
由于初學(xué)Verilog,故寫篇筆記記錄Verilog中的 if-else
、case-endcase
、for
、while
、repeat
、forever
語法,以及例子。
二、if-else
定個標(biāo)準(zhǔn),每個if-else
的出現(xiàn)都要有begin-end
語句。
2.1 標(biāo)準(zhǔn)結(jié)構(gòu)
條件語句標(biāo)準(zhǔn)使用結(jié)構(gòu):
if (condition1) begin
true_statement1 ;
end
else if (condition2) begin
true_statement2 ;
end
else if (condition3) begin
true_statement3 ;
end
else begin
default_statement ;
end
2.2 例子
二輸入選擇器:
if(en) begin
if(sel == 2'b1) begin
sout = p1 ;
end
else begin
sout = p0 ;
end
end
三、case-endcase
case
語句是一種多路條件分支的形式,可以解決 if 語句中有多個條件選項時使用不方便的問題。casex
、 casez
語句是 case
語句的變形,用來表示條件選項中的無關(guān)項。
3.1 標(biāo)準(zhǔn)結(jié)構(gòu)
case(case_expr)
condition1: true_statement1 ;
condition2: true_statement2 ;
……
default: default_statement ;
endcase
casex
用 “x
” 來表示無關(guān)值,casez
用問號 “?
” 來表示無關(guān)值。
兩者的實現(xiàn)的功能是完全一致的,語法與 case
語句也完全一致。
但是 casex
、casez
一般是不可綜合的,多用于仿真。
例如用 casez
語句來實現(xiàn)一個 4bit 控制端的 4 路選擇選擇器。
3.2 例子
3.2.1 三路選擇器的case
部分,如下:
case(sel)
2'b00: sout_t = p0 ;
2'b01: sout_t = p1 ;
2'b10: sout_t = p2 ;
default: sout_t = p3 ;
endcase
3.2.2 casez
的四路選擇器,如下:
module mux4to1(
input [3:0] sel ,
input [1:0] p0 ,
input [1:0] p1 ,
input [1:0] p2 ,
input [1:0] p3 ,
output [1:0] sout);
reg [1:0] sout_t ;
always @(*)
casez(sel)
4'b???1: sout_t = p0 ;
4'b??1?: sout_t = p1 ;
4'b?1??: sout_t = p2 ;
4'b1???: sout_t = p3 ;
default: sout_t = 2'b0 ;
endcase
assign sout = sout_t ;
endmodule
四、for
4.1 標(biāo)準(zhǔn)結(jié)構(gòu)
for 循環(huán)語法格式如下:
for(initial_assignment; condition ; step_assignment) begin
…
end
4.2 例子
// for 循環(huán)語句
integer i ;
reg [3:0] counter2 ;
initial begin
counter2 = 'b0 ;
for (i=0; i<=10; i=i+1) begin
#10 ;
counter2 = counter2 + 1'b1 ;
end
end
五、repeat
repeat
的功能是執(zhí)行固定次數(shù)的循環(huán),它不能像 while
循環(huán)那樣用一個邏輯表達(dá)式來確定循環(huán)是否繼續(xù)執(zhí)行。repeat
循環(huán)的次數(shù)必須是一個常量、變量或信號。如果循環(huán)次數(shù)是變量信號,則循環(huán)次數(shù)是開始執(zhí)行 repeat
循環(huán)時變量信號的值。即便執(zhí)行期間,循環(huán)次數(shù)代表的變量信號值發(fā)生了變化,repeat
執(zhí)行次數(shù)也不會改變。
5.1 標(biāo)準(zhǔn)結(jié)構(gòu)
repeat
循環(huán)語法格式如下:
repeat (loop_times) begin
…
end
5.2 例子
5.2.1 循環(huán)11次
// repeat 循環(huán)語句
reg [3:0] counter3 ;
initial begin
counter3 = 'b0 ;
repeat (11) begin //重復(fù)11次
#10 ;
counter3 = counter3 + 1'b1 ;
end
end
5.2.2 存儲8個數(shù)據(jù)
always @(posedge clk or negedge rstn) begin
j = 0 ;
if (!rstn) begin
repeat (8) begin
buffer[j] <= 'b0 ; //沒有延遲的賦值,即同時賦值為0
j = j + 1 ;
end
end
else if (enable) begin
repeat (8) begin
@(posedge clk) buffer[j] <= counter3 ; //在下一個clk的上升沿賦值
j = j + 1 ;
end
end
end
仿真結(jié)果如下圖。
由圖可知,rstn
拉高時,buffer
的 8 個向量同時賦值為 0。
第二個時鐘周期后,buffer
依次被counter3
賦值,實現(xiàn)了連續(xù)存儲 8 個數(shù)據(jù)的功能。
六、forever
forever
語句表示永久循環(huán),不包含任何條件表達(dá)式,一旦執(zhí)行便無限的執(zhí)行下去,系統(tǒng)函數(shù)$finish
可退出forever
。forever
相當(dāng)于while(1)
。
通常,forever 循環(huán)是和時序控制結(jié)構(gòu)配合使用的。文章來源:http://www.zghlxwxcb.cn/news/detail-672224.html
6.1 標(biāo)準(zhǔn)結(jié)構(gòu)
forever
循環(huán)語法格式如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-672224.html
forever begin
…
end
6.2 例子
6.2.1 產(chǎn)生一個時鐘
reg clk ;
initial begin
clk = 0 ;
forever begin
clk = ~clk ;
#5 ;
end
end
6.2.2 實現(xiàn)一個時鐘邊沿控制的寄存器間數(shù)據(jù)傳輸功能
reg clk ;
reg data_in, data_temp ;
initial begin
forever @(posedge clk) data_temp = data_in ;
end
到了這里,關(guān)于Verilog中的 條件語句\多路分支語句\循環(huán)語句的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!