求助:一个简单的verilog程序,仿真了后有些问题,在线等

2019-07-16 00:18发布

程序如下:
module chuangxinjijin(
       clk_50M,rst_n,
       count1,count2,
       SP
      );
input clk_50M,rst_n;
output reg [16:0] count1;
output reg [14:0] count2;

output reg SP;

//-----------------------------SP-------------------------------------

reg clear;
always @(negedge clk_50M or negedge rst_n)
      if(!rst_n)
                      count1 <= 1'b0;
                else if(count1==59996 )   
                    begin  
                                clear <= 1;
                                count1 <= 1'b0;
                        end
                else
                    begin
                       count1 <= count1 + 1'b1;
                       clear <= 0;
                    end
                 

//--------------------------------------------------------------
always @(negedge clk_50M or negedge rst_n)
                if(!rst_n)
                      count2 <= 1'b0;
                else if(coun2>=0 && count2<281)
                  begin
              SP <= 1'b0;
              count2 <= count2 + 1'b1;
          end
        else if(count2>=281 && count2<286 )
          begin
              SP <= 1'b1;
              count2 <= count2 + 1'b1;
          end
        else if(count2>=286 && count2<330)
          begin
              SP <= 1'b0;
              count2 <= count2 + 1'b1;
          end
        else if (count2 == 330)
              count2 <= 281;
            else if (clear == 1)
                      count2 <= 0;
        else
          count2 <= count2 + 1'b1;
        
        
endmodule

问题如下,为什么在clear为1,也就四count1计数到59996时,count2不为0哇
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
默默地努力
2019-07-16 16:19
你让count2从1开始逐渐加1,对着程序自己屡一下,发现到了
else if (count2 == 330)
              count2 <= 281;
这句之后,就返回到刚开始的if语句了,也就是你的clear那一句,一直不会执行。
更正方法:
(1)
else if (clear == 1)
               count2 <= 0;
把这一句提前,放到复位后面,如下:
if(!rst_n)
       count2 <= 1'b0;else if (clear == 1)
       count2 <= 0;
else if(coun2>=0 && count2<281)   begin
        SP <= 1'b0;
        count2 <= count2 + 1'b1;
end
这样的话,就可以先判断clear语句。
(2)像楼上一样,将复位和clear合到一块。
如果你的if  else  语句的条件不是一个性质的话(不属于一类),例如clear和 count2的变化,你放到一个if  else 中之后,如果不注意顺序就会出现你的问题,部分语句永远不会执行。

一周热门 更多>