Нельзя использовать сигналы от разных часовых доменов как есть .
В вашем случае сигнал 'flag' должен быть синхронизирован с mainclk:
reg flag_meta,flag_sync;
always @(posedge mainclk or negedge reset_n)
begin
if (!reset_n)
begin
flag_meta <= 1'b0;
flag_sync <= 1'b0;
end
else
begin
flag_meta <= flag;
flag_sync <= flag_meta;
end
end
Аналогичным образом ваш сигнал 'done' должен быть синхронизирован с часами AXI:
reg done_meta,done_sync;
always @(posedge aclk or negedge reset_n)
... // etc.
В вашем AXI-коде вам нужно снять флажок.Что-то вроде:
always @(posedge aclk or negedge reset_n)
begin
... // some code that sets the 'flag'
... // probably on an AXI write
if (done_sync)
fag <= 1'b0;
end
end
Есть предупреждение:
Это работает только в том случае, если медленно изменяются и «флаг», и «готово».Должно быть по крайней мере два такта на каждой стороне, чтобы передать изменение.Это наиболее важно, если вы переводите сигнал с быстрых на медленные часы.