打印
[FPGA]

关于用FPGA实现PWM延迟(死区)的verilog hdl程序请指正

[复制链接]
6170|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
想得到如图所示的波形,最后两行:上面是PWM输入,下面是程序处理后的输出!
  想实现的功能:在PWM输入的上升沿固定延时4us,下降沿跟随PWM输入!
我想谈谈自己的想法:
  方案一:把PWM输入整体右移4us,然后与原pwm波形相与得到所需的波形;
方案二:检测pwm输入的上升沿,检测到上升沿开始触发计数器计数到4us,计数器清0,计数期间输出0;其它时间原样输出pwm;


这里有个问题:方案二:pwm检测期间,如何触发定时器啊,需要锁存检测到的pwm上升沿信号吗?因为CLK上升沿开始检测,检测到PWM上升沿以后,高电平期间的检测rising_edge=0;

以下是我的代码,总感觉代码里面有些问题,敬请高手指正:
`define DELAY 3
module deathtime1(dt_pwm,clk,pwm,rst);
output dt_pwm;
input clk,pwm,rst;
reg dt_pwm;  //最终输出
reg r0_pwm,r1_pwm;
reg counter,clr,flag;
wire rising_edge;

always@(posedge clk or negedge rst)  //2位移位寄存器寄存
  begin
   if(!rst)
    begin
     r0_pwm<=1'bx;
     r1_pwm<=1'bx;
    end
   else
   begin
     r0_pwm<=pwm;
     r1_pwm<=r0_pwm;
   end
  end
  
  assign rising_edge=~r0_pwm&r1_pwm;  //判断PWM上升沿
  
  always@(rising_edge or clr)         //锁存器锁存上升沿,得到计数使能flag
   begin
    if(!clr)
   flag<=0;
  if(rising_edge)
   flag<=1;
   end
   
always@(posedge clk or negedge rst)  //计数器counter
  if(!rst)
   counter<=0;
  else
   begin
     if(flag)
     begin
     if(counter>`DELAY)
      begin
      counter<=0;
    clr<=0;
    end
     else
      counter<=counter+1;
     end
     else
     counter<=0;
   end
  
always@(posedge clk or negedge rst)
  begin
  if(!rst)
    dt_pwm<=0;
  else
    if((counter<=`DELAY)&&(counter>=1))
    dt_pwm<=0;
    else
    dt_pwm<=pwm;
  end
endmodule

正确的波形相与.jpg (28.08 KB )

正确的波形

正确的波形

相关帖子

沙发
bowlder2008|  楼主 | 2014-1-6 20:35 | 只看该作者
pwm信号的频率先不用管,只是先实现这个功能!pwm和clk时钟同步,而且pwm周期是clk周期的至少3的整数倍!
补充一下:1.方案一:如果整体右移实现指定延时,需要用多少位的移位寄存器实现?难道要延时40个时钟周期的话,就需要40个移位寄存器?
         2.方案二:检测到输入信号的上升沿以后开始计时,期间每第二个clk信号的上升沿到来以后,rising_edge的值由1->0,这里需要锁存器吧?
                    

使用特权

评论回复
板凳
bowlder2008|  楼主 | 2014-1-6 20:40 | 只看该作者
我针对上面的程序,写了个testbench,仿真出来的波形,我自己都看不懂了,求大神指点下吧
感觉自己的程序有问题

奇怪.jpg (19.65 KB )

奇怪.jpg

使用特权

评论回复
地板
zhaojingzb| | 2014-1-7 08:33 | 只看该作者
方案二的代码明显的时序没有对应上。在延迟的期间里会有多个错误的高电平输出的。
对于方案一,是需要40个寄存器来进行移位缓存的。如果使用xilinx器件的话有SRL,使用LUT实现移位,只需要两个LUT就可以了。

使用特权

评论回复
5
bowlder2008|  楼主 | 2014-1-7 08:44 | 只看该作者
不是错误的高电平,是错误的低电平吧?另外问下,zhaojingzb,这个上升沿,需要锁存吗?

使用特权

评论回复
6
zhoujiewen| | 2014-1-7 09:39 | 只看该作者
先顶一个....

使用特权

评论回复
7
hanqingynu| | 2015-4-11 22:01 | 只看该作者
请问 你的这两路信号的频率是是多少呢 ?计数器的值和频率有关吧 计算的是上升沿的个数 也就是周期数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