基于FPGA SDRAM的AXIS_SDRAM接口设计与实现

2020-07-14 18:27李浩申伟
科技创新导报 2020年11期

李浩 申伟

摘   要:由于FPGA片内存储资源有限,扩展外部存储空间是必要的,然而众多存储芯片总线结构复杂,控制繁琐。为此,本文以赛灵思的FPGA为平台,设计一种以常用而快捷的axi_stream的形式访问SDRAM的接口。

关键词:FPGA  SDRAM  AXIS  FIFO  BRAM

随着芯片的不断更新换代,集成ARM核的FPGA芯片得到了广泛的应用[1]。axi的总线协议在FPGA里面应用也越来越广。axi_stream协议为axi的一种总线标准。本文将采用axi_stream的时序以fifo与bram的形式访问SDRAM的设计与实现方法。

1  axis_sdram接口

本文將axis_sdram接口分为两种,不带地址的axis_fifo_sdram(下文简称axis_fifo)和带地址的axis_bram_sdram(下文简称axis_bram)接口。两种接口均采用axis_stream的时序。axis_bram接口为一个地址对应一帧数据,可重复读取数据。与axis_fifo的区别在于axis_bram写指定存储空间,当用户需要读写数据时,需要同时给出读写地址总线地址数据。

axis_fifo和bram接口的读写数据共同点在于,当ready与valid两根信号线同时有效(高电平)时,数据总线上的数据才有效。此外,axis_bram中,当用户写完一帧数据后,等待监测m_axis_tlast3信号线拉高,可以开始写第二帧数据,具体时序见图 1。读用户监测到m_axis_tlast3信号拉高时,说明底层sdram已经存储好写用户的一帧数据,此时读用户将读地址使能信号拉高一段时间,同时给出读地址总线数据,后读地址使能信号拉低,至此,用户监测到读数据侧的axis_last拉高,完成一帧数据读写。

2  sdram接口

此sdram存储空间为256Mb,数据位宽为32位,速率等级有-5、-6、-7三个等级,最高时钟频率为200MHz。Bank数量为4,行地址位宽为12bit,列地址复用行地址的低位9bit。控制逻辑采样状态机的形式,首先状态机设置为初始化状态,初始化主要是芯片上电后首先执行的操作。首先执行空操作,再延时100us,进行预充电操作,紧接着两次自刷新操作,进入模式寄存器配置,初始化完成。模式寄存器配置过程中,首先cmd给模式寄存器配置指令,通过给12bit地址总线信号设置操作模式、突发模式、潜伏期、突发传输方式以及全页突发设置。

初始化完成后,状态机进入刷新、预充电状态,给写指令进入写数据状态机,给读指令进入读数据状态机。

3  axis与sdram底层接口

将sdram四个bank分成两个存储空间,bank0、bank1作为axis_fifo的存储空间,bank2、bank3作为axis_bram的存储空间。由于axis_fifo与axis_bram两种接口访问同一块物理存储芯片,所以逻辑设置优先级与新增标志信号控制时序。

此部分控制逻辑采用状态机循环监测标志信号状态以判断对底层sdram的操作。状态机流程见图2,首先,状态机检测axis_fifo缓冲器里面是否有数据,如果有数据,状态机检测sdram存储是否写满,如果没有,状态机将状态设置为axis_fifo向sdram写数据状态。如果axis_fifo里面没有数据或者sdram的剩余存储空间不足以写一帧数据,那么状态机将进入中断axis_fifo写状态,进入等待状态,底层sdram会进入中断等待定时刷新状态。

当状态机检测到axis_fifo缓冲器数据last信号后,识别为一帧数据传输结束,状态机也将跳到中断等待状态,状态机会依次监测axis_fifo写使能、axis_fifo读使能,axis_bram写使能、axis_bram读使能。检测到其中一个使能信号将进入对应状态机操作,执行对sdram进一步控制。

此部分涉及到last信号传递、读写数据sdram地址数据的记忆以及时序逻辑采样延时导致信号时序不同步的问题。sdram地址记忆采用fifo ip和单口bram ip存储写数据时最后一帧数据last信号的地址,地址采用bank+row+column的形式。当读取sdram的数据时,检测到读数据的地址与fifo ip或者bram ip数据总线上的数据一致时,则判断为一帧数据的结束,底层sdram接口产生读数据端的last信号。由于axis的使能信号采用时序逻辑采样传递到底层sdram接口,会有两个时钟周期的延迟,因此,axis接口的数据采用D触发器延迟两拍传递到sdram,为更快的更新信号状态,ready信号采用组合逻辑。

4  接口测试

测试方法分别向两种接口下发测试数据,再读取数据进行效验(见图3、图4)。测试数据通过编写测试逻辑产生。向axis_fifo_sdram接口下发1、2、3…10000,10000个寄存器数据,数据拆分为9帧数据,后通过axis_fifo接口读回来效验。向axis_bram接口固定地址写一帧数据,读回来效验。效验方法为,定义一个出错数据寄存器(cnt_erro_fifo、cnt_erro_bram),如果数据出错,cnt_erro_fifo或者cnt_erro_bram会进行累加。

测试结果:错误数据计数器为0,last信号正确传递。

5  结语

随着科技的发展,知识体系越来越庞大。在FPGA应用设计中,利用IP CORE可以大大节约FPGA工程师开发的周期。对于没有IP CORE资源的,用户进行自定义IP设计是必要的。本文主要进行了一种物理存储芯片SDRAM的二次封装,以更简洁更实用的方式建立用户接口,以便用户快速访问外部SDRAM存储器。

参考文献

[1] 齐佳硕,王洪岩.基于FPGA的SDRAM接口设计及实现[J].电子测量技术,2018(19):141-144.