首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于FPGA中IF和CASE的区别

关于FPGA中IF和CASE的区别

经常在写程序的时候纠结同样的功能到底用if实现还是case实现,用if的时候是ifelse if接连写还是if else嵌套写,书上有看到过但是自己没探索过,印象不深刻,经常还是会犯迷糊,这里写了简单的程序,对同一功能不同代码综合出来的电路做了对比,希望自己能对这块的东西有更深入的了解,也希望能够分享出来和大家进行探讨和交流,有不对的或者需要补充的地方欢迎大家批评指正。

         本次实例所实现的功能是在计数器等于四个特定值的时候将四个不同的输入值分别赋给输出。计数器为八位,从0255循环计数。特点是计数器的值大于需要条件判断的数量,在计数器数值不满足判断条件的时候不执行操作。

         第一种情况,用ifelse if来实现,Verilog代码如下:

module IF_CASE(

         inputclk,

         inputreset,

         input[15:0]data_in1,

         input[15:0]data_in2,

         input[15:0]data_in3,

         input[15:0]data_in4,

         outputreg [15:0]data

   );


         reg[7:0]counter;

         always@(posedge clk or negedge reset)

                   begin

                            if(!reset)

                                     begin

                                     counter<=0;

                                     end

                            else

                                     begin

                                               if(counter==8'hff)

                                                        begin

                                                        counter<=0;

                                                        end

                                               else

                                                        begin

                                                        counter<=counter+8'd1;

                                                        end

                                     end

                   end


         always@(posedge clk or negedge reset)

                   begin

                            if(!reset)

                                     begin

                                     data<=0;

                                     end

                            else

                                     begin

                                               if(counter==8'd1)

                                                        begin

                                                        data<=data_in1;

                                                        end

                                               elseif(counter==8'd10)

                                                        begin

                                                        data<=data_in2;

                                                        end

                                               elseif(counter==8'd20)

                                                        begin

                                                        data<=data_in3;

                                                        end

                                               elseif(counter==8'd30)

                                                        begin

                                                        data<=data_in4;

                                                        end

                                     end

                   end

endmodule

         第二种情况采用ifelse的嵌套方式实现,由于计数器代码一样,整个外部接口代码也一样,这里只是列出输出值赋值的always块,其Verilog代码如下:

         always@(posedge clk or negedge reset)

                   begin

                            if(!reset)

                                     begin

                                     data<=0;

                                     end

                            else

                                     begin

                                               if(counter==8'd1)

                                                        begin

                                                        data<=data_in1;

                                                        end

                                               else

                                                        begin

                                                                 if(counter==8'd10)

                                                                           begin

                                                                           data<=data_in2;

                                                                           end

                                                                 else

                                                                           begin

                                                                                    if(counter==8'd20)

                                                                                             begin

返回列表