memory control模块设计及验证2

编程入门 行业动态 更新时间:2024-10-11 09:27:08

memory control<a href=https://www.elefans.com/category/jswz/34/1771428.html style=模块设计及验证2"/>

memory control模块设计及验证2

3.arraay_ctrl module

3.1 function description

此模块实现了array的read/write/refresh的控制,其接口完成了内部frame向array interface之间的转化。

3.2 feature list

(1)支持array接口的时序参数可配置;

(2)支持刷新周期可配置;

3.3 block diagram

3.4 interface description

signal name

width

Direction

Description

global signal

clk

1

input

clk

rst_n

1

input

rst_n

internal frame interface

axi2array_frame_valid

1

input

valid flag for sending write data to array

array2axi_frame_ready

1

output

array ready to accept axi_ alave data flag

axi2array_frame_data

89

input

[5:0]column addr,

[21:6]row addr,

[85:22]wdata,

[86]read/write,

[87]sof,

[88]eof

array2axi_valid

1

output

valid flag for accept read data from array

array2axi_rdata

64

output

rdata

apb config signal

mc_en

1

input

memory control enable signal

array_ trcd_wr

8

input

trcd_wr

array_ twr

8

input

twr

array_ trcd_rd

8

input

trcd_rd

array_trtp

8

input

trtp

array_trp

8

input

trp

array_tras

8

input

tras

array_trc

8

input

trc

array_period1

8

input

refresh period1

array_period2

8

input

refresh period2

array_sel

1

input

period single

array interface

array_cs_n

1

output

cs

array_raddr

16

output

row addr

array_caddr_vld_wr

1

output

write address clk

array_caddr_wr

6

output

column address for write

array_caddr_vld_rd

1

output

read clk

array_caddr_rd

6

output

read address clk

array_wdata_vld

1

output

write data clk

array_wdata

64

output

write data

array_rdata_vld

1

input

read data clk

array_rdata

64

input

read data

3.5 array_state_ctrl

3.5.1 功能描述:

根据接收的frame格数数据和内部刷新计数器确定是进入写状态、读状态、刷新状态。

3.5.2实现机制

在array和axi_slave握手成功的时候根据输入数据的读写有效位进入读状态还是写状态,输入的数据不仅需要输入给array_state_ctrl还要输入array_wr/array_rd/array_refresh模块,array_state_ctrl模块的状态机跳转信号还需要输入给array_mux模块用于输出的选择。

3.5.3 状态机描述:

1.idle状态的跳转(默认状态):

write_flag: axi2array_frame_valid和array2axi_frame_ready握手成功+axi2array_frame_data中读写标志位为写此信号拉高;

read_flag:      axi2array_frame_valid和array2axi_frame_ready握手成功+axi2array_frame_data中读写标志位为读时此信号拉高;

refresh_flag:   内部计数器计数到需要进行refresh操作的时候这个信号拉高(这个跳转优先级最高);

握手没有成功保持idle状态;

2.refresh状态的跳转:

refresh_end :  内部计数器计数不断计数直到刷新时间结束;

refresh刷新没有结束,保持refresh状态;

3. write状态的跳转:

write_end :array_wr内部状态机在precharge的最后一拍的时候,此信号拉高

4. read状态的跳转:

read_end: array_rd内部状态机在precharge的最后一拍的时候,此信号拉高

3.6 array_wr

3.6.1 功能描述:

进入到写状态后按照array的时序发送写的数据、地址、地址时钟、数据时钟;根据frame的信息产生precharge操作。

3.6.2实现机制

当前状态是idle并且在下一状态是up_addr时放上行地址;

每次在idle状态下握手成功的时候需要将frame数据中的eof寄存下来便于后面判定是进入wdata状态还是wlast状态;

up_addr、wlast、pre_precharge状态均是保持一拍,这三个状态用于对寄存器进行赋初值,此外wlast还起到eof为1时数据传输的作用;

idle状态下array和axi交互的ready信号保持为高,wdata状态下根据array_wdata_vld信号来拉高ready信号,当vld信号为低的时候,ready信号拉高,其他所有状态下ready信号拉低;

array_wdata_vld信号仅仅在wdata和wlast状态下才有效,并且在wait_trcd_wr结束时需要拉高,拉高一拍后下一拍拉低,此后传输过程中每次握手成功拉高;

3.6.3 状态机描述:

       1. idle状态的跳转(默认状态):

              array和axi_slave握手成功并且array_state_ctrl 输出给array_write的write_flag拉高的时候进入upaddr状态。

