为什么MH计数到5不停止还要继续计数呢

2019-07-15 21:16发布

问题.png
上面是数字跑表计数器模块仿真图,分十位MH计时到5后仍然继续计数,请大神指点这个问题怎么解决。
下面是程序:
module jishuqi(clk_100hz,reset,pause,MH,ML,SH,SL,MSH,MSL);
input clk_100hz,reset,pause;
output reg [3:0]MH;
output reg [3:0]ML;
output reg [3:0]SL;
output reg [3:0]SH;
output reg [3:0]MSL;
output reg [3:0]MSH;
reg cnt_ms;
reg cnt_s;
always@(posedge clk_100hz or negedge reset)
  begin
    if(!reset)
      begin
       MSL<=4'd0;
       MSH<=4'd0;
       cnt_ms<=1'b0;
      end
    else
      begin
       if(!pause)
        begin
          if(MSL==9)
           begin
             if(MSH==9)
              begin
                MSL<=4'd0;
                MSH<=4'd0;
                cnt_ms<=1'b1;
              end
             else
              begin
                MSL<=0;
                MSH<=MSH+1'b1;
                cnt_ms<=1'b0;
              end
           end
          else
                          begin
                                  MSL<=MSL+1'b1;
                                  cnt_ms<=1'b0;
                          end
        end
      end
        end
always@(posedge cnt_ms or negedge reset)
  begin
    if(!reset)
      begin
        SL<=4'd0;
        SH<=4'd0;
        cnt_s<=1'b0;
      end
    else
      begin
        if(!pause)
          begin
           if(SL==9)
             begin
              if(SH==5)
                begin
                  cnt_s<=1'b1;
                  SH<=4'd0;
                  SL<=4'd0;
                end
              else
                begin
                  cnt_s<=1'b0;
                  SH<=SH+1'b1;
                  SL<=4'd0;                       
                end
             end
           else
             begin
                SL<=SL+1'b1;
                cnt_s<=1'b0;
             end
          end
      end
  end
always@(posedge cnt_s or negedge reset)
  begin
    if(!reset)
      begin
        ML<=4'd0;
        MH<=4'd0;
      end
    else
      begin
        if(!pause)
          begin
            if(ML==9)
              begin
                if(MH==5)
                 begin
                   MH<=4'd0;
                   ML<=4'd0;
                 end
                else
                  ML<=4'd0;
                  MH<=MH+1'b1;
              end
            else
               begin
                  ML<=ML+1'b1;
               end
          end
      end
  end

endmodule

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
小范fpr
1楼-- · 2019-07-16 11:49
无影000 发表于 2017-11-12 21:59
把if(MH==5)改成if(MH>5)就好了 但是不懂为什么这样改就行了

是不是频率有偏差?或者没清零,可能不能每次正好都是5

评分

参与人数 1积分 +5 收起 理由 ElecFans王岑 + 5

查看全部评分

无影000
2楼-- · 2019-07-16 15:28
不改的话直接计数到15 一直是这样 改了就计数到5 不懂为什么
无影000
3楼-- · 2019-07-16 20:41
asuyyy 发表于 2017-11-14 19:35
不改直接数到15归0是因为溢出了。
你定义的MH是4位的。最大为4'b1111换算成十进制就是15.
再加1就溢出了。变为0.

我是定义了四位MH 这是为了给下一个模块输入的信号ML MSL等位宽一样 而且这个计数到5就应该执行MH<=0的语句了呀 怎么还继续计数呢 begin那个问题已经解决了 这个模块仿真对了 就是不太明白这个MH计数超范围的原因
asuyyy
4楼-- · 2019-07-17 01:44
无影000 发表于 2017-11-15 09:21
我是定义了四位MH 这是为了给下一个模块输入的信号ML MSL等位宽一样 而且这个计数到5就应该执行MH

是不是MH==5的语句。在前仿真的时候没有问题。但是在后仿真的时候会跑到15?
然后改成MH>6的时候,就前后仿真都没问题?-

如果是的话,就是时序约束的问题了。建立时间,保持时间不满足。
jszhanghit
5楼-- · 2019-07-17 02:06
 精彩回答 2  元偷偷看……
neuangel
6楼-- · 2019-07-17 04:38
     else
                  ML<=4'd0;
                  MH<=MH+1'b1;

end

这段代码 else中有多个语句,加上一个begin  后跟一个end,目前你的程序的end不是对应的else中的end

一周热门 更多>