FPGA——if else & case语句分析
if else & case语句分析
If..else语句特点:具有优先级。If不满足时,才执行else语句。
Case 语句特点:没有优先级。
If..else语句FPGA 代码实现:
module test(
input[1:0] sel_C,
input[1:0] data_C,
output reg data_out_C
);
[email protected](*) //组合逻辑 用“=”不用“<=”
begin
if(sel_C[1])
data_out_C = data_C[1];
else if(sel_C[0])
data_out_C = data_C[0];
else
data_out_C = 0;
end
endmodule
软件编译,查看RTL视图,QuartusII: Tools-Netlist Viewers-RTL Viewer,如图1所示:
图1 RTL视图
显然,当数据选择器1选通信号sel_C[1]=1时,data_C[1]被输出到data_out_C;当数据选择器1 sel_C[1]=0 且数据选择器2 sel_C[0]=1时,data_C[0]才能被输出到data_out_C。可见,数据选择器1的优先级高于数据选择器2。
上面代码是2级嵌套(if..else if..),若是代码中出现多级嵌套,很显然,优先级最高的响应速度最快,优先级最低的响应最慢。电路(FPGA代码生成)的执行速度,受限于最低优先级,所以不建议使用多级嵌套(会降低FPGA的Fmax),一般不要超过4级嵌套。可以考虑使用case语句,case语句是平行结构,没有优先级。
查看MAP视图,QuartusII: Tools-Netlist Viewers-Technology Map Viewer(Post-Mapping),如图2所示:
图2 MAP视图
发现,实际MAP映射后,代码的优先级被QuartusII优化掉了,映射成没有优先级的硬件电路(与非门生成的组合逻辑)。RTL视图是QuartusII软件综合时生成的,综合生成的是网表,显示的图形是调用标准单元的结果;而MAP是实际映射到FPGA内部的电路,即最终的电路实现形式;但并不表示所有的if..else if..的多级嵌套都被软件优化。
举例:
module test(
input[2:0] sel_B,
input[2:0] data_B,
output reg data_out_B
);
[email protected](*)//组合逻辑
begin
if(sel_B[2])
data_out_B = data_B[2];
else if(sel_B[1])
data_out_B = data_B[1];
else if(sel_B[0])
data_out_B = data_B[0];
else
data_out_B = 0;
end
endmodule
注意:always块中赋值的信号,必须定义为 reg型,但并不等同于硬件电路会产生一个寄存器。纯组合逻辑电路中的reg信号,等同于wire连线。
MAP视图结果如图3所示:
图3 3级嵌套MAP图
可见,3级嵌套下,MAP后的电路也是有优先级的。
case语句FPGA 代码实现:
begin
case(sel_B[2:0])
3'b1xx:
data_out_B = data_B[2];
3'b01x:
data_out_B = data_B[1];
3'b001:
data_out_B = data_B[0];
default:data_out_B = 0;
endcase
end
MAP视图结果如图4所示:
图4 case语句 MAP图
可见,case语句实现的电路没有优先级,不影响电路的运行速度。
结论:
(1)逻辑上需要优先级的,还是要用if..else if..语句;不需要的可以用case语句;
(2)代码设计上还是慎用if..else if..的多级嵌套,多级嵌套会影响器件执行的速度。