国产安路FPGA使用——最精简化内置SDRAM控制器例程。更新测试数据:SDRAM时钟提前2.6ns基本解决SDRAM问题
本帖最后由 wye11083 于 2020-7-4 18:26 编辑input clk_i,
input rst_i,
input clk2x_i, // Read clock should be tested. Since all IOs use IODDR, the timing is relatively fixed.
注意时序问题。根据估计,安路的ODDR到OPAD再到SDRAM再到DQ再到IDDR总路径估计有~5ns左右,不算上SDRAM的Output Hold的话起码也得有3.5ns。
实际使用时,clk_i和clk2x_i请对齐,因为SDRAM的clk是下降沿出1,这样就构成了1:2的SDRAM控制器。安路的内核效率不咋的,高频上不去,因此这样设计不太影响有效的带宽。
模块实际工作在74.25MHz,clk2x_i为148.5MHz,此时从SDRAM的clk到DQ的延迟最大有3.36ns,实际估计可能会稍微吃掉一点SDRAM的Output Hold。如果要提高频率,则需要把clk2x_i往前提一点,以避免Setup Time不足造成读数据错误。
此外,安路的工具链似乎不太稳定,工程改一个地方都有可能造成SDRAM崩溃,第1个Burst的最低字节始终是错的。目前也没有找到原因,遇到这种情况直接打开LPF_SDRAMULPController,把DEBUG_DDR_TRP改一下,为1或2,一般都能解决SDRAM出错的问题。国产就是这样,总会有点小毛病不太顺,但是基本上能用。
模块为标准AXI4接口,但是很多特性都不支持。模块不区分4KB边界,但是为防万一,建议外面手动加上4K边界,避免移植出现问题。已知Xilinx官方IP会在4K边界上出错。模块仅支持BRAM接口,要求输入输出ready或valid均为恒1,没有内置FIFO,不支持传输阻塞。
模块为最精简化控制器,是不包含打开的页地址记录的。也即,每次操作都是一次全新的操作,控制器会自动进行ACT-RW-PRE的操作。因此对于小的Burst会带来严重的效率损失。对连续地址短Burst有需求的则需要自己去增加Opened Bank管理了。同理,AXI总线也会带来最大2个周期的延迟,不支持流水线操作,每次只能响应一条指令,对目前我的应用需求来说可以满足。想要追求极致效率的可以自己研究高性能控制器。给个思路:用一堆Bank Machine去管理读写指令,由每个Bank Machine去管理映射到它的指令,用id实现无缝交替传输。
此外,注意一下安路的工具链时序分析似乎有bug,生成的时序比实际时序要多出~2ns,比如设置10ns,工具链实际是按~12ns去布线,没有找到原因,且安路FAE似乎也没有解释原因。实际使用时需要手动缩短时序以避免出现意外情况。实测片内逻辑最高可跑到~150MHz的主频(只能留出来5%的时序余量,而且需要极度流水线化,就像Intel的Prescott处理器一样拼命加深流水线),实用主频不超过100MHz。
根据最新测试结果,当SDRAM时钟提前2.666ns时,读时序bug基本消失(多次未复现)。因此推算安路FPGA的输出buffer延迟应在2~2.5ns之间,输入buffer延迟应在0.5~1ns之间,总延迟在2.5~3.5ns左右。因此,clk2x_i需要向后延长一点时间或向前提一点时间,使clk2x的下降沿到clk_i的两个边沿延迟在2.666ns~2.75ns之间,理论上可以达成完美读写。
当前工程综合资源占用率不到50%,理论上EG4S20共有19600个LUT,但是它有一半是LUT5,因此折合29400个LUT4,19600个DFF,64个1Kx9的RAM,16个4Kx8的RAM,资源量已经明显超过XC6SLX25了。当然主频是个很大的bug,一个模块为了跑到150MHz内部所有信号全部做了深度流水线。综合性能约为Spartan-6的50%~65%。欢迎大家都来搞国产FPGA{:lol:} 楼主说的这些坑都踩过,有时候改一个低频时钟域的赋值语句,会导致主时钟域最高工作频率降20%,真是隔山打牛啊。
话说楼主对SDRAM的操作最快能到标称的200MHz吗?我这边费尽洪荒之力也只能到133MHz Nuker 发表于 2020-7-2 17:12
楼主说的这些坑都踩过,有时候改一个低频时钟域的赋值语句,会导致主时钟域最高工作频率降20%,真是隔山打 ...
问题不大。我估计你肯定是1:1模式,能干到133m已经吊炸天了(但是我怕你时钟约束没处理,它实际按100m给你布的)。
我这1:2内核频率才区区75mhz,clk2x是sdram时钟,148m。就算到200m跑起来还是轻轻松松的,因为内核只跑一半啊,64位。你还可以用oddrx2继续怼,1:4,这样跑到400mhz都问题不大(此时sdram估计已经跑断腿了。。)。
低速的模块我一大堆都没出一个bug,高速就不行了,估计安路的优化器不太稳定,时序比较紧的模块可能被错误优化造成某些地方不太稳,或者是它的ram等地方有不太稳定,总之现象很奇怪,就只有sdram的第一个burst的最低字节是错的,遇到这种情况改一下trp就好了。我就1和2来回改啊改。。我用xilinx这么多年都没遇到过安路这种奇怪bug。 是1:1模式,时钟有约束,采用双时钟方式,有效相位窗口很小 楼主牛人 什么都会的样子 芯片如何购买?开发资料从哪获取? 安路的工具链是要 license 还是可以免费用? 免费的,还行 atommann 发表于 2020-7-2 22:26
安路的工具链是要 license 还是可以免费用?
安路的工具包含半年license gui401 发表于 2020-7-2 22:18
芯片如何购买?开发资料从哪获取?
找FAE,代理商等等。资料也找他们要。但是安路目前的资料不多,而且很多信息都没有,比如IO的延时。 手里有个EG4S20开发板一直吃灰{:sweat:} 楼主,您有安路的EG4S20的SDRAM完整官方例程吗?
能否分享一下,谢谢啦 DOER 发表于 2020-7-31 16:29
楼主,您有安路的EG4S20的SDRAM完整官方例程吗?
能否分享一下,谢谢啦
没有。我提供的ip可以直接用,把时钟配好即可。 我用的高云FPGA, 内置SDRAM时钟是跑的是148MHZ, 32bit,长时间没问题,但是再高,到160MHZ,有点悬,200MHZ基本没戏 orta1986 发表于 2020-10-11 09:56
我用的高云FPGA, 内置SDRAM时钟是跑的是148MHZ, 32bit,长时间没问题,但是再高,到160MHZ,有点悬,200MH ...
兄弟,你要仔细检查时序。安路的综合器综合的时序是有问题的,必须要手动给够余量。还有,安路默认给的是drive=8,slew=fast,148.5m只是我hdmi频率的2倍。你可以看看高云给的多少。此外就是burst了,建议内核跑半频,这样高速端压力不大,低速端使用2倍位宽压力也不大。你要是1:1怼高频那fpga就要吃翔了 Nuker 发表于 2020-7-2 17:12
楼主说的这些坑都踩过,有时候改一个低频时钟域的赋值语句,会导致主时钟域最高工作频率降20%,真是隔山打 ...
(引用自2楼)
请问安路FPGA您还在使用吗,500K采集与SD存储,有做过吗,可以合作。 大神两年前就开始用国产安路了,我之前帖子提到的500K采样然后高速存储,有时间做吗? HZKJ 发表于 2022-12-15 14:49
请问安路FPGA您还在使用吗,500K采集与SD存储,有做过吗,可以合作。
(引用自16楼)
sd没有用过,这个效率不好提高。500k你随便找个mcu就搞定了的。。上fpga大材小用了。我们都是单fpga挂多路高分sensor做一些前处理+图像采集用的。 wye11083 发表于 2022-12-15 15:10
sd没有用过,这个效率不好提高。500k你随便找个mcu就搞定了的。。上fpga大材小用了。我们都是单fpga挂多 ...
(引用自18楼)
MCU实时性不太好,高速连续存储感觉不可靠。
生产成本高点可以接受,所以选FPGA
您看用其他存储芯片好做吗,1G字节就够了。 HZKJ 发表于 2022-12-15 15:37
MCU实时性不太好,高速连续存储感觉不可靠。
生产成本高点可以接受,所以选FPGA
您看用其他存储芯片好做 ...
(引用自19楼)
fpga做复杂任务真不如mcu。。你找个fifo芯片,就不用实时了。 wye11083 发表于 2022-12-15 15:40
fpga做复杂任务真不如mcu。。你找个fifo芯片,就不用实时了。
(引用自20楼)
目前的思路是用芯片内部的容量RAM做双缓存,但是速度还是跟不上。
大神能加个微信吗,方便的时候留言请教,也方便给您发红包。HZKJ6688
页:
[1]