基于ise14.7中的cmd设计

基于ise14.7中的cmd设计

DDR3_IP #(
.C3_P0_MASK_SIZE (16 ),
.C3_P0_DATA_PORT_SIZE (128 ),
.C3_MEMCLK_PERIOD ( 3000 ),
.C3_RST_ACT_LOW ( 1 ),
.C3_INPUT_CLK_TYPE ( “SINGLE_ENDED” ),
.DEBUG_EN ( 0 ),
.C3_MEM_ADDR_ORDER ( “BANK_ROW_COLUMN” ),
.C3_NUM_DQ_PINS ( 16 ),
.C3_MEM_ADDR_WIDTH ( 13 ),
.C3_MEM_BANKADDR_WIDTH ( 3 ),
.C3_SIMULATION ( “TRUE” ),
.C3_CALIB_SOFT_IP ( “TRUE” )
)

DDR3_IP_inst (
.c3_sys_clk (c3_sys_clk ),
.c3_sys_rst_i (c3_sys_rst_i),
.mcb3_dram_dq (mcb3_dram_dq),
.mcb3_dram_a (mcb3_dram_a),
.mcb3_dram_ba (mcb3_dram_ba),
.mcb3_dram_ras_n (mcb3_dram_ras_n),
.mcb3_dram_cas_n (mcb3_dram_cas_n),
.mcb3_dram_we_n (mcb3_dram_we_n),
.mcb3_dram_odt (mcb3_dram_odt),
.mcb3_dram_cke (mcb3_dram_cke),
.mcb3_dram_ck (mcb3_dram_ck),
.mcb3_dram_ck_n (mcb3_dram_ck_n),
.mcb3_dram_dqs (mcb3_dram_dqs),
.mcb3_dram_dqs_n (mcb3_dram_dqs_n),
.mcb3_dram_udqs (mcb3_dram_udqs),
.mcb3_dram_udqs_n (mcb3_dram_udqs_n),
.mcb3_dram_udm (mcb3_dram_udm),
.mcb3_dram_dm (mcb3_dram_dm),
.mcb3_dram_reset_n (mcb3_dram_reset_n),
.c3_clk0 ( clk_100m ),
.c3_rst0 ( c3_rst0 ),
.c3_calib_done (c3_calib_done),

.mcb3_rzq (mcb3_rzq),
.mcb3_zio (mcb3_zio),

.c3_p0_cmd_clk //为cmd的时钟
.c3_p0_cmd_en //为mcb的控制使能信号,为高有效
.c3_p0_cmd_instr //mcb控制信号,一般为读\写命令
.c3_p0_cmd_bl //读\写地址的深度,注:已设定数据宽度为基础,表示写入多少数据
.c3_p0_cmd_byte_addr //起始地址
.c3_p0_cmd_empty //为空标志,cmd中无任何数据
.c3_p0_cmd_full //为满标志,cmd中无法在进行塞数据

.c3_p0_wr_clk //写时钟
.c3_p0_wr_en //写使能
.c3_p0_wr_mask //不需要进行设置,直接悬空
.c3_p0_wr_data //写数据
.c3_p0_wr_full //写满标志
.c3_p0_wr_empty //空标志 ,为高时,可以进行读数据
.c3_p0_wr_count //写数据计数,做参考,该值与写使能异步
.c3_p0_wr_underrun //写满数据,溢出
.c3_p0_wr_error //写错标志

.c3_p0_rd_clk //读时钟
.c3_p0_rd_en //读使能
.c3_p0_rd_data //读数据
.c3_p0_rd_full //读满标志
.c3_p0_rd_empty //读空标志,其为低时,说明有数据可以开始进行读数据
.c3_p0_rd_count //读计数值,该值与使能异步,只能做参考
.c3_p0_rd_overflow //读完标志,在进行读,则会出错
.c3_p0_rd_error //读错标志
);

Cmd写命令时序
在这里插入图片描述

可以看到这个部分主要是命名的写时序,当 px_cmd_en(p0_cmd_en 代表 p0 端
口的一组操作指令,一个 MCB 控制器最多可以设置 4 个端口,一般笔者为了实
现最大带宽只设置一个端口 p0 并且把位宽设置为 128bit)高电平持续一个
px_cmd_clk 时 钟 周 期 , 就 能 进 行 一 条 写 命 令 指 令 。 指 令 的 形 式 是 通 过
px_cmd_instr 来制定的,一般常用的是读、写指令。当这条指令有效后,MCB 可
以和 DDR3 物理芯片之间进行数据的交换。px_cmd_bl 是这只了一次读写的深
度,比如当 px_cmd_bl=63 ,MCB 的位宽设置为 128bit 那么每发送一条读或者写
指令,可以从 DDR3 读或者往 DDR3 写 128X64=1KB 数据。px_cmd_byte_addr 指
出了数据的读后者写起始地址,之后地址会自动增加,比如一次写 128X64 的数
据,本次操作的起始地址 px_cmd_byte_addr 为 0,那么读或者写完后,结束地
址为 1023,下次的读或者写地址应当为 1024。可以看出这里的地址空间是以
BYTE(8bit)来计算的。px_cmd_empty 和 px_cmd_full 指示了当前指令 FIFO 的状
态情况,最多可以缓冲 3 条指令。

先进行写命令,激活写操作,在进行下面的写时序:
在这里插入图片描述

px_wr_clk:为MCB 系统时钟
px_wr_en:为MCB 写FIFO 使能标准,高电平期间,每一个时钟的上升沿写入FIFO一个数据
px_wr_mask[3:0]: MCB 写FIFO 屏蔽控制
px_wr_empy:MCB 写FIFO 空
px_wr_full:MCB 写FIFO 满
px_wr_underrun:MCB 写FIFO 溢出
px_wr_count[6:0]:MCB 写 FIFO 中写入的数据个数,这个计数器只能大概评估,并不精确

通过 MCB 操作 DDR 数据并不是立马就发送给 DDR 芯片,而是先经过 MCB 的 FIFO。为
了实现数据写入 DDR 物理芯片,我们首先需要把数据写入 MCB 的写 FIFO.px_wr_en 为高电
平期间,每个 px_wr_clk 上升沿写入一个数据到 MCB 的写 FIFO 中。当写 FIFO 没有数据的
时候 px_wr_empy 为高电平,当 MCB FIFO 满的时候 px_wr_full 为高电平,应该避免
px_wr_full 信号有效。px_wr_underrun:说明 FIFO 已经溢出了。px_wr_count 指示了当前
写入 FIFO 的数据个数。由于 FIFO 存在操作的延迟,而且是异步操作 px_wr_count 并不能
实时真确显示当前写入 FIFO 的数据格式。但是,我们是可以依据此计数器大概评估的。比
如可以评估写入 FIFO 的速度,和 DDR 物理芯片从 FIFO 取数据的速度。比如当我们设置
px_cmd_bl 为 63 即 FIFO 深度为 64,我们并不需要等 FIFO 写满才启动写操作命名,比如我
们可以在 px_wr_count 为 40 的时候就启动写操作命令。这样可以提高内存的使用率。具体
可以参考本章节的代码处理方式,读者可以好好研究下其中的技巧。

先进行激活读命令,在进行读取FIFO的值
读命令激活:
在这里插入图片描述

当读命令发出之后,数据会被从 DDR3 读入 FPGA 内部的 FIFO,当检测到 FIFO 有
数据(非空)事,就启动读:
在这里插入图片描述

px_rd_clk:为 MCB 系统时钟
px_rd_en:为 MCB 读 FIFO 使能标准,高电平期间,每一个时钟的上升沿读入 FIFO 一个数据
px_rd_empy:MCB 读 FIFO 空
px_rd_full:MCB 读 FIFO 满
px_rd_underrun:MCB 读 FIFO 没有数据了却还在读,导致的错误
px_rd_count[6:0]:MCB 读 FIFO 中读入的数据个数,这个计数器只能大概评估,并不精确
同样,如果需要从 DDR 物理芯片读取数据也不是立马可以读到而是必须经过
MCB 的读 FIFO。数据线存放到读 FIFO 之后才可以开始读。再读 FIFO 之前,必
须先进行一次读 DDR 的指令,先把数据从 DDR 物理芯片搬运到 CMB 内存中。
当 px_rd_empy 低电平的时候,代表 FIFO 非空,这个时候就可以读了,当
px_rd_empy 为高电平代码读 FIFO 为空这个时候不能读 MCB 的 FIFO。px_rd_en
为高电平,每一个 px_rd_clk 的上升沿,可以从 MCB 读 FIFO 读取出一个数据。
px_rd_full 代表读 FIFO 填满了数据。px_rd_underrun 代表 FIFO 没有数据了,还
再读产生的错误。px_rd_count 可以大概评估读 FIFO 数据,比如当我们检测到
px_rd_count 大于 40 的时候就开始从读 FIFO 读数据,这样可以最大化提高 DDR
的带宽使用率。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值