请教关于用verilog设计秒表的问题

2019-07-16 01:03发布

ms,s,min均两位,一键实现reset,start,stop 3个功能,20Mhz时钟信号20万分频成100hz的时钟信号,我的程序如下,在器材上运行的时候stop功能不能实现,请大神帮忙找出错误和修改方法,谢谢了。


module timer(clk,button,cnt1,cnt2,cnt3,cnt4,cnt5,cnt6);
input clk,button;
reg[3:0]cnt1,cnt2,cnt3,cnt4,cnt5,cnt6;
output[3:0]cnt1,cnt2,cnt3,cnt4,cnt5,cnt6;
reg [17:0]cnt;
reg[1:0]z;
reg x,y,full,full1,full2,full3,full4,full5;
reg[2:0]cs,ns;
parameter[2:0]
idle=000,
reset=001,
start=010,
stop=100;
always@(posedge clk)
begin
    if(cnt==199999)               //分频
       begin
           cnt=0;
           full=1;
       end
    else
       begin
           cnt=cnt+1;
           full=0;
       end
end
always@(posedge full)
        begin
            cs=ns;
        end

always@(button or cs)           //状态机
        begin
            case(cs)
            idle:
                begin
                    if(button)
                             ns=reset;
                    else
                        ns=idle;
                end
            reset:
                 begin
                     if(button)
                              ns=start;
                     else
                         ns=reset;
                 end
            start:
                 begin
                     if(button)
                               ns=stop;
                     else
                          ns=start;
                 end
             stop:
                 begin
                     if(button)
                              ns=reset;
                     else
                         ns=stop;
                 end
             default:ns=idle;
             endcase
           end
always@(ns)
begin
     case(ns)
           idle:z=2'b00;
           reset:z=2'b00;
           start:z=2'b10;
           stop:z=2'b11;
           default:z=2'b00;
     endcase
end

always@(posedge full)        //异步计数及工作状态
begin
    if(z==2'b11)            //ms的个位之stop功能
       begin
       x=0;
       y=1;
       cnt1=cnt1;
       end


    else if(z==2'b00)       //reset功能
    begin
       cnt1=4'b0000;
       x=1;
       y=0;
       end
    else if(cnt1==4'b1001)       //start功能
          begin
              x=0;
              cnt1=4'b0000;
              full1=1;
              y=0;
           end
    else
        begin
            x=0;
            cnt1=cnt1+4'b0001;
            full1=0;
            y=0;
        end
end
always@(posedge full1)       //个位的进位信号驱动十位
begin
    if((y==1)&&(x==0))       //ms的十位 stop
      cnt2=cnt2;

    else if((x==1)&&(y==0))   //reset
        cnt2=4'b0000;
    else if(cnt2==4'b1001)      //start
          begin
              cnt2=4'b0000;
              full2=1;
          end
    else
       begin
           cnt2=cnt2+4'b0001;
           full2=0;
       end
end
always@(posedge full2)
begin
    if((y==1)&&(x==0))
                    cnt3=cnt3;
    else if((x==1)&&(y==0))
              cnt3=4'b0000;
    else if(cnt3==4'b1001)
          begin
              cnt3=4'b0000;
              full3=1;
           end
    else
        begin
            cnt3=cnt3+4'b0001;
            full3=0;
        end
end
always@(posedge full3)
begin
    if((y==1)&&(x==0))
                    cnt4=cnt4;
    else if((x==1)&&(y==0))
           cnt4=4'b0000;
    else if(cnt4==4'b0101)
          begin
              cnt4=4'b0000;
              full4=1;
          end
    else
        begin
             cnt4=cnt4+4'b0001;
             full4=0;
        end
end
always@(posedge full4)
begin
    if((y==1)&&(x==0))
                   cnt5=cnt5;
    else if((x==1)&&(y==0))
               cnt5=4'b0000;
    else if(cnt5==4'b1001)
          begin
              cnt5=4'b0000;
              full5=1;
          end
    else
        begin
            cnt5=cnt5+4'b0001;
            full5=0;
        end
end
always@(posedge full5)
begin
    if((y==1)&&(x==0))
                    cnt6=cnt6;
    else if((x==1)&&(y==0))
               cnt6=4'b0000;
    else if(cnt6==4'b0101)

              cnt6=4'b0000;


    else

            cnt6=cnt6+4'b0001;

end
endmodule

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
youzizhile
1楼-- · 2019-07-16 04:40
 精彩回答 2  元偷偷看……
糖醋小白
2楼-- · 2019-07-16 09:23
youzizhile 发表于 2014-4-4 17:46
always@(ns)
begin
      case(ns)

谢谢你,这是用2位2进制数表示四个状态,实际的接线操作无误的情况下只能实现一种功能,开始暂停,或开始清零,没法开始暂停清零三种状态的切换
youzizhile
3楼-- · 2019-07-16 12:25
我觉得程序的流程要在好好分析下,硬件描述语言是并行执行的,所有的always是一起运行的,所以可能是那块的逻辑没有控制好

一周热门 更多>