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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5665|回复: 4

[求助] verilog中设计一个上升沿触发单脉冲发生器

[复制链接]
发表于 2019-2-14 18:58:50 | 显示全部楼层 |阅读模式

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

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

x
要实现一个目标,输入一个触发信号,上升沿触发,输出一个一定脉宽的单个脉冲信号。主要代码稍后给出。
代码主要解释,每个时钟上升沿对输入的信号当前状态、前一状态进行保存,
当前一状态为0,现一状态为1时,触发标志位置1,其余为0;
当触发标志位为1时,计数器使能位为1,
当触发标志为为0并且计数器计数数值大于脉宽设定值时,计数器使能位为0,
....后续主要是输出脉冲的逻辑,比较简单,看代码即懂,不赘述。

问题:实际输出的单脉冲信号,和输入的触发信号之间的延迟不固定,存在一定范围,
这个问题产生的原因比较好理解,因为输入的触发信号与系统时钟不同步,
所以每次采到上升沿的时间差存在差不多一个周期的差别,而实际上在示波器中也是看到同样的结果。

关于这部分解释稍后贴出。

现在,请教各位,有没有什么好的,思路,让脉冲输出延迟稳定一些,个人感觉自己当前的这种设计思路不正确。
 楼主| 发表于 2019-2-14 18:59:37 | 显示全部楼层




  1. //*****************************
  2. //save the trig signal now;
  3. reg trig1_r;

  4. always@(posedge CLK0_OUT or negedge rst_n)
  5. begin
  6.         if(!rst_n)
  7.                         trig1_r <= 1'b0;
  8.         else
  9.                         trig1_r <= trig_in1;
  10. end
  11. //*****************************

  12. //*****************************
  13. //save the value of trig signal 1 cycle before;
  14. reg trig1_t;

  15. always@(posedge CLK0_OUT or negedge rst_n)
  16. begin
  17.         if(!rst_n)
  18.                         trig1_t <= 1'b0;
  19.         else
  20.                         trig1_t <= trig1_r;
  21. end
  22. //*****************************

  23. wire trig1_flag = trig1_r & (~trig1_t);
  24. //if the trig signal now is 1 and the trig signal 1 cycle ago is 0,
  25. //then the trig flag can capture the rise edge of the trig in signal.

  26. //multi cycle pulse_out:
  27. reg cnt1_en;
  28. //enable function for timer cnt1;
  29. reg[4:0] cnt1;
  30. //timer cnt1, to set pulsewidth


  31. //*****************************
  32. always@(posedge CLK0_OUT or negedge rst_n)
  33. begin
  34.         if(!rst_n)
  35.                 cnt1_en <= 1'b0;
  36.         else
  37.                 begin
  38.                         if(trig1_flag == 1'b1)
  39.                                 cnt1_en <= 1'b1;
  40.                         else if(trig1_flag == 1'b0 && cnt1 > pulsewidth)
  41.                                           cnt1_en <= 1'b0;
  42.                 end
  43. end

  44. //*****************************
  45. always@(posedge CLK0_OUT or negedge rst_n)
  46. begin
  47.         if(!rst_n)
  48.                 cnt1 <= 5'd0;
  49.         else if(cnt1_en == 1'b0)
  50.                           cnt1 <= 5'd0;
  51.                   else if(cnt1_en == 1'b1 && cnt1 <= pulsewidth)
  52.                                          cnt1 <= cnt1 + 5'd1;
  53.                                  else if(cnt1_en == 1'b0 && trig1_flag == 0)
  54.                                                         cnt1 <= 5'd0;
  55. end

  56. //output pulse;
  57. always@(posedge CLK0_OUT or negedge rst_n)
  58. begin
  59.         if(!rst_n)
  60.                 trig_out1 <= 1'b0;
  61.         else if(cnt1 >= pulsewidth)
  62.                           trig_out1 <= 1'b0;
  63.                   else if(cnt1_en == 1'b1)
  64.                                          trig_out1 <= 1'b1;
  65. end


复制代码
 楼主| 发表于 2019-2-14 19:01:42 | 显示全部楼层
关于输出信号和触发信号延迟不固定的解释
截图00.jpg
 楼主| 发表于 2019-2-16 12:12:35 | 显示全部楼层
好吧,没人回复哦,我自己关帖了,这个问题我想明白了,延迟不固定的问题让它存在,
把触发标志信号再输出给后续需要计算延迟的电路,这样就方便计算延迟时间了。
发表于 2019-2-23 12:23:06 | 显示全部楼层
不错不错不错不错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2025-7-15 08:10 , Processed in 0.019711 second(s), 10 queries , Gzip On, MemCached On.

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