Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

参考思路 #2

Open
Tankid1412 opened this issue Mar 10, 2024 · 1 comment
Open

参考思路 #2

Tankid1412 opened this issue Mar 10, 2024 · 1 comment

Comments

@Tankid1412
Copy link

你好!我是一名SoC初学者:)
最近我正好需要通过高云的ddr3控制ip设计一个axi接口的ddr控制器,然后挂在我的总线上与软核进行数据交互,但是软核的时钟频率相对于ddr3时钟或控制ip的clkout来说太低了,无法同步,所以我想参考一下这个项目是如何解决这个问题的。(没学过spinl,看不懂源码)谢谢!

@Angelic47
Copy link
Member

Angelic47 commented Mar 11, 2024

您好:
首先,感谢您对本项目的关注!

观察高云的DDR3控制器IP核pdf文档,其实可以发现高云的IP核接受两路clk输入,一路主clk,一路内存clk。其中内存clk即为高云DDR3 IP核发往DDR3颗粒的高速信号,通常 >= 400MHz (1:4模式下)。
需要注意的是,根据pdf文档,内存clk必须是与主clk的同一个PLL的clkout2接口输出出来的。看得出,这里因为信号速度较高,高云对时钟的发生有一定要求。
与此同时,高云的IP核还输出了一路clkout,根据pdf文档,这一路信号用于“用户设计逻辑”。我猜测,这可能是为了时钟域一致,高云DDR3 IP内部的时钟可能较为混乱。

我们的项目的确遵守了这个pdf。
在我们的项目当中,我们提供了一路主clk,输入到高云的IP核当中Paski_GowinDDR_AXI4.scala#L43
同时也根据pdf文档,提供了一路内存clk,输入到高云的IP核当中Paski_GowinDDR_AXI4.scala#L44
根据高云的pdf文档,我们的控制逻辑也确实使用了高云的clkout时钟Paski_GowinDDR_AXI4.scala#L54进行设计。这部分逻辑直接与高云的DDR3 IP核进行通讯,作为一部分中间逻辑,负责在外部逻辑、高云自己的IP逻辑之间转发交换数据。

这里最关键的问题是,就是您现在正在考虑的问题:如果完全使用高云的clkout时钟进行逻辑设计,那么想必整个FPGA结构将受到严重的时钟结构限制。
因此我们必然要考虑跨时钟域处理。众所周知跨时钟域可以有多种方法,在我们的项目里,我们使用了两路跨时钟域fifo (StreamFifoCC):Paski_GowinDDR_AXI4.scala#L52-L63
这样设计之后,AXI发来的请求命令会进入到fifo当中,后面的逻辑进行读取;而后面的逻辑产生的响应也会进入到响应fifo当中,由AXI总线再发往外部。
这样一来就解决了这个跨时钟域的问题,高云的clkout完全和外部逻辑隔离,不会被迫整个项目设计都参考高云的clkout。

祝您研究顺利!如果有任何其他疑惑,欢迎回复这个issue告诉我。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants