求助一个verilog模块,脉冲信号启动计数器,计数到定值停止。谢谢
由于脉冲信号只有一个周期不是电平信号,好像除了使用状态机没有别的办法了。
想求教高手来指点一下,看看有别的简单的方式实现,谢谢。
例如,计到128。如果输入的单周期脉冲信号是其他时钟域的,先使用脉冲同步电路同步后再使用。
always @ (posedge clk or negedge rst_n )
begin
if (!rst_n)
cnt <= 8'h80 ;
else if (puls_in)
cnt <= #UDLY 8'h00 ;
else if (cnt != 8'h80)
cnt <= #UDLY cnt+1 ;
else ;
end
或者用减计数
always @ (posedge clk or negedge rst_n )
begin
if (!rst_n)
cnt <= 8'h00 ;
else if (puls_in)
cnt <= #UDLY 8'h80 ;
else if (|cnt)
cnt <= #UDLY cnt-1 ;
else ;
end
reg cnt_ena;
always @ (posedge clk or negedge rst_n )
if ( ~ rst_n )
cnt_ena <= 1'b0;
else if ( cnt == MAX_CNT - 1 )
cnt_ena <= 1'b0;
else if ( pulse_in == 1'b1 )
cnt_ena <= 1'b1;
always @ (posedge clk or negedge rst_n )
if ( ~ rst_n )
cnt <= 0;
else if ( puls_in == 1'b1 )
cnt <= 0;
else if (cnt_ena == 1'b1 )
cnt <= cnt + 1;
多谢指点,这个是有效的。
这是给定一个最大计数值然后让cnt和cnt_ena相互进行牵制嘛,我理解的是脉冲进来让cnt_ena拉高,然后cnt开始计数,计到最大值以后拉低cnt_ena,同时让cnt清零。
你就让在脉冲有效的时候+1就可以了撒
你这种写法存在cnt与ena信号的相互检测,实际计数个数为MAX_CNT + 1个。
所以,ena的结束判断条件应改为 if(cnt == MAX_CNT - 2)
或者这样改
reg cnt_ena;
always @ (posedge clk or negedge rst_n )
if ( ~ rst_n )
cnt_ena <= 1'b0;
else if ( cnt == MAX_CNT - 1 )
cnt_ena <= 1'b0;
else if ( pulse_in == 1'b1 )
cnt_ena <= 1'b1;
always @ (posedge clk or negedge rst_n )
if ( ~ rst_n )
cnt <= 0;
else if (cnt_ena == 1'b1 )
cnt <= cnt + 1;
else
cnt <= 1'b0;
