一、Hyperam没简介
就是一个多路高速大号掉电易失Spi Flash,主要特点就是一个小封装和低功耗,具体的芯片的接口协议没研究,基本上每家FPGA或者MCU公司建议用hyperram的,都会有对应的控制器 ,直接搞控制器就行。
二、硬件设计
原理图设计没啥说的 ,正常链接管脚就行,400M的线速度 ,做好等长就行;
这是HyperRAM的上电和掉电过程
三.Interface Designer 设计
对于Ti60F100 来说 ,IC里面集成了hyperam 所以在interface design里面直接例化就行 ;
对于其他芯片来说 ,参考对应Ti60F225的实例工程,直接copy 对应的 IO管脚 ,interface 里面导出导入;input output inout 只需要根据自己实际硬件设计,关联好对应的pad就行;
四、代码定义
如果你用了AXI3接口 ,建议将这些参数提到顶层,方便实际用起来修改
//Hyeperram Signal
#(
`ifndef EFX_IPM
parameter AXI_DBW = 128, // AXI位宽 根据你的需求来
parameter AXI_SBW = AXI_DBW/8,
`endif
parameter AWR_LEN = 63,
parameter TOP_DBW = 16 // 实际hyperram的位宽
)
input wire clk, // PLL 输出给到逻辑 一般100M就行
input wire hbramClk, // PLL-OUT到逻辑 和控制器的参数设置给的一样即可 一般选择200M 250M不推荐
input wire hbramClk_cal, // 和hbramClk 90度相位差
input wire hbramClk_pll_locked,// PLL稳定信号后,IP再工作不迟
output wire hbramClk_pll_rstn, // 复位低有效
// =============== PLL Phase Settings ======================
output wire [2:0] hbc_cal_SHIFT, // 动态校准PLL的,流程可参考笔者其他工程
output wire [4:0] hbc_cal_SHIFT_SEL, // 动态校准PLL的,流程可参考笔者其他工程
output wire hbc_cal_SHIFT_ENA, // 动态校准PLL的,流程可参考笔者其他工程
// =============== HBRAM Related Signals ===================
output wire hbc_rst_n, //下面就是Hyperram的接口
output wire hbc_cs_n,
output wire hbc_ck_p_HI,
output wire hbc_ck_p_LO,
output wire hbc_ck_n_HI,
output wire hbc_ck_n_LO,
output wire [TOP_DBW/8-1:0] hbc_rwds_OUT_HI,
output wire [TOP_DBW/8-1:0] hbc_rwds_OUT_LO,
input wire [TOP_DBW/8-1:0] hbc_rwds_IN_HI,
input wire [TOP_DBW/8-1:0] hbc_rwds_IN_LO,
input wire [TOP_DBW-1:0] hbc_dq_IN_LO,
input wire [TOP_DBW-1:0] hbc_dq_IN_HI,
output wire [TOP_DBW/8-1:0] hbc_rwds_OE,
output wire [TOP_DBW-1:0] hbc_dq_OUT_HI,
output wire [TOP_DBW-1:0] hbc_dq_OUT_LO,
output wire [TOP_DBW-1:0] hbc_dq_OE,
如图所示 ,笔者通常将控制器的IP 直接加到工程中 ,修改红色框中的参数,比如频率,突发个数,突发模式等 ,方便各个平台移植 ,不用考虑软件兼容问题;
下图是控制器例化的文件,在IP 管理器里面生成 Hyperram Controller ,对应的IP文件夹底下直接copy;
逻辑端和Controller 的连接方式有两种 ,常见的Native 接口 和 AXI3接口 ;我们推荐Native ,主打的就是一个简单好上手。
红色是时钟 IP核的时钟一般给200M 和200M@90度 ;
绿色是逻辑和 通过和interface designer锁定,与实际物理上HyperRAM互相连接的管脚
黄色部分是用户逻辑和控制器相连接的Native 地址和数据接口;
官方的hyperram读写 实际回环测验控制器的数据流 是AXI3接口的,笔者觉得麻烦没怎么用;
下面是自己根据用户端接口,自己做了个读写的回环测验:
Native 的 读时序:
Native 的 写时序:
其他
-
首先要找FAE要 HyperRAM Controller CoreUser Guide 。 基本上所有的IO说明,设计注意事项里面都有提;
-
Native模式下 ,读写FIFO的深度设置 ,根据公式:
Write FIFO Depth Size = ((DQ Width * 2)/ Data width) * native_ram_burst_len -
如上图所示,笔者给的数据就是32bit的,F225和F100的hyperram接口是16bit的,所以我一次突发写FIFO的个数最少是256 ,所以深度我就是256个;
-
按照32bit ,256个突发 ,这一次我给的地址是000000h ,下一次写的地址 我就给 002000h;
-
native 模式下的HyperRAM只能采用linear模式,必须要把
native_ram_address[31] 这一根地址线一直拉高; -
官方的例程里面 PLL会正式工作前,会有一个自动校准的调相功能,直接copy就行了;
-
手册里面没有AXI3的时序;
-
有需要我补充的不吝赐教,我再补充更新。