zedboard如何从PL端控制DDR读写(四)

本文介绍了ZedBoard中DDR内存控制器通过AXI_HP接口与PL端的连接方式及使用建议,涉及不同类型的AXI接口及其特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PS-PL之间的AXI 接口分为三种:
• 通用 AXI(General Purpose AXI) — 一条 32 位数据总线,适合 PL 和 PS 之间的中低速通信。接口是透传的不带缓冲。总共有四个通用接口:两个 PS 做主机,另两个 PL 做主机。
• 加速器一致性端口(Accelerator Coherency Port) — 在 PL 和 APU 内的 SCU之间的单个异步连接,总线宽度为 64 位。这个端口用来实现 APU cache 和 PL的单元之间的一致性。PL 是做主机的。
• 高性能端口(High Performance Ports) — 四个高性能 AXI 接口,带有 FIFO缓冲来提供 “ 批量 ” 读写操作,并支持 PL 和 PS 中的存储器单元的高速率通信。数据宽度是 32 或 64 位,在所有四个接口中 PL 都是做主机的。

即:

从VIVADO的配置中,我们可以看出DDR控制器是通过四个AXI HP连接到PL端的。

再去查阅UG585,里面有一段话是这么说的:

  The four AXI_HP interfaces are multiplexed down, in pairs, and are connected to ports 2 and 3 as
shown in Figure 10-2. These ports are commonly configured for high bandwidth traffic. The path
from these four interfaces to the DDR include two ports on the DDR memory port arbiter. The
interconnect switch arbitrates back-and-forth between each of the two ports. Read and write
channels operate separately. 

大致意思就是说四路HP总线通过M2连接到了片上存储器(貌似是256KB的SRAM,这个与我们现在要做的工作无关,在这里提一嘴是因为后来涉及到对DDR寻址的时候,有一部分地址是连到了这个OCM的,这一部分地址对我们暂时没用,需要避开),另外这四路总线的0和1又通过M0连到了DDR的S3端口,2和3通过M1连到了DDR的S2端口。一般推荐的方法是,同时使用HP0和HP2(或者HP1和HP3),总之就是要使用分离的通道来操作DDR,以获取较高的性能。

 

  从上图我们也可以看到,每个 AXI_HP 接口里都有用做读写通信的 FIFO 缓冲器。在某些 Xilinx 文档中,AXI_HP接口也被叫做 AXI FIFO 接口 (AFI),来表明它们的缓冲能力。AXI_HP 接口的特性包括:
    • 32 或 64 位数据主机接口,每个端口可以独立编程。
    • 对于未对齐的 32 位传输,可以自动扩展传输尺寸从 32 位到 64 位。
    • 写命令的可编程的阈值。
    • 对于所有的 PL-PS 接口的异步时钟频率跨域。
    • 读写 FIFO。
    • 命令和通信数据 FIFO 填充程度计数是 PL 可见的。

 

posted on 2016-07-19 20:29 christ0127 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/christsong/p/5686151.html

PL实现DDR读写操作需要从硬件设计、接口模块开发到测试验证等多个环节进行系统性设计。以下为实现DDR读写操作的基本方法及流程。 ### 3.1 DDR 控制器配置 在FPGA中实现DDR读写操作的第一步是使用Xilinx或Intel(Altera)提供的DDR控制器IP核。例如,在Xilinx平台中可以使用MIG(Memory Interface Generator)工具来生成DDR控制器模块。该模块负责与DDR芯片的物理层进行通信,处理初始化、时序控制、地址映射、数据校验等任务。 - 控制器需配置为特定的DDR标准(如DDR3或DDR4),并设置合适的频率、数据宽度和容量。 - 配置完成后,控制器将提供一组用户接口(User Interface),包括读写请求信号、地址、数据输入输出等,便于后续逻辑模块接入[^1]。 ### 3.2 用户逻辑设计 用户逻辑模块负责与DDR控制器交互,实现数据的写入与取。通常包括以下部分: - **地址生成器**:用于生成写入或取的起始地址及长度。例如,若需连续写入1024个数据,则地址生成器应从0递增到1023。 - **数据生成器**:在写入操作中,可生成特定模式的数据(如递增序列、固定值等)以便后续验证。 - **控制状态机**:实现读写切换、响应检测、错误处理等功能。例如,在写入完成后触发取操作,并根据取结果控制LED状态指示[^2]。 ### 3.3 接口统一与模块封装 为了便于复用和集成,建议将DDR控制器与用户逻辑封装为统一的接口模块。该模块对外提供以下信号: - `wr_en`:写使能信号 - `rd_en`:使能信号 - `addr`:地址总线 - `wdata`:写入数据 - `rdata`:取数据 - `done`:操作完成标志 - `error`:错误标志 通过统一接口,可以简化上层逻辑对DDR的访问方式,提高系统的模块化程度。 ### 3.4 板级验证与调试 在实际板卡中进行功能与性能验证是DDR读写实现的关键步骤: - **功能验证**:通过写入预设数据并回比对,验证数据完整性。例如,写入1024个递增数据后回,若全部正确则点亮LED1,否则闪烁[^2]。 - **性能测试**:测量读写带宽与延迟,确保满足系统需求。例如,DDR4-3200的理论带宽为25.6 GB/s,应通过实际测试验证是否接近该值[^3]。 - **稳定性测试**:长时间运行读写操作,观察是否出现误码或时序问题,尤其是在高频运行条件下。 ### 3.5 示例代码(Verilog) 以下为一个简单的DDR读写控制状态机示例: ```verilog module ddr_rw_ctrl( input clk, input rst_n, output reg wr_en, output reg rd_en, output reg [27:0] addr, input done, output reg [3:0] led ); parameter IDLE = 2'd0, WRITE = 2'd1, READ = 2'd2, CHECK = 2'd3; reg [1:0] state; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin state <= IDLE; wr_en <= 1'b0; rd_en <= 1'b0; addr <= 0; led <= 4'b0000; end else begin case(state) IDLE: begin if(start_write) begin state <= WRITE; wr_en <= 1'b1; addr <= 0; end end WRITE: begin if(addr == 1023) begin wr_en <= 1'b0; state <= READ; rd_en <= 1'b1; addr <= 0; end else begin addr <= addr + 1; end end READ: begin if(addr == 1023) begin rd_en <= 1'b0; state <= CHECK; end else begin addr <= addr + 1; end end CHECK: begin if(data_valid) begin led[0] <= 1'b1; end else begin led[0] <= 1'b0; end state <= IDLE; end endcase end end endmodule ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值