求助:一个简单的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条回答
cutfor
1楼-- · 2019-07-16 02:42
永远都不会跑到clear那里,因为IF有优先级!
xiaohuixiao
2楼-- · 2019-07-16 08:26
cutfor 发表于 2014-12-4 20:48
永远都不会跑到clear那里,因为IF有优先级!

要是我想让else if (clear == 1)
                      count2 <= 0;
这条语句生效怎么改一下?调了好半天了,呼呼
ysc917
3楼-- · 2019-07-16 10:27
建议修改为
     if(!rst_n||clear)
          count2 <= 1'b0;
这样应该就可以了
默默地努力
4楼-- · 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 中之后,如果不注意顺序就会出现你的问题,部分语句永远不会执行。
默默地努力
5楼-- · 2019-07-16 21:23
还有就是,程序里最好有注释,然后问问题的时候,可以把你的程序要实现的功能描述一下
调皮
6楼-- · 2019-07-17 03:02
楼主你这是准备啥计数到什么时候让count2清零,还是说clear出现就清零。如果是出现就清零看5楼,如果是有其他条件那么你应该给出来才能给你改正。。。。。。。。。

一周热门 更多>