always @(posedge clk)
begin
rst<=timeout&&reset;
end
always @(posedge set or negedge rst)
begin
if (!rst)
begin
flag<=0;
end
else
flag<=set;
end
always @(posedge clk or negedge rst)
begin
if (!rst)
begin
q_a<=1'b0;q_b<=1'b0;q_c<=1'b0;c_out<=3'b000;timeout=1;
end
else if(flag==1)
begin
c_out[2:0]<=c_out[2:0]+1'b1;
if(c_out==3'b111)
timeout=0;
else if ( (q_a==1) || (q_b==1) || (q_c==1) )
begin
q_a<=1'b0;q_b<=1'b0;q_c<=1'b0;
end
else if ( in_a )q_a<=1'b1;
else if ( in_b )q_b<=1'b1;
else if ( in_c )q_c<=1'b1;
end
end
endmodule
大概思路:接收到开始抢答信号set后flag置为1,开始计数,至3'b111后产生timeout信号,timeout和输入复位信号reset有一个为零就将rst置零,整个系统复位。
测试一下,计数功能正常,就复位信号为x,请教一下怎么改,或者换一组写法。