На мы делаем IC (я имею в виду физический дизайн в аппаратном обеспечении). Насколько я знаю, сброс ввода всегда асинхронный. Интересно, что, если я использовал асинхронный сброс, должен ли я сделать синхронный? или мы можем просто использовать асинхронный сброс?
Что делать, если я использовал асинхронный сброс, Должен ли я сделать так, как синхронный превратил его?
Ответы (1)
На самом деле, если у вас есть триггеры, которые тактируются И асинхронно сбрасываются, вы можете начать асинхронный сброс в любое время, но вы должны закончить его синхронно. Причина этого проста: представьте, что действительно асинхронно. сброс заканчивается одновременно с фронтом часов. Здесь вы можете легко получить метастабильные значения, или, например, половина ваших триггеров примет перепад тактовой частоты, а другая половина все еще будет в состоянии сброса и пропустит тот же перепад тактовой частоты, что может разрушить ваш дизайн.
Итак, в основном вам нужно синхронизировать внешний асинхронный сброс следующим образом:
module rst_resync
(
input wire clk,
input wire ext_rst_n,
output wire rst_n
);
reg [1:0] rst_resync;
always @(posedge clk, negedge ext_rst_n)
if( !ext_rst_n )
rst_resync[1:0] <= 2'b00;
else
rst_resync[1:0] <= { rst_resync[0], 1'b1 };
assign rst_n = rst_resync[1];
endmodule
Таким образом, вы по-прежнему можете сбросить свой дизайн в любое время и даже при отсутствии часов (как это происходит при любом асинхронном сбросе), но внутренний сброс завершится синхронно с часами.