原创 Verilog代码优化之case语句

2011-4-23 10:20 4401 3 3 分类: FPGA/CPLD

可综合的verilog是一个,最优化的代码也是一个,所以就想说说这方面的问题,算是自己攒的一点经验分享吧,可能会有所欠缺或者说的不太对,还望EDN的各路高手指点。那就先从case语句和if…else语句开始吧。

代码一:

module test_3(clk,rst_n,data,add);

 

input clk;

input rst_n;

input[3:0] data;

output[2:0] add;

 

reg[2:0] add;

 

always @ (posedge clk) begin

       if(!rst_n) begin

              add <= 0;

              end

       else begin

              case(data)

              0,1,2,3:   add <= 1;

              4,5,6,7:   add <= 2;

              8,9,10,11:       add <= 3;

              12,13,14,15: add <= 4;

              default: ;

              endcase

              end

end

 

endmodule

资源占用情况:

Design Statistics

# IOs                              : 9

 

Macro Statistics :

# RAM                              : 1

#      16x3-bit single-port block RAM: 1

 

Cell Usage :

# BELS                             : 3

#      GND                         : 1

#      INV                         : 1

#      VCC                         : 1

# RAMS                             : 1

#      RAMB16_S36                  : 1

# Clock Buffers                    : 1

#      BUFGP                       : 1

# IO Buffers                       : 8

#      IBUF                        : 5

#      OBUF                        : 3

 

Selected Device : 3s50pq208-5

 

 Number of bonded IOBs:                  9  out of    124     7% 

 Number of BRAMs:                        1  out of      4    25% 

 Number of GCLKs:                        1  out of      8    12%

 

 

代码二:

module test_3(clk,rst_n,data,add);

 

input clk;

input rst_n;

input[3:0] data;

output[2:0] add;

 

reg[2:0] add;

 

always @ (posedge clk) begin

       if(!rst_n) begin

              add <= 0;

              end

       else begin

              casex(data)

              4'b00xx:  add <= 1;

              4'b01xx:  add <= 2;

              4'b10xx:  add <= 3;

              4'b11xx:  add <= 4;

              default: ;

              endcase

              end

end

 

endmodule

资源占用情况:

Design Statistics

# IOs                              : 9

 

Macro Statistics :

# Registers                        : 1

#      3-bit register              : 1

 

Cell Usage :

# BELS                             : 4

#      INV                         : 2

#      LUT2                        : 2

# FlipFlops/Latches                : 3

#      FDR                         : 3

# Clock Buffers                    : 1

#      BUFGP                       : 1

# IO Buffers                       : 6

#      IBUF                        : 3

#      OBUF                        : 3

 

Selected Device : 3s50pq208-5

 

 Number of Slices:                       2  out of    768     0% 

 Number of Slice Flip Flops:             3  out of   1536     0% 

 Number of 4 input LUTs:                 2  out of   1536     0% 

 Number of bonded IOBs:                  9  out of    124     7% 

 Number of GCLKs:                        1  out of      8    12%

 

 

代码三:

module test_3(clk,rst_n,data,add);

 

input clk;

input rst_n;

input[3:0] data;

output[2:0] add;

 

reg[2:0] add;

 

always @ (posedge clk) begin

       if(!rst_n) begin

              add <= 0;

              end

       else begin

              if(data<4) add <= 1;

              else if(data<8) add <= 2;

              else if(data<12) add <= 3;

              else add <= 4;

              end

end

 

endmodule

资源占用情况:

Design Statistics

# IOs                              : 9

 

Macro Statistics :

# Registers                        : 3

#      1-bit register              : 3

# Multiplexers                     : 1

#      3-bit 4-to-1 multiplexer    : 1

# Comparators                      : 3

#      4-bit comparator less       : 3

 

Cell Usage :

# BELS                             : 6

#      INV                         : 1

#      LUT2                        : 4

#      LUT3                        : 1

# FlipFlops/Latches                : 3

#      FDR                         : 2

#      FDRS                        : 1

# Clock Buffers                    : 1

#      BUFGP                       : 1

# IO Buffers                       : 6

#      IBUF                        : 3

#      OBUF                        : 3

 

Number of Slices:                       3  out of    768     0% 

 Number of Slice Flip Flops:             3  out of   1536     0% 

 Number of 4 input LUTs:                 5  out of   1536     0% 

 Number of bonded IOBs:                  9  out of    124     7% 

 Number of GCLKs:                        1  out of      8    12% 

 

 

结语:硬件设计和软件编程不同,在C语言里if…else和for循环满天飞,可以说用这两个语句打天下都是不成问题的,但是HDL设计中这是万万不可的。我们先分析上面的结果,从以上的代码综合后的占用资源情况对比,case语句和casex语句是差不多的,一般在设计中如果可以使用casex语句那就优先考虑,其次case语句也是很常用的,至于if…else语句,明眼人一看就知道,比case(x)语句多出的寄存器比较器如果是一个更高级的if…else嵌套那么无非对硬件资源是一个巨大的浪费,至于for语句,这里没有进行对比,虽然在很多的综合工具里这个语句是可综合的,但是因为它在设计中往往不是可以和case或者if…else语句互相代替使用,所以放在后面再讨论。

文章评论0条评论)

登录后参与讨论
相关推荐阅读
wrhwindboy 2011-07-24 07:15
下载与KEIL和IAR联调文件vdmagdi.exe和vdmcspy.exe的方法
安装proteus7,点击程序->proteus7->proteus VSM model help->ARM MICROPROCESSOR MODEL,然后点击Remote Debu...
wrhwindboy 2011-07-24 06:58
怎么样从一个疯狂下载者成为一个学习者
为了方便广大网友,各种网站也应运而生。当网络的建设和发展正进行的如火如荼,喧闹之中,搭配学习这壶美酒的,竟是一瓶名叫资料下载的毒药,更糟糕的是,美酒和毒药已经被灌到了同一个杯子里,浑然一体 ,叫人在畅...
wrhwindboy 2011-07-23 07:37
DES算法的介绍和实现(下)
INT32 handle_data(ULONG32 *left , ULONG8 choice){       INT32  number = 0 ,j = 0;          ULONG32 *...
wrhwindboy 2011-07-23 07:36
DES算法的介绍和实现(中)
三.文件加密解密工具在《DES算法的介绍和实现(上)》一文中,介绍了DES算法的原理,在本文中将给出一个文本文件加密工具的具体实现代码。3.1 实现的介绍利用算法核心代码封装的接口函数笔者编写了一个针...
wrhwindboy 2011-07-23 07:35
DES算法的介绍和实现(上)
一.DES算法介绍DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在...
wrhwindboy 2011-07-23 06:59
FIFO 深度!
如果数据流连续不断则FIFO深度无论多少,只要读写时钟不同源同频则都会丢数;FIFO用于缓冲块数据流,一般用在写快读慢时,FIFO深度 / (写入速率 - 读出速率) = FIFO被填满时间  应大于...
广告
EE直播间
更多
我要评论
0
3
广告
关闭 热点推荐上一条 /4 下一条