как записать в общий регистр из двух всегда блок - PullRequest
0 голосов
/ 26 мая 2018

В моем приложении мне нужно получить доступ к регистру из двух всегда блоков.первый блок будет иметь интерфейс xillinx axi.когда пользователь напишет 1 через axi, мне нужно начать работать в другом блоке всегда, а когда он будет сделан, я хочу очистить этот регистр, т.е. сделать его 0. Можете ли вы предложить логику для достижения требуемой функциональности.но проблема в том, что я не могу написать флаг из двух всегда блоков.псевдокод

//from axi interface always block

flag=1;
//axi interface block code end

//my custom always block
always @(posedge mainclk) //50Mhz main clokc
begin
if(flag==1)
begin
//so some task
flag=0;
end
end

1 Ответ

0 голосов
/ 26 мая 2018

Нельзя использовать сигналы от разных часовых доменов как есть .

В вашем случае сигнал '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

Есть предупреждение:
Это работает только в том случае, если медленно изменяются и «флаг», и «готово».Должно быть по крайней мере два такта на каждой стороне, чтобы передать изменение.Это наиболее важно, если вы переводите сигнал с быстрых на медленные часы.

...