| 
 | 
 
 
发表于 2010-12-1 15:14:21
|
显示全部楼层
 
 
 
 本帖最后由 liqz 于 2010-12-1 15:18 编辑  
 
如果是异步信号的话可以打两拍来处理 
加了一个rst输入信号 
module counter(clk, rst,start, set_count, alarm); 
      input clk, rst,start;     //start是异步启动信号 
    input[9:0] set_count;    //用于设置计数器的计数值 
    output alarm;     //计数完成后置位一个时钟周期 
    reg alarm; 
    reg  [9:0]counter; 
      reg start1,start2,start3; 
      reg state; 
always @ (posedge clk ) 
begin 
if(rst) 
    begin 
        counter<=10'd0; 
        start1<=1'd0; 
        start2<=1'd0; 
        start3<=1'd0; 
        state<=1'd0; 
        alarm<=1'd0; 
    end 
else 
begin 
    start1<=start; 
    start2<=start1; 
    start3<=start2; 
    case(state) 
          1'd0: 
          begin 
                 alarm<=1'd0; 
                 if(start2&(~start3))//start2是打两拍后的start信号,做了个亚稳态处理,抓的是start2的上升沿 
                 begin  
                        state<=1'd1; 
                        counter<=counter+1'd1; 
                 end 
           end 
           1'd1: 
           begin 
                  if(counter==set_count)//计数到需要的值以后,alarm置为有效,回到状态0 
                  begin 
                          state<=1'd0; 
                          counter <=10'd0; 
                          alarm<=1'd1; 
                  end 
                  else if(start2&(~start3))//如果在计数过程中又来了启动信号,重新计数 
                  begin 
                          counter<=10'd0; 
                  end 
                  else 
                        counter<=counter+1'd1; 
          end 
     endcase 
end 
end 
endmodule |   
 
 
 
 |