Почему следующий код умножения часов Verilog не работает для меня? - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь сгенерировать часы, которые (3/16) от системных часов.Итак, я решил сгенерировать 3x тактовых импульса из системы clk и затем (1/16) x тактовых из этого.Прямо сейчас я застрял в генерации только 3х часов.Я делаю это, вычисляя период времени системных часов, а затем переключая 3x часы каждую 1/6 этого периода.Но моя симуляция просто останавливается на этомЯ нигде не использовал блок forever, я проверил.Следовательно, нет временной конструкции.Ниже приведен код, над которым я работаю.

module eec_clk_gen (
    input logic arst,
    input logic sys_clk,
    output logic eec_clk
);

real t0;
real t1;
real sys_clk_tp;


logic eec_clk_x3;


//Calculating clock period of sys_clk
initial
begin
    @(posedge sys_clk) t0 = $realtime;
    @(posedge sys_clk) t1 = $realtime;
    sys_clk_tp = t1 - t0;
end



//Generating clock at 3 times sys_clk freq

initial
begin
    @(posedge sys_clk) eec_clk_x3 = 1'b1;
end

always
begin
    #(sys_clk_tp/6) eec_clk_x3 <= ~eec_clk_x3;
end

endmodule: eec_clk_gen

Меня не беспокоит сигнал arst, который отсутствует в моем коде.Он будет реализован после того, как eec_clk станет функциональным.Некоторая помощь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

То, что вы пытаетесь сделать, бесполезно.Даже если вам удастся заставить это работать в симуляции , он никогда не будет синтезировать:

  • Функция $realtime доступна только в симуляции.Это не доступно в синтезе;если вам нужны часы реального времени, вам нужно создать свои собственные.

  • Оператор # эффективен только при моделировании.Он игнорируется во время синтеза.

Если вы хотите умножить тактовый сигнал на ПЛИС, большинство ПЛИС имеют жесткие макросы управления тактовой частотой (обычно DLL или PLL), которые можно использовать для этой цели.,За подробностями обращайтесь к справочному руководству вашей целевой части.

Если вы нацелены на ASIC, свяжитесь с вашим литейным заводом.

0 голосов
/ 27 сентября 2018

Там 2, возможно, 3 проблемы с вашим кодом.

  1. Начальное значение sys_clk_tp равно 0.0 .Таким образом, ваш блок всегда входит в бесконечный цикл с 0 задержками.Время не может наступить
  2. Вы используете неблокирующее присвоение t1,t2, поэтому t2 по-прежнему равно 0 при оценке t1-t2
  3. Вы используете $time вместо $realtime Если вашВходные часы имеют небольшую задержку из-за различных временных масштабов, $ усеченных времени.Я бы сделал

`

initial
     begin
        @(posedge sys_clk) t0 = $realtime;
        @(posedge sys_clk) t1 = $realtime;
        sys_clk_tp = t1 - t0;
        forever  #(sys_clk_tp/6) eec_clk_x3 = ~eec_clk_x3;
    end
...