原创 那些年,我们拿下了FPGA-第10章不再纠结if 和case(2)

2012-11-21 14:26 3851 10 10 分类: FPGA/CPLD 文集: 那些年,我们拿下了FPGA

 

10.3 if和case之间的转换

if和case语句都是条件语句,在很多情况下,能用case语句描述,也可以用if语句描述,它们之间可以转换的。比如:

我们描述的模块的功能:

输入信号:sel,clk,rst。

当sel=3’b001时,out=3’b111;当sel=3’b010时,out=3’b101;当sel=3’b100时,out=3’b011;其他的时候,out=0。

用case语句来描述:

module test_case(

         input         clk,

         input         rst,

         input [2:0] sel,

         output reg [2:0]out

    );

always @(posedgeclk or posedgerst)begin

         if(rst)

                   out<=0;

         else

                   case(sel)

                            3'b001:out<=3'b111;

                            3'b010:out<=3'b101;

                            3'b100:out<=3'b011;

                            default:out<=0;

                   endcase

end

endmodule

用if语句描述:

module test_if(

         input         clk,

         input         rst,

         input [2:0] sel,

         output reg [2:0]out

    );

always @(posedgeclk or posedgerst)begin

         if(rst)

                   out<=0;

         else if        (sel==3'b001)

                            out<=3'b111;

         else if        (sel==3'b010)

                            out<=3'b101;

         else if        (sel==3'b100)

                            out<=3'b011;

         else           out<=0;

end

endmodule

从程序上来看,if_else结构基于优先权结构,而case为并行结构,虽然有所不同,但他们可以实现同样的模块功能,是可以相互转化的。

10.4 if和case千万别下定论

在有些情况下,可以用if_else结构描述,也可以用case结构描述,可能人问,那种条件语句会好一些呢?可能会有人说,case是并行结构,而if_else是基于优先权结构的,肯定是并行结构的case语句好啊。真的是这样的么?我们就拿上面的例子为例。

if_else结构综合布线后用过的资源情况(ISE 13.4编译器):

 

10.1.jpg

case结构综合布线后用过的资源情况:

 

10.2.jpg

从上面资源使用情况对比来看,资源情况是一样的,只是平均扇出有所差别。

我们再从RTL级电路来对比分析。

If_else结构的RTL级电路

 

10.3.jpg

case结构的RTL级电路

 

10.4.jpg

从上图if_case是基于优先权结构的,而case是并行结构的,从RTL级电路来看if_else电路比case电路来说比较复杂。

接下来我们再看看Technology 电路图

if_else结构的Technology 电路图

 

10.5.jpg

if_else结构的Technology 电路图

 

10.6.jpg

从上面对比来看,两个综合出来的Technology 电路图一模一样。虽然RTL视图不一样,但从Technology 电路图和资源的消耗情况来看,很难说if和case语句那个好那个坏。而RTL视图到Technology 电路图其实也还是有差距的,他们之间的映射还是有优化的。总之,if_else和case语句实现的结构到底是怎样还是要具体问题具体分析。不能片面的强调if_else和case语句谁好谁坏。

10.5不完全的if和case

什么是不完全的if和case语句呢?就是所有可能的状态(或者条件)没有全部给出的if或者case语句。

那么不完全的if或者case语句会综合成什么样的电路呢?

还是看例子吧。

Input         [1:0]          ain;

input         [1:0]          bin;

output      [1:0]          cout;

reg            [1:0]          cout;

 

always @(ain or bin)

begin

if(ain>=bin)       cout<=bin;

end

综合以后的电路图如下:

 

10.7.jpg

从图上可以看出,不完全的if语句会生成锁存器,不完全的case语句也会生成锁存器。

比如:

always @(sel or ain or bin or cin)

begin

         case(sel) 

                   2'b01:       out =         ain;

                   2'b10:       out =         bin;

         endcase

end

将上面的程序综合以后同样会生成锁存器。

不完全的if(case)语句都是没带else(default)的if(case)语句,但是不带default的case语句不一定是不完全的case语句,只要用常量表达式把控制表达式的情况全部考虑到,就是完全case语句。

比如:

input        [1:0] sel;

output      [1:0] out;

reg            [1:0] out;

always @(sel)begin

         case(sel)

          2'b00:out=1;

          2'b01:out=2;

          2'b10:out=2;

          2'b11:out=3;

         endcase

end

综合后的电路图如下:

 

10.8.jpg

从综合出来的电路图可以看出,它没有综合出锁存器,是full case语句。

很多时候锁存器不需要的,如何避免这样的锁存器的错误呢,从上面的介绍可以知道,把不完全的if和case变成完全的if和case,最常见的一种情况就是if带上else项和case带上default项。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /3 下一条