微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 询问一个输出延时的问题,VERILOG的

询问一个输出延时的问题,VERILOG的

时间:10-02 整理:3721RD 点击:
时钟频率为1MHZ,要求得到三个输出脉冲,分别任firen1 firen2 firen3,
三个脉冲的周期都为20ms,占空比1:2。
其中firen2对于firen延时30°,firen3对于firen2 延时30°。
如何用verilog hdl实现?
不甚感激 ,尤其是想知道用计数器如何实现延时。有源代码吗?
谢谢··

急···


脉冲的周期?脉冲只有正负脉冲和脉冲宽度的这样的定义。
你的应该是周期信号,还有周期和占空比以及延时相位一说。如果是脉冲就只有绝对延时了。

    若只是用来描述,产生测试激励,很简单。
    1ns 分频出 20ms period 的波形文件很简单。
    占空比也不难。难点在于你要的30度,如果激励,算好了时间 # (20 *(30/360)) 就可以了。

若是设计电路,前端描述,综合,延时会被忽略就没用了。
这个情况,你或许可以试试看set_min_delay 加在两个端口上。
DC会推断出好多delay cell,至于最后出来是不是精确的30度,难说。
最好的做法当然是用现成的PLL DLL了。

通过记主时钟的个数就可以延时的计量,比如你这里1M的时钟,一个时钟周期就可以产生1us的延时,对于20ms周期的30度就是20ms/12=1667us,所以你要通过计数延时1667个时钟周期。

占空比  20ms的都知道怎么写 就是不知道如何延时30°  直接用#这样的话 那应该使用于测试中 综合上好像不能用

   我想知道如何将这个30°延时的计数器运用到延时中?是否可以用寄存器?



    可以用,就是用寄存器计数来标定30度的,即一个周期的1/12,20000*1/12 = 1667啊!

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





   非常感谢 我好好看下

学习一下

感谢分享



    不用客气,呵呵。



   


见图,firen2 firen3 `波形 第一个周期的时间大于后面的周期  ··后面的周期都为20ms 占空比也都为1:2
但是第一周期就比较大  ··
根据您的代码,counter2  在 counter1计数小于1666的时候也在计数 这时候firen输出也为1
counter3相对于counter2也类似
能够让脉冲第一个周期的时间也一样?

module firen2(clk,rst,firen,firen1);
input clk;
input rst;
output firen;
output firen1;

reg [14:0]count;
reg firen;
reg firen1;

always@(posedge clk or posedge rst )
if (rst)
count<=15'D0;
else if(count<20000)
count<=count+15'D1;
else
count<=15'D0;


always@(posedge clk or posedge rst)
if (rst)
firen<=0;
else if(count<6666)
firen<=1;
else
firen<=0;
always@(posedge clk or posedge rst)
if (rst)
firen1<=0;
else if((count>1666)&&(count<8333))
firen1<=1;
else
firen1<=0;
endmodule
在时间的取值上好像不是很准确 这是用纯粹计数器计算的··那样第一个周期也会延时
LQ4080 这样是否可以?



    只要你在Reset之后,不要都复位,counter3 <= 15'D0;counter2 <= 15'D1667;counter3 <= 15'D3334就行了,第一个周期也能满足。

学习了

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

网站地图

Top