1 DDR3读写IP核设计(PS为Slave,PL为Master)
- 通过自定义一个 AXI4 接口的 IP 核,
通过 AXI_HP 接口对 PS 端 DDR3 进行读写测试
,DDR3 Test 是我们自定义的 IP 核,具有 AXI4 Master 端口,该端口通过 AXI Smartconnect模块,最终连接到 PS 端的 S_AXI_HP0 端口。 - 输入的按键控制 DDR3 Test 模块对 PS 的 DDR3 进行读写测试,并在读写测试结束后,通过两个PL LED灯分别指示读写完成和读写错误。
- S_AXI_HP0 是 PS 端的 AXI 高性能接口,它是一个从接口,连接到 PS 内的存储器互联,用于 PL 访问 PS 内的存储设备,包括 OCM 和 DDR。在本次实验中,我们在 PL 内自定义的 DDR3 Test IP 核作为主设备,通过 PS AXI_HP0 接口,与 DDR 控制器进行通信,最终对 DDR3 存储器进行读写操作。
1.1 协议简述(PL读取PS端DDR3 SDRAM)
(PL为Master,PS为Slave)
- 创建 Vivado 工程
- 在“Add Interfaces”界面中修改接口名称为“
M_AXI
”,选择接口类型为“Full
”,接口模式为“Master
”
- 添加完自定义 IP 核之后,双击该 IP 核对其进行配置,将变量
C M AXI TARGET SLAVE BASE ADDR
的值修改为 0x1000_0000,它位于 DDR3 存储器的地址空间,是 AXI4_RW_TEST IP 核进行读写操作的起始地址。我们将该地址之前的存储空间预留下来,用于运行 PS 中的软件程序。
1.2 DDR3读写顶层IP模块,内部例化AXI协议模块
2 AXI协议模块分析
2.1 突发读写详解
2.1.1.1 write_index(一次突发完成标志)
C_M_AXI_BURST_LEN表示是一次突发的需要多少个C_M_AXI_DATA_WIDTH(默认32bit)
,是以C_M_AXI_DATA_WIDTH为单位的,即:一次突发要传输C_M_AXI_BURST_LEN*C_M_AXI_DATA_WIDTH
位- 例如:C_M_AXI_BURST_LEN=16,C_M_AXI_DATA_WIDTH=32,则一次突发传输字节数为:16*32/8=64字节`
- 一次突发需要多少bit位,用n来表示:C_TRANSACTIONS_NUM=4,2^n=16
,当4个bit位满时,一次突发完成
2.1.1.2 write_burst_counter(读写4K字节完成标志)
C_NO_BURSTS_REQ表示:若要传输4K字节,即2^12bytes,总共需要多次突发数量为:2^12/(16*32/8)
- 检查4K字节是否传输完成
- AXi协议定义REG变量
2.2 init_txn_pulse启动触发
2.3 状态机
2.4 Write Address
- axi_awvalid/axi_awaddr
2.5 Write Data(PL向PS端DDR3 SDRAM写入数据)(PL为Master,PS为Slave)
2.6 Write LAST(突发读写axi_wvalid一直拉高,直到Write LAST信号出现后拉低)
2.7 Read Data(PL读取PS端DDR3 SDRAM数据)(PL为Master,PS为Slave)
- Read Address Channel
(PL读取PS端DDR3 SDRAM)(PL为Master,PS为Slave)
- Read Data
3 SDK设计
- PL向PS端DDR3 SDRAM写入数据(PL为Master,PS为Slave)`