Что делать, если я использовал асинхронный сброс, Должен ли я сделать так, как синхронный превратил его?

На мы делаем IC (я имею в виду физический дизайн в аппаратном обеспечении). Насколько я знаю, сброс ввода всегда асинхронный. Интересно, что, если я использовал асинхронный сброс, должен ли я сделать синхронный? или мы можем просто использовать асинхронный сброс?


person BONGKA    schedule 07.02.2015    source источник


Ответы (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

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

person lvd    schedule 11.02.2015