如何从两个始终块写入公共寄存器

时间:2018-05-26 11:51:37

标签: verilog fpga xilinx

在我的应用程序中,我需要从两个始终块访问寄存器。 第一个块将是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

1 个答案:

答案 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'变化缓慢时才有效。每侧必须至少有两个时钟周期才能通过更改。如果您将信号从快速时钟传输到慢速时,这一点非常重要。