2. up_addr状态跳转:

       下一拍进入wait_trcd_wr状态;在up_addr状态拉低cs(时序逻辑)。在这一状态下设置一个计数器,根据apb配置模块传递的初始参数trcd_wr值为这个计数器进行赋初值(计数器的初值为这个参数减1)。

      

3.wait_trcd_wr状态的跳转:

       根据up_addr设置的计数器不断计数,当计数器计数值为0的时候跳出该状态。根据idle状态下寄存的eof进行状态跳转,当eof为1的时候进入wlast状态,eof为0的时候进入wdata状态。

4. wdata状态跳转:

检测到传输的data中的eof信号为高的时候进入到wlast状态。

5. wlast状态跳转:

这个状态仅仅维持一拍,在这个状态需要对计数器进行赋初值,根据apb配置模块的twr-1值对计数器值进行赋值

array_caddr_vld_wr在wait_trcd_wr状态结束的时候会拉高,并且在这个状态下如果这个信号为1就自动拉低。

6. wait_twr状态跳转:

内部计数器计数值为0时跳出该状态,进入pre_precharge状态

      

       7.pre_precharge状态的跳转:

              这个状态仅仅维持一拍,主要用于对计数器进行赋值,初值为trp-2;

       8.precharge状态的跳转:

              内部计数器计数到0时跳入idle状态;

      

时序描述

axi2array_frame_valid不连续的情况:

在握手成功的时候更新数据,同时如果握手成功的时候axi_caddr_vld_wr状态为低的时候将axi_caddr_vld_wr拉高,axi_caddr_vld_wr信号永远是维持一拍高的状态,下一拍自动变为0,此外axi_caddr_vld_wr在进入到wdata状态时会首先拉高。axi2array_frame_ready信号是在进入到wdata状态后如果axi_caddr_vld_wr为底那么axi2array_frame_ready为高。

axi2array_frame_valid连续的情况:

3.7 array_rd

读部分内部状态机类似于写,不同的地方在于对于读来说axi2array_frame_valid实际上不存在不连续的情况,也就是读操作均是连续的情况。另外读部分内部存在一个异步FIFO用于处理读操作时回来的异步数据。

时序描述:起始地址为‘h1e0,axi_s_ar_len为’h2。

3.8 refresh

3.8.1 实现机制

(1)关于刷新逻辑的产生:刷新一行所需要的时间是trc,那么一次刷新所需要的时间是216*trc,内部定义一个计数器,如果计数器计算的时间没有超过这个刷新所有行所需要的周期,那么就任然处于刷新状态。

(2)考虑到一次burst传输的余量问题,一个burst传输最多传输256个256bit的数据,一个256bit数据需要8个周期才能处理完,考虑最多的跨行情况,需要跨行16次,因此将这个burst处理结束需要的时间是8*256T+16*(T+trcd_wr+twr+trp)。选择余量为4ms(远大于前面计算的值),因此实际刷新周期是60ms刷新一次。

(3)刷新请求:在每次计数器清0的时候拉高refresh_req信号,当array_state_ctrl所处状态处于idle状态时对这个refresh_req拉低。

(3)刷新周期可配置:实现的方式在apb那一侧定义两个刷新周期的参数和一个选择信号,首先按照默认刷新周期执行,如果需要动态的执行刷新操纵,那么需要将刷新周期写入到另一个刷新周期参数中,同时将选择信号拉高,这个选择信号经过跨时钟域出来后到达array模块,当array模块采集到该信号为高的时候,采集另一个刷新参数。需要注意的是,如果这个新的刷新参数大于旧的刷新参数,那么计数器值继续增加直到该值为新的刷新参数,如果新的刷新参数值小于旧的刷新参数,那么在采集到的时刻,立马执行刷新操作。

正常情况:

更换period:

3.6.3 状态机描述:

idle(默认状态):refresh_flag拉高的时候跳入row_addr状态;当前状态是idle状态并且下一状态是row_addr的时候放入行地址

row_addr:下一拍进入wait_tras状态,这一拍需要拉低cs,为tras计数器赋初值;

       wait_tras:计数器计数为0的时候进入pre_trp状态;当前状态是wait_tras下一状态时pre_trp状态的时候拉高cs;

       pre_trp:为计数器赋初值;

       wait_trp:计数器计数为0并且行地址最大值的时候进入idle状态,如果计数器值为0但是行地址值不为最大值,那么进入row_addr。当前状态是wait_trp下一状态是row_addr的时候放入row_addr,当前状态是wait_trp下一状态是idle的时候将refresh_end信号拉高。

3.6.4时序描述

更多推荐

memory control模块设计及验证2

本文发布于:2024-02-11 06:53:15,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1679711.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模块   memory   control

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!