Какво ще стане, ако използвах асинхронно нулиране, трябва ли да го направя като синхронно?

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


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


Отговори (1)


Всъщност, ако имате тригери, които са с тактова честота И асинхронно нулирани, можете да започнете асинхронно нулиране по всяко време, но трябва да го прекратите синхронно. Причината за това е проста: представете си, че наистина async. нулирането завършва едновременно с края на часовника. Можете лесно да получите метастабилни тук или, например, половината от вашите тригери ще приемат фронта на часовника, докато другата половина ще бъде все още в нулиране и ще пропусне същия фронт на часовника, като по този начин потенциално ще разруши вашия дизайн.

Така че основно трябва да синхронизирате външно асинхронно нулиране по следния начин:

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