memory controller实现了对array read/write/refresh的控制,其接口完成了axi bus到array interface之间的转换。
- 支持array时序可配置
- 支持array刷新周期可配置
- 支持axi bus 跨行
- array 工作频率为
$200MHz$
signal name | width | direction | description |
---|---|---|---|
global signal | |||
clk | 1 | input | system clk, 400MHz |
rst_n | 1 | input | system reset |
axi bus | |||
axi_awvalid | input | 1 | axi aw channel valid |
axi_awready | output | 1 | axi aw channel ready |
axi_awlen | input | 6 | axi aw channel len |
axi_awaddr | input | 20 | axi aw channel address |
axi_wvalid | input | 1 | axi w channel valid |
axi_wready | output | 1 | axi w channel ready |
axi_wlast | input | 1 | axi w channel last |
axi_wdata | input | 64 | axi w channel data |
axi_arvalid | input | 1 | axi ar channel valid |
axi_arready | output | 1 | axi ar channel ready |
axi_arlen | input | 6 | axi ar channel len |
axi_araddr | input | 20 | axi ar channel address |
axi_rvalid | output | 1 | axi r channel valid |
axi_rlast | output | 1 | axi r channel last |
axi_rdata | output | 64 | axi r channel data |
apb bus | |||
apb_pclk | input | 1 | apb clock |
apb_prst_n | input | 1 | apb reset |
apb_psel | input | 1 | apb select |
apb_pwrite | input | 1 | apb read/write indication |
apb_penable | input | 1 | apb enable |
apb_paddr | Input | 16 | apb addr |
apb_pwdata | input | 32 | apb write data |
apb_pready | output | 1 | apb ready |
apb_prdata | output | 32 | apb read data |
array interface | |||
array_banksel_n | output | 1 | array select |
array_raddr | output | 14 | array row address |
array_cas_wr | output | 1 | array column address strobe for write |
array_caddr_wr | output | 6 | array column address for write |
array_cas_rd | output | 1 | array column address strobe for read |
array_caddr_rd | output | 6 | array column address for read |
array_wdata_rdy | output | 1 | array write data indication |
array_wdata | output | 64 | array write data |
array_rdata_rdy | input | 1 | array read data indication |
array_rdata | input | 64 | array read data |
Write without cross row
Write with cross row
Read without cross row
Read with cross row
本模块用于接受和处理AXI总线数据,将数据存储到fifo中并整合为frame输出给array controller模块。同时该模块也接收array controller模块发送的读数据,并将读数据发送到AXI总线上。
- 支持burst跨行
signal name | width | direction | description |
---|---|---|---|
axi_slave interface | |||
axi_awvalid | input | 1 | axi aw channel valid |
axi_awready | output | 1 | axi aw channel ready |
axi_awlen | input | 6 | axi aw channel len |
axi_awaddr | input | 20 | axi aw channel address |
axi_wvalid | input | 1 | axi w channel valid |
axi_wready | output | 1 | axi w channel ready |
axi_wlast | input | 1 | axi w channel last |
axi_wdata | input | 64 | axi w channel data |
axi_arvalid | input | 1 | axi ar channel valid |
axi_arready | output | 1 | axi ar channel ready |
axi_arlen | input | 6 | axi ar channel len |
axi_araddr | input | 20 | axi ar channel address |
axi_rvalid | output | 1 | axi r channel valid |
axi_rlast | output | 1 | axi r channel last |
axi_rdata | output | 64 | axi r channel data |
Internal frame | |||
axi_frame_data | output | 87 | frame data |
axi_frame_valid | output | 1 | handshake valid signal |
axi_frame_ready | input | 1 | handshake ready signal |
array_rdata | input | 64 | handshake read data |
array_rvalid | input | 1 | handshake read data valid signal |
Configure interface | |||
mc_work_en | input | 1 | mc_en control |
注:一个frame位宽为87bits, 组成如下: |
index | description |
---|---|
[86] | start of frame(sof) |
[85] | end of frame(eof) |
[84] | wr_flag |
[70:83] | row_addr |
[64:69] | col_addr |
[63:0] | wdata |
axi_slave模块通过状态机来实现读写状态的仲裁。从IDLE状态跳出,通过aw,ar通道fifo的空信号控制。Idle_ctrl_sig = {arfifo_empty,awfifo_empty}。写入读取轮次进行,由prio_flag信号控制。状态机图如下。
axi_slave 含有五个状态,具体描述如下:
-
IDLE: 当ar,aw的fifo均为空时,IDLE状态保持。当ar,aw的fifo均不为空时,状态跳转收信号prio_flag控制。当prio_flag为高时,跳转WADDR状态,反之跳转到RADDR状态。当ar通道对应fifo为空时,且aw通道对应非空时,跳转WADDR状态,反之,跳转RADDR状态。
-
WADDR: 在此状态,读取aw通道fifo数据,包含base address 和len。之后跳转到WDATA。
-
WDATA: 在此状态,读取w通道fifo数据,整合成frame并发送。在此状态需要完成的任务有,通过counter确定当下数据为burst中的第几个数据;计算当下数据对应的地址;计算eof,sof;整合成frame发送。当一个burst发送结束,跳转到IDLE状态。
-
RADDR: 在此状态,读取ar通道fifo数据,包含base address 和len。之后跳转到RADDR_SEND。
-
RADDR_SEND:将读地址整合成frame,发送给array controller模块,burst发送结束后,等待接受读数据,接受完全部读数据后,跳转到IDLE.
write with no cross row (len = 4)
Write with cross row (len = 4)
Read with no cross row (len = 4)
Read with cross row
此模块接受axi_slave 的frame数据,实现memory读写,刷新操作。
- 支持array接口时序可配置
- 支持刷新周期可配置
- array 工作频率200MHz
模块array_ctrl含有五个子模块。各子模块功能如下:
- fsm_ctrl:实现状态跳转和frame的分发
- array_wr_ctrl:输出写控制信号给array_if_sel模块。
- array_rd_ctrl:输出读控制信号给array_if_sel模块。
- array_rf_ctrl:输出刷新控制信号给array_if_sel模块。
- array_if_sel:接收读写,刷新控制信号,并根据sel信号进行选择输出。
signal name | direction | width | Description |
---|---|---|---|
global signal | |||
clk | input | 1 | input clk signal 400MHz |
rstn | input | 1 | reset signal negative |
cm_en | input | 1 | mc enable signal |
axi_slave_interface | |||
axi_frame_data | input | 87 | axi frame data |
axi_frame_valid | input | 1 | axi frame valid |
axi_frame_ready | output | 1 | axi frame ready |
array_rdata | output | 64 | array read data to axi_slave |
array_rvalid | output | 1 | array read valid to axi_slave |
memory array interface | |||
array_banksel_n | output | 1 | array bank select |
array_raddr | output | 14 | array row address |
array_cas_wr | output | 1 | array column address strobe for write |
array_caddr_wr | output | 6 | array column address for write |
array_cas_rd | output | 1 | array column address strobe for read |
array_caddr_rd | output | 6 | array column address for read |
array_wdata_rdy | output | 1 | array write data indication |
array_wdata | output | 64 | array write data |
array_rdata_rdy | input | 1 | array read data indication |
array_rdata | input | 64 | array read data |
apb configure interface | |||
mc_trc_cfg | input | 8 | mc array interface tRC configure |
mc_tras_cfg | input | 8 | mc array interface tRAS configure |
mc_trp_cfg | input | 8 | mc array interface tRP configure |
mc_trcd_cfg | input | 8 | mc array interface tRCD configure |
mc_twr_cfg | input | 8 | mc array interface tWR configure |
mc_trtp_cfg | input | 8 | mc array interface tRTP configure |
mc_rf_start_time_cfg | input | 28 | mc array interface refresh start time configure |
mc_rf_period_time_cfg | input | 28 | mc array interface refresh duration configure |
实现了axi frame数据分发和状态控制。
- fifo 缓存frame数据
signal name | direction | width | Description |
---|---|---|---|
global signal | |||
clk | input | 1 | input clk signal 400MHz |
rstn | input | 1 | reset signal negative |
mc_en | input | 1 | mc enable signal |
mc_rf_start_time_cfg | input | 28 | mc array interface refresh duration configure |
mc_rf_period_time_cfg | input | 28 | mc array interface refresh start time configure |
axi_slave_interface | |||
axi_frame_data | input | 87 | axi frame data |
axi_frame_valid | input | 1 | axi frame valid |
axi_frame_ready | output | 1 | axi frame ready |
array_rdata | output | 64 | array read data to axi_slave |
array_rvalid | output | 1 | array read valid to axi_slave |
write ctrl interface | |||
axi_wframe_data | input | 87 | axi wframe data |
axi_wframe_valid | input | 1 | axi wframe valid |
axi_wframe_ready | output | 1 | axi wframe ready |
input | 1 | write_finish_sig | |
read ctrl interface | |||
axi_rframe_data | input | 87 | axi rframe data |
axi_rframe_valid | input | 1 | axi rframe valid |
axi_rframe_ready | output | 1 | axi rframe ready |
read_finish_sig | input | 1 | read_finish_sig |
refresh interface | |||
refresh_finish_sig | input | 1 | refresh_finish_sig |
refresh_start_sig | output | 87 | refresh_start_sig |
本模块状态机含有五个状态。再IDLE状态下,刷新请求优先级最高。读操作请求(rd_req)和写操作请求(wr_req)取决于fifo中读取frame的读写标志。具体状态说明如下:
- IDLE:在此状态时,刷新请求拥有最高优先级。rf_req 为高是,跳转REFRESH状态。如果刷新请求为低,则根据fifo中frame的读写只是,产生读写请求信号,分别跳转对应读写状态。
- WRITE:在此状态,执行写操作,写操作进行时,如果刷新计数器达到刷新请求值,则rf_req_wait为高,在WRITE执行结束后,进入REFRESH状态,否则进入IDLE状态。
- READ:在此状态,执行写操作,读操作进行时,如果刷新计数器达到刷新请求值,则rf_req_wait为高,在WRITE执行结束后,进入REFRESH状态,否则进入IDLE状态。
- REFRESH:在此状态进行刷新操作,操作结束后,返回IDLE状态。
刷新时,时序图如下:
此模块根据apb时序配置,完成写操作
- array 时序接口可配置
signal name | direction | width | Description |
---|---|---|---|
global signal | |||
clk | input | 1 | input clk signal 400MHz |
rstn | input | 1 | reset signal negative |
fsm ctrl interface | |||
axi_wframe_data | input | 87 | axi wframe data |
axi_wframe_valid | input | 1 | axi wframe valid |
axi_wframe_ready | output | 1 | axi wframe ready |
write_finish_sig | input | 1 | write_finish_sig |
array interface | |||
frame_data | input | 64 | frame data |
array_banksel_n | output | 1 | bank select (negative) |
array_raddr | output | 8 | row address |
array_cas_wr | output | 1 | write column address strobe |
array_caddr_rd | output | 6 | write column address |
array_wdata_rdy | output | 1 | write data inidcate |
array_wdata | input | 64 | write data |
configure signal | |||
tSRADDR | input | 8 | tSRADDR counter maximum |
tRCD | input | 3 | tRCD counter maximum |
tWR | input | 3 | tWR counter maximum |
tRP | input | 3 | tRP counter maximum |
本模块含有七个状态,具体说明如下
- IDLE:当接受到sof和valid信号时,跳转到SRADDR状态
- SRADDR:此状态结束后,banksel信号拉低。
- RCD:rol-col-delay状态。当计时器达到mc_trcd_cfg-1时,判断是否为eof,如果eof为高,跳入WLAST状态,否则跳入WRITE_DATA_SEND状态
- WRITE_DATA_SEND:在此状态,发送列地址和对应写数据。当eof和ready信号为高时,此时应该发送最后一个数据,跳转到WLAST状态。
- WLAST: 在此状态,发送最后一个数据,然后跳转到WR 状态。
- WR:判断是否满足tWR和tRAS的最小保持时间。如果满足,跳到RP状态。
- RP:当tRP_cnt达到mc_trp_cfg-1时,跳回IDLE状态。
One data frame
Continuous Frame
Valid Discontinuous
Cross Row
此模块根据apb时序配置,完成读操作
- array 时序接口可配置
signal name | direction | width | Description |
---|---|---|---|
global signal | |||
clk | input | 1 | input clk signal 400MHz |
rstn | input | 1 | reset signal negative |
fsm ctrl interface | |||
axi_wframe_data | input | 87 | axi wframe data |
axi_wframe_valid | input | 1 | axi wframe valid |
axi_wframe_ready | output | 1 | axi wframe ready |
read_finish_sig | input | 1 | read_finish_sig |
read_data | output | 64 | |
array interface | |||
array_banksel_n | output | 1 | bank select (negative) |
array_raddr | output | 8 | row address |
array_cas_rd | output | 1 | read column address strobe |
array_caddr_rd | output | 6 | read column address |
array_rdata_rdy | output | 1 | read data inidcate |
rdata | input | 64 | read data |
configure signal | |||
mc_trc_cfg | input | 8 | mc array interface tRC configure |
mc_tras_cfg | input | 8 | mc array interface tRAS configure |
mc_trp_cfg | input | 8 | mc array interface tRP configure |
mc_trcd_cfg | input | 8 | mc array interface tRCD configure |
mc_twr_cfg | input | 8 | mc array interface tWR configure |
mc_trtp_cfg | input | 8 | mc array interface tRTP configure |
本模块含有七个状态,具体说明如下
- IDLE:当接受到sof和valid信号时,跳转到SRADDR状态
- SRADDR:此状态结束后,banksel信号拉低。
- RCD:rol-col-delay状态。当计时器达到mc_trcd_cfg-1时,判断是否为eof,如果eof为高,跳入WLAST状态,否则跳入WRITE_DATA_SEND状态
- READ_DATA_SEND:在此状态,发送列地址和对应写数据。当eof和ready信号为高时,此时应该发送最后一个数据,跳转到WLAST状态。
- RLAST: 在此状态,发送最后一个数据,然后跳转到WR 状态。
- RTP:判断是否满足tWR和tRAS的最小保持时间。如果满足,跳到RP状态。
- RP:当tRP_cnt达到mc_trp_cfg-1时,跳回IDLE状态。
3.1.5 Timing
No cross row
4 data frame with cross row
1 data frame
此模块根据apb时序配置,完成刷新操作
- 根据apb的时序配置,完成刷新操作
signal name | direction | width | Description |
---|---|---|---|
refresh task | |||
clk | input | 1 | system clk 400MHz |
rstn | input | 1 | system reset |
mc_rf_start_time_cfg | input | 28 | refresh start time |
mc_rf_period_time_cfg | input | 28 | refresh period time |
mc_trc_cfg | input | 8 | trc config |
mc_trp_cfg | input | 8 | trp config |
rf_start | input | 1 | start signal |
rf_finish | input | 1 | refresh finish signal |
array_banksel_n | output | 1 | assay select signal |
array_raddr | output | 14 | array row address |
3.8.4 FSM Diagram
此模块状态机含有三个状态。
- IDLE: 当收到刷新开始信号时,跳入UP_ADDR状态.
- UP_ADDR: 无条件跳转到REFRESH状态
- REFRESH:当收到刷新结束信号跳回idle。
3.8.5 Timing
- mc_apb_cfg
mc apb 寄存器配置如下:
offset address | register type | field | register signal name | default |
---|---|---|---|---|
0x00 | mc_work_ctrl | [0] | mc_en | 1'b0 |
[31:1] | reserved | 31'h0 | ||
0x04 | mc_timing_ctrl0 | [7:0] | mc_trc_cfg | 8'd0 |
[15:8] | mc_tras_cfg | 8'd0 | ||
[23:16] | mc_trp_cfg | 8'd0 | ||
[31:24] | mc_trcd_cfg | 8'd0 | ||
0x08 | mc_timing_ctrl1 | [7:0] | mc_twr_cfg | 8'd0 |
[15:8] | mc_trtp_cfg | 8'd0 | ||
[31:16] | reserved | 8'd0 | ||
0x0C | mc_timing_ctrl2 | [27:0] | mc_rf_start_time_cfg | 28'h0000000 |
[31:28] | reserved | 4'd0 | ||
0x10 | mc_timing_ctrl3 | [27:0] | mc_rf_period_time_cfg | 28'h16E3600 |
[31:28] | reserved | 4'd0 |