Добавление задержки на вывод в Verilog - PullRequest
0 голосов
/ 17 декабря 2018

Мне нужно добавить синтезируемую задержку в моем коде, чтобы получить вывод.Мой код -

   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 

Это дает мне вывод, где 6 из 15 раз начального тактового цикла, это будет 1, а в противном случае 0. Пока это хорошо.Но другой сигнал, который мне нужен, TG, должен быть в два раза больше этого сигнала.То есть в 15 циклах это должно быть 1 2 раза.Итак, мне нужно задержать выходной сигнал в 6, 7 или 8 раз по сравнению с исходным тактовым циклом, чтобы получить задержанный сигнал, который я затем могу добавить к исходному выходу, чтобы получить то, что мне нужно.Пожалуйста, обратитесь к приложенному изображению.Я не могу понять синтезируемую задержку.Любая помощь будет оценена.Благодарю. Пожалуйста, посмотрите на эту картинку, чтобы помочь

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вы можете добавить задержки, создав экземпляр буфера задержки из стандартной библиотеки ячеек, если вы хотите настраивать задержки (т.е. задержка! = N (1 / clk)).Но обратите внимание, что вам может потребоваться добавить параметр dont_touch во время синтеза, потому что инструмент может оптимизировать буфер задержки, поскольку в тракте данных буфера отсутствует логика (конденсаторы используются для задержки сигнала).Или вы можете использовать D-Flops, показанный ниже, чтобы задержать (здесь значение задержки = 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
0 голосов
/ 18 декабря 2018

Вы можете использовать сдвиговый регистр, чтобы задержать вывод на необходимое количество циклов.Затем ИЛИ исходный вывод с задержанным выводом

 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 

Если это не то, что вам нужно, вам нужно дать нам гораздо лучшее представление о том, как выглядит форма волны.Твоя картинка не помогает.

...