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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 10724|回复: 17

[求助] 询问一个输出延时的问题,VERILOG的

[复制链接]
发表于 2010-11-4 15:53:14 | 显示全部楼层 |阅读模式

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

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

x
时钟频率为1MHZ,要求得到三个输出脉冲,分别任firen1 firen2 firen3,

三个脉冲的周期都为20ms,占空比1:2。

其中firen2对于firen延时30°,firen3对于firen2 延时30°。

如何用verilog hdl实现?

不甚感激 ,尤其是想知道用计数器如何实现延时。有源代码吗?

谢谢··
 楼主| 发表于 2010-11-4 16:12:12 | 显示全部楼层
急··········
发表于 2010-11-4 17:22:04 | 显示全部楼层
回复 1# zlgy2

脉冲的周期?脉冲只有正负脉冲和脉冲宽度的这样的定义。

你的应该是周期信号,还有周期和占空比以及延时相位一说。如果是脉冲就只有绝对延时了。
发表于 2010-11-4 17:27:38 | 显示全部楼层




    若只是用来描述,产生测试激励,很简单。

    1ns 分频出 20ms period 的波形文件很简单。

    占空比也不难。难点在于你要的30度,如果激励,算好了时间 # (20 *(30/360)) 就可以了。
发表于 2010-11-4 17:30:46 | 显示全部楼层
若是设计电路,前端描述,综合,延时会被忽略就没用了。

这个情况,你或许可以试试看set_min_delay 加在两个端口上。

DC会推断出好多delay cell,至于最后出来是不是精确的30度,难说。

最好的做法当然是用现成的PLL DLL了。
发表于 2010-11-4 17:31:25 | 显示全部楼层


时钟频率为1MHZ,要求得到三个输出脉冲,分别任firen1 firen2 firen3,

三个脉冲的周期都为20ms,占空比1: ...
zlgy2 发表于 2010-11-4 15:53



通过记主时钟的个数就可以延时的计量,比如你这里1M的时钟,一个时钟周期就可以产生1us的延时,对于20ms周期的30度就是20ms/12=1667us,所以你要通过计数延时1667个时钟周期。
 楼主| 发表于 2010-11-4 17:35:26 | 显示全部楼层
占空比  20ms的都知道怎么写 就是不知道如何延时30°  直接用#这样的话 那应该使用于测试中 综合上好像不能用
 楼主| 发表于 2010-11-4 17:36:51 | 显示全部楼层


通过记主时钟的个数就可以延时的计量,比如你这里1M的时钟,一个时钟周期就可以产生1us的延时,对于20m ...
glenchan 发表于 2010-11-4 17:31




   我想知道如何将这个30°延时的计数器运用到延时中?是否可以用寄存器?
发表于 2010-11-4 20:54:35 | 显示全部楼层
回复 8# zlgy2


    可以用,就是用寄存器计数来标定30度的,即一个周期的1/12,20000*1/12 = 1667啊!
发表于 2010-11-4 23:15:49 | 显示全部楼层
本帖最后由 lq4080 于 2010-11-4 23:21 编辑

module fen(
clkin,
reset,
firen1,
firen2,
firen3,
counter1,
counter2,
counter3
);

input        clkin;
input        reset;
output        firen1,firen2,firen3;
output  [14:0] counter1,counter2,counter3;

reg                firen1,firen2,firen3;

reg        [14:0]        counter1,counter2,counter3;

//20ms:20000, P:6667,N:13333 30du:1667  counter:23334

always @(posedge clkin)
begin
if(reset)
   begin
   counter1 <= 15'D0;
   counter2 <= 15'D0;
   counter3 <= 15'D0;
   end
   else
    begin
     if(counter1 >= 15'D19999)
      counter1 <= 0;
      else
       counter1 <= counter1 + 15'D1;
     if(counter1 == 15'D1666)
      counter2 <= 0;
      else
       counter2 <= counter2 + 15'D1;
      if(counter2 == 15'D1666)
       counter3 <= 0;
       else
        counter3 <= counter3 + 15'D1;
    end
end

always @(negedge clkin)
begin
if(counter1 < 15'D6667)
  firen1 <= 1;
  else
   firen1 <= 0;
if(counter2 < 15'D6667)
  firen2 <= 1;
  else
   firen2 <= 0;
if(counter3 < 15'D6667)
   firen3 <= 1;
   else
   firen3 <= 0;
end

endmodule

仿真.bmp
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-6-15 08:32 , Processed in 0.032220 second(s), 9 queries , Gzip On, Redis On.

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