在我的应用程序中,我需要从两个始终块访问寄存器。 第一个块将是xillinx axi接口。 当用户通过axi写1时,我需要开始在另一个始终阻止工作,当它完成时我想清除该寄存器,即使其为0。 你能否建议逻辑来实现所需的功能。 但问题是我不能写两个总是块的标志。 psudo代码
//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
答案 0 :(得分:0)
您不能使用来自不同时钟域的信号。
在您的情况下,'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
以类似的方式,你的'完成'信号必须与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
有一点需要注意:
这只有在'flag'和'done'变化缓慢时才有效。每侧必须至少有两个时钟周期才能通过更改。如果您将信号从快速时钟传输到慢速时,这一点非常重要。