Разделить на 2 такта и соответствующего поколения сброса

Мой вопрос касается использования генерации синтезируемого деления на 2 часа и соответствующего сброса в verilog.

Мы можем сгенерировать деление на 2 часа, как показано ниже, используя verilog.

module frquency_divider_by2(
  input      rst_n,
  input      clk_rx,
  output reg clk_tx
);

always @ (posedge clk_rx) begin
  if (~rst_n) begin
    clk_tx <= 1'b0;
  end
  else begin
    clk_tx <= ~clk_tx;
  end
end

endmodule

Мой вопрос заключается в том, как сгенерировать соответствующий сброс (для использования флопами с использованием clk_tx), используя rst_n

Может ли кто-нибудь помочь мне за то же самое.

я ценю вашу помощь


person srikanth    schedule 15.06.2015    source источник


Ответы (1)


Для асинхронного примените сброс и отпустите после двух положительных фронтов clk_tx. Ожидание 2 положительных фронтов останавливает сброс от низкого уровня в течение долей тактового периода.

output reg rst2_n;
reg temp;

always @ (posedge clk_rx, negedge rst_n ) begin
  if (~rst_n) begin
    {rst2_n,temp} <= 2'b0;
  end
  else begin
   {rst2_n,temp} <= {temp, 1'b1};
  end
end

Для синхронного сброса вам нужно будет проверить, был ли он низким для какой-либо части более быстрых часов, во время синтеза вам нужно будет проверить cdc (пересечение часового домена).

output reg rst2_n;
reg [1:0] sync_reset_n;
always @ (posedge clk_rx) begin
  sync_reset_n[1:0] <= {sync_reset_n[0], rst_n};
  rst2_n            <= &sync_reset_n ; //AND BIT reduction
end
person Morgan    schedule 15.06.2015
comment
Спасибо за ответ. - person srikanth; 16.06.2015
comment
Я думаю, что для асинхронного сброса часы должны быть clk_rx. @Морган. - person srikanth; 16.06.2015
comment
@srikanth, ты абсолютно прав. Обновленный ответ. сброс должен безопасно выполняться в домене часов, который его использует. - person Morgan; 16.06.2015