微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求助一个verilog模块,脉冲信号启动计数器,计数到定值停止。谢谢

求助一个verilog模块,脉冲信号启动计数器,计数到定值停止。谢谢

时间:10-02 整理:3721RD 点击:
大概意思就是要在捕获一个时钟周期的脉冲信号时,启动计数器,计数器记到一个固定值就停止。
由于脉冲信号只有一个周期不是电平信号,好像除了使用状态机没有别的办法了。
想求教高手来指点一下,看看有别的简单的方式实现,谢谢。

例如,计到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;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top