Verilog中case(1‘b1)的使用说明

        在用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...语句其实是一样的,无非是两种不同的实现方式。

猜你喜欢

转载自blog.csdn.net/qq_21842097/article/details/125633512
b1