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所示:

FPGA——if else & case语句分析FPGA——if else & case语句分析

                                                                         图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所示:

FPGA——if else & case语句分析

                                                                        图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所示:

FPGA——if else & case语句分析

                                                                         图3 3级嵌套MAP

可见,3级嵌套下,MAP后的电路也是有优先级的。

case语句FPGA 代码实现: 

[email protected](*)

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所示:

FPGA——if else & case语句分析

                                                                       图4 case语句 MAP

可见,case语句实现的电路没有优先级,不影响电路的运行速度。

 

结论

1)逻辑上需要优先级的,还是要用if..else if..语句;不需要的可以用case语句;

2)代码设计上还是慎用if..else if..的多级嵌套,多级嵌套会影响器件执行的速度。