本帖最后由 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 |