在Verilog中为输出增加延迟

时间:2018-12-17 18:49:11

标签: verilog delay fpga electronics

我需要在代码中添加可综合的延迟以获取输出。我的代码是-

   module square_wave(clk,rst,dac_out);
   input clk; 
   input rst;
   output reg dac_out;
   reg [3:0]  counter; // 

   always @(posedge clk)
     begin
        if (rst == 1'b1  ||  counter == 4'b1111) // period, count from 0 to n-1
          counter <= 0;
        else
          counter <= counter + 1'b1;

        if (rst == 1'b0  &&  counter < 4'b0110) // duty cycle, m cycles high
          dac_out = 1'b1;
        else
          dac_out = 1'b0;
      end
endmodule 

这给了我一个输出,在初始时钟周期的15次中有6次为1,否则为0。到目前为止,这很好。但是我需要的另一个信号TG应该是这个信号的两倍。意思是在15个循环中,应为1 2倍。 因此,我需要做的是将输出信号延迟原始时钟周期的6或7或8倍,以便得到延迟的信号,然后可以将其添加到原始输出中以获得所需的信号。请参考所附图片。我无法弄清楚可综合的延迟。任何帮助将不胜感激。谢谢。 Please look at this pic to help

2 个答案:

答案 0 :(得分:0)

您可以使用移位寄存器将输出延迟所需的周期数。然后将原始输出与延迟输出进行或运算

 module square_wave(
   input clk, rst,
   output regdac_out, 
   output TG);
   reg [3:0]  counter;
   reg [7:0] shifter;
   always @(posedge clk)
        if (rst == 1'b1  ||  counter == 4'b1111) // period, count from 0 to n-1
          counter <= 0;
        else begin
          counter <= counter + 1'b1;
          shifter <= {shifter, dac_out};
          if (rst == 1'b0  &&  counter < 4'b0110) // duty cycle, m cycles high
            dac_out <= 1'b1;
          else
            dac_out <= 1'b0;
        end
   assign TG = dac_out || shifter[7];
endmodule 

如果这不是您想要的,则需要让我们对波形的外观有一个更好的了解。您的图片无济于事。

答案 1 :(得分:0)

如果您要自定义延迟,可以通过从标准单元库实例化一个延迟缓冲区来增加延迟(即,延迟!= N(1 / clk))。但是请注意,您可能需要在合成时添加dont_touch选项,因为该工具可能会优化延迟缓冲区,因为缓冲区的数据路径中没有逻辑(使用电容器来延迟信号)。 或者,您可以使用以下所示的D型触发器来延迟信号(此处的延迟值为N(1 / clk))。

 always@(posedge clk)    
 begin
  data1_d1 <= data1;       //Delay data1 by one clock (clk)
  data1_d2 <= data1_d1;    //Delay data1 by two clocks (clk)
 end