????????在用Verilog進行RTL代碼編寫的時候基本不會用到case(1‘b1),而且一般的語法說明也如下:
case(case_expr)condition1 : true_statement1 ;condition2 : true_statement2 ;……default : default_statement ;
endcase//case 語句執行時,如果 condition1 為真,則執行 true_statement1 ;
//如果 condition1 為假,condition2 為真,則執行 true_statement2;依次類推。
//如果各個 condition 都不為真,則執行 default_statement 語句。
? ? ? ? 因此遇到case(1‘b1)的情況會比較迷惑,這里對case(1‘b1)的情況做個說明。
? ? ? ? 下面的例子就很好地說明了使用方法。case(1‘b1)的寫法與if-else的寫法得到的結果是一樣的,即均完成了優先級的編碼:
case(1'b1):
module encoder(
input D0,
input D1,
input D2,
input D3,
input D4,
input D5,
input D6,
input D7,
output reg [2:0]Q2Q1Q0);
always@(*)begin
Q2Q1Q0=0;
case(1'b1)
D0:Q2Q1Q0=3'b000;
D1:Q2Q1Q0=3'b001;
D2:Q2Q1Q0=3'b010;
D3:Q2Q1Q0=3'b011;
D4:Q2Q1Q0=3'b100;
D5:Q2Q1Q0=3'b101;
D6:Q2Q1Q0=3'b110;
D7:Q2Q1Q0=3'b111;
endcase
end
endmodule
if-else:
module encoder(
input D0,
input D1,
input D2,
input D3,
input D4,
input D5,
input D6,
input D7,
output reg [2:0]Q2Q1Q0);always@(*)
begin
Q2Q1Q0=3'b000;
if(D0) Q2Q1Q0=3'b000;
else if(D1) Q2Q1Q0=3'b001;
else if(D2) Q2Q1Q0=3'b010;
else if(D3) Q2Q1Q0=3'b011;
else if(D4) Q2Q1Q0=3'b100;
else if(D5) Q2Q1Q0=3'b101;
else if(D6) Q2Q1Q0=3'b110;
else if(D7) Q2Q1Q0=3'b111;end endmodule
? ? ? ? 小結:case和if-else都是有優先級的,case語句也是先判斷寫才前面的情況是否滿足,前面的滿足了就直接跳出case了。一直印象里的并行處理是一般寫法中case的的控制表達式是互斥的,但是在case(1‘b1)的寫法中,處理邏輯就如上所述。
? ? ? ? 目前來說,現在的仿真和綜合工具已經足夠強大,最后綜合后的結果if..else...與case...語句其實是一樣的,無非是兩種不同的實現方式。