经常在写程序的时候纠结同样的功能到底用if实现还是case实现,用if的时候是if,else if接连写还是if else嵌套写,书上有看到过但是自己没探索过,印象不深刻,经常还是会犯迷糊,这里写了简单的程序,对同一功能不同代码综合出来的电路做了对比,希望自己能对这块的东西有更深入的了解,也希望能够分享出来和大家进行探讨和交流,有不对的或者需要补充的地方欢迎大家批评指正。 本次实例所实现的功能是在计数器等于四个特定值的时候将四个不同的输入值分别赋给输出。计数器为八位,从0到255循环计数。特点是计数器的值大于需要条件判断的数量,在计数器数值不满足判断条件的时候不执行操作。 第一种情况,用if,else 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 第二种情况采用if,else的嵌套方式实现,由于计数器代码一样,整个外部接口代码也一样,这里只是列出输出值赋值的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 |