如何进行以 ACLK 为中心的数据传输

How to make ACLK centric data transfer

在 AXIS 流 speck 中,ACLK 定义为:

The global clock signal. All signals are sampled on the rising edge of ACLK.

这意味着假设AXIS主机和从机正在接收相同的ACLK。 能否请您帮助理解以下内容:
1) 如果 AXIS 主机和从机块上存在 ACLK 转换,则由设计人员负责。 Speck 没有对此设置任何限制。我的理解对吗?
2) 数据传输应该是 ACLK 中心对齐的。所以开发人员应该让 AXIS 主机发送时钟中心对齐的数据。对吗?
3) 如何进行以ACLK为中心的数据传输?想象一下,您在整个系统中有全局时钟,为了使要传输的数据与该数据的时钟中心对齐,您需要生成新时钟,该时钟的相位从全局时钟左移。有什么想法可以在 FPGA 中实现吗?

我觉得问题出在你对英语的理解上。
-centric 与 center(或 center)不同。

这里的中心意思是"The most important, where everything revolves around"不是意味着数据在时钟的中间(中心)。

因此,在 AXI/AMBA 系统中,您必须确保所有组件都使用相同的时钟信号,并且所有逻辑都应 运行 从时钟上升沿开始。那是所有同步逻辑的相同标准要求。

现在回答你的问题:

1) If there is a ACLK slew on AXIS master and slave blocks,it is left under designer responsibility. Speck does not set any limitation on that. Is my understanding right?

您应该有时钟偏差。如果你有,你就有大麻烦了,是的,你必须解决这个问题。不惜一切代价避免它!

2) The data transfer should be ACLK center aligned. So the developer should make the AXIS master to send clock center aligned data. Right?

没有。一切都在时钟上升沿计时。这意味着数据将在时钟上升沿后不久开始变化。您可以在 AXI/AMBA 标准中的所有时序图中看到这一点。

3) How to make ACLK centric data transfer? Imagine you have global clock in the whole system, to make data to be transferred clock center aligned to that data, you need to generate new clock which has phase left shifted from your global clock. Any ideas how we can do it in FPGA?

您所做的就是在所有地方使用相同的 ACLK 信号。 移动时钟, 生成新时钟。

以下是我设计的一些 Verilog 模块:

module ahbl_arbiter
#(parameter MA   = 4    // Number of masters 2..8
)
(  input                clk,       // System clock
   input                reset_n,   // System reset
   input                clken,     // Clock enable  
....


module ahbl_splitter
#(parameter SL   = 4,   // Number of slaves 2..32
            L2BS = 10   // Log 2 of block size 10 = 1K
)
(  input              clk,       // System clock
   input              reset_n,   // System reset
   input              clken,     // Clock enable
....

module apb_bridge
#(parameter
   NS   = 8,     // Number of slaves
   L2BS = 10,    // Log2 Address block assigned each peripheral
   REG  = 1'b0   // Register in rdata return path
)
(  input                  clk,       // System clock
   input                  reset_n,   // System reset
   input                  clken,     // Clock enable
...

如果你使用这些,它们都有相同的时钟:

ahbl_arbiter
ahbl_arbiter_0 (
     .clk        (aclk),        // System clock
     .reset_n    (reset_n),     // System reset
     .clken      (clken),       // Clock enable
....

apb_bride
apb_bride_0 (
      .clk        (aclk),        // System clock
      .reset_n    (reset_n),     // System reset
      .clken      (clken),       // Clock enable
....

ahbl_splitter
ahbl_splitter_0 (
      .clk       (aclk),        // System clock 
      .reset_n   (reset_n),     // System reset 
      .clken     (clken),       // Clock enable 
....