0
\$\begingroup\$

我有一个Verilog块(block a),它用一个相对慢的时钟采样一个串行信号,然后根据串行数据的内容将数据放入几个寄存器中。

最终,这些数据需要进入多个AXI从寄存器,因为块A是较大的AXI从外围设备的一部分。更快的AXI时钟驱动另一个块(块B),该块处理与ARM内核的AXI事务。

采样时钟将数据记录到Block A输出寄存器中,因此这些数据就在那里等待被放置到axis寄存器中。(我想)我想要某种多维移位寄存器来把这些数据放到AXI时钟域,类似于:

... 输入线轴时钟,输入线[5:0]数据输入,输出线[5:0]数据输出。。。reg[5:0]数据_buf[2:0];分配数据输出=数据输出[2]。。。始终@(posedge axi_clk)开始数据buf[2:0]<={data_buf[1:0],data_in};终止

我希望在每个时钟上并行移位所有6位数据,而不是一次移位一位。

我该怎么做呢?原谅伪代码;到目前为止,我所做的一切都抛出了错误,而且我还没有找到我所尝试做的示例代码,或者确认使用容易读懂的代码是可能的。

PS -我的团队不想使用SystemVerilog,但是任何版本的VHDL或Verilog都是可以接受的。

\$\endgroup\$
1.
  • 1.
    \$\begingroup\$ 建议使用现有的CDC细胞/IP。我们自己在行为层面设计一个,例如,基于mux的同步器有时会被合成器优化,并且仍然会导致亚稳态。 \$\endgroup\$Mitu拉吉 19年12月4日10:05
1.
\$\begingroup\$

传输多位矢量。在并行时,在时钟域之间应该使用异步FIFO。没有其他的解决办法。
试着自己设计一个异步FIFO,你还没有准备好。而是从IP库中选择一个实例。(选择一个具有独立读写时钟的时钟。)

另一种选择是使用单位同步器在时钟域之间逐位传输数据。你说你不想这么做,但这简单多了。(对于同步器,请查找Xilinxxpm_cdc_array_single模块或相关模块疾病控制中心IP块。)

\$\endgroup\$
1.
  • \$\begingroup\$ 我不介意做一点一点的传输。我更好奇的是,是否有一种不那么繁琐和容易出错的编码方法。 \$\endgroup\$圆粒金刚石 12月3日19日18时48分
3.
\$\begingroup\$

FIFO在大多数情况下(如果不是所有情况)都可以工作,但它确实是这个只有多位时钟域交叉的解决方案。由于在您的场景中源数据速率比目标时钟速率低,因此它非常适合于基于握手的系统. 你甚至不需要承认信号。

这篇文章对同步器的主要类型以及它们在什么情况下是合适的有一个合理的解释。当然,您需要计算最坏的情况,以确保在您的特定情况中没有丢失任何数据的机会。

如果你的主要目标是让它尽可能快地工作,那么FIFO是一个很好的工具,但我想指出的是,如果你不得不像我通常那样,努力寻找最精简的解决方案,还有其他的方法。

我不完全理解您的系统,但我想象的是一个来自串行时钟域的信号,它在每次接收完串行字时都会切换,此时串行数据也被锁存到并行寄存器中(同样,在串行时钟域中)。切换信号随后将通过一个简单的双寄存器CDC元素,然后在该元素中向目标时钟域中的边缘检测器馈电。该边缘检测器的输出将是单个时钟脉冲,它将作为目标时钟域中数据寄存器的启用信号,直接从串行时钟域并行数据寄存器锁定数据。假设您的串行字是8位宽的,我认为这应该适用于串行位时钟,几乎是并行时钟的两倍,但是您当然需要验证这一点。

\$\endgroup\$
3.
  • \$\begingroup\$ 对于握手方法,你通常会设置最大延迟的数据被锁存小于目的域的时钟周期乘以移位regg周期的数量用于缓冲在握手位? \$\endgroup\$圆粒金刚石 12月4日19日18时42分
  • \$\begingroup\$ @schadjo看到我的编辑,我希望这是有意义的 \$\endgroup\$scary_jeff 12月5日19日9点15分
  • \$\begingroup\$ 明白了。谢谢! \$\endgroup\$圆粒金刚石 19年12月5日13:28

你的回答

点击“发布您的答案”,您同意我们的建议服务条款,隐私政策cookie策略

不是你想要的答案?浏览已标记的其他问题问你自己的问题.