Ние правим IC (имам предвид физически дизайн в хардуера). Както знам, входното нулиране винаги е асинхронно. Чудя се, че какво, ако използвах асинхронно нулиране, трябва ли да направя синхронен? или Можем ли просто да използваме асинхронно нулиране?
Какво ще стане, ако използвах асинхронно нулиране, трябва ли да го направя като синхронно?
Отговори (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
По този начин все още можете да нулирате дизайна си по всяко време и дори при липса на часовник (както прави всяко асинхронно нулиране), но вътрешното нулиране ще приключи синхронно с часовника.