在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5909|回复: 7

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

[复制链接]
发表于 2017-3-23 09:06:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
大概意思就是要在捕获一个时钟周期的脉冲信号时,启动计数器,计数器记到一个固定值就停止。
由于脉冲信号只有一个周期不是电平信号,好像除了使用状态机没有别的办法了。

想求教高手来指点一下,看看有别的简单的方式实现,谢谢。
发表于 2017-3-23 10:03:55 | 显示全部楼层
本帖最后由 杰克淡定 于 2017-3-23 14:24 编辑

例如,计到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
发表于 2017-3-23 12:08:07 | 显示全部楼层
回复 1# donydong

    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;
 楼主| 发表于 2017-4-5 11:02:35 | 显示全部楼层
回复 3# ddxx


   多谢指点,这个是有效的。
发表于 2017-4-5 16:56:03 | 显示全部楼层
回复 3# ddxx


    这是给定一个最大计数值然后让cnt和cnt_ena相互进行牵制嘛,我理解的是脉冲进来让cnt_ena拉高,然后cnt开始计数,计到最大值以后拉低cnt_ena,同时让cnt清零。
发表于 2017-4-6 16:41:16 | 显示全部楼层
你就让在脉冲有效的时候+1就可以了撒
发表于 2017-4-7 12:53:35 | 显示全部楼层
回复 3# ddxx


    你这种写法存在cnt与ena信号的相互检测,实际计数个数为MAX_CNT + 1个。
所以,ena的结束判断条件应改为 if(cnt == MAX_CNT - 2)
发表于 2017-4-7 12:56:15 | 显示全部楼层
回复 3# ddxx

或者这样改
    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;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-4-4 16:53 , Processed in 0.023008 second(s), 8 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表