原创 case与if…else优化(续)

2009-7-23 21:50 7061 11 13 分类: FPGA/CPLD

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


         上回提到了ifelsecase在某些情况下实现的结构完全一致,但是这次特权同学同样举一个例子。只不过这一次ifelsecase所实现的结构却不一样。


//ifelse实例


input clk;


input rst_n;


input close,wr,rd;


output[2:0] db;


 


reg[2:0] dbr;


 


always @ (posedge clk or negedge rst_n) begin


    if(!rst_n) begin


        dbr <= 3'd0;


        end


    else begin


        if(close) dbr <= 3'b111;


        else if(rd) dbr <= 3'b101;


        else if(wr) dbr <= 3'b011;


        else dbr <= 3'd0;


    end


end


 


assign db = dbr;


 


//case实例


input clk;


input rst_n;


input close,wr,rd;


output[2:0] db;


 


reg[2:0] dbr;


 


always @ (posedge clk or negedge rst_n) begin


    if(!rst_n) begin


        dbr <= 3'd0;


        end


    else begin


        case({close,rd,wr})


            3'b100: dbr <= 3'b111;


            3'b010: dbr <= 3'b101;


            3'b001: dbr <= 3'b011;


            default: dbr <= 3'd0;


            endcase


    end


end


 


assign db = dbr;


 


         对于上面两段代码,单从代码上分析,ifelse是带优先级的,case是平行结构。下面看看结果是否这样?


         首先看资源消耗的情况。


//ifelse


Resource    Usage


Total logic elements    3


-- Combinational with no register   0


-- Register only    0


-- Combinational with a register    3


   


Logic element usage by number of LUT inputs


-- 4 input functions    0


-- 3 input functions    2


-- 2 input functions    1


-- 1 input functions    0


-- 0 input functions    0


   


Logic elements by mode 


-- normal mode  3


-- arithmetic mode  0


-- qfbk mode    0


-- register cascade mode    0


-- synchronous clear/load mode  0


-- asynchronous clear/load mode 3


   


Total registers 3


I/O pins    8


Maximum fan-out node    close


Maximum fan-out 3


Total fan-out   17


Average fan-out 1.55


 


Resource    Usage


Total logic elements    3


-- Combinational with no register   0


-- Register only    0


-- Combinational with a register    3


   


Logic element usage by number of LUT inputs


-- 4 input functions    0


-- 3 input functions    3


-- 2 input functions    0


-- 1 input functions    0


-- 0 input functions    0


   


Logic elements by mode 


-- normal mode  3


-- arithmetic mode  0


-- qfbk mode    0


-- register cascade mode    0


-- synchronous clear/load mode  0


-- asynchronous clear/load mode 3


   


Total registers 3


I/O pins    8


Maximum fan-out node    wr


Maximum fan-out 3


Total fan-out   18


Average fan-out 1.64


 


         二者的资源消耗是存在差异的,那么二者的最终实现也一定是不一样的。下面再看看它们综合后的RTL视图。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


点击看大图


1 ifelse综合后RTL视图



点击看大图


2 case综合后RTL视图


         RTL视图看,二者实现的确确实实也是如我们早先所预期的,一个带优先级,一个并行处理。再看看最后布局布线后的结构吧。



点击看大图


图3 ifelse布局布线后Technology Map Viewer



点击看大图


4 case布局布线后Technology Map Viewer


         从最终的结构看,和RTL视图很接近。这两个实例代码所使用的ifelsecase最终实现的结构是有差异的。从之前的实例分析看这并不稀奇,意外的是使用ifelse实现的结构资源消耗居然比case要来得少(只是相对而言)。这样的结果似乎能够很好的反驳不少人提出的所谓“多用case语句,少用ifelse语句,因为实现带优先级的结构比并行结构更耗费资源”的论断。特权同学提出这一点,并不是认为实现带优先级的结构更节省资源,而是想强调一点,任何代码的实现都不是绝对的,所谓好的代码风格也不是一层不变的,是需要设计者在实践中更多的具体问题具体分析。


         另外,补充一点,该例子中使用多个ifif…语句实现的结果会和case语句的结果一致。实例代码如下:


//ifif…实例


input clk;


input rst_n;


input close,wr,rd;


output[2:0] db;


 


reg[2:0] dbr;


 


always @ (posedge clk or negedge rst_n) begin


    if(!rst_n) begin


        dbr <= 3'd0;


        end


    else begin


        dbr <= 3'd0;   


        if({close,rd,wr} == 3'b100) dbr <= 3'b111;


        if({close,rd,wr} == 3'b010) dbr <= 3'b101;


        if({close,rd,wr} == 3'b001) dbr <= 3'b011;


    end


end


 


assign db = dbr;


 


 


 

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

ilove314_323192455 2013-3-11 14:56

In-system memory content editor,可以参考下一篇博文介绍

guojianjun5_823636633 2013-3-11 11:07

最后这个图片看不到

用户430586 2013-3-7 16:02

问大神一个问题,这个最后的图片是数据使用什么抓取的呢?赐教啊,呵呵,谢谢

用户593939 2013-3-6 22:38

学习参考了

用户1395232 2009-8-1 17:58

听前辈们说过if else具有优先级,case则是并行关系,用synplify综合过一次,发现实现同样的功能消耗的资源一模一样,却没有进一步研究。 拜读,学习。

ash_riple_768180695 2009-7-24 13:14

这次举的这个例子,if...else和case要表达的并不是等价的逻辑。if...else覆盖了1xx,01x,001三种共7个情况,而case只覆盖了100,010,001三种共3个情况。到底采用哪一种,需要看实际应用。特权同学这两篇连载文章非常好,充分地说明了"具体问题具体分析"的道理,破除了某些一概而论的"迷信"说法。
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
我要评论
2
11
关闭 站长推荐上一条 /4 下一条