关于 lattice的 DDR_IP的仿真.
2014-08-26 17:14
232 查看
基本上要先看 DDR IP Cores User`s Guide.
文档 的下载地址(http://www.latticesemi.com/~/media/Documents/Solutions/Technology%20Solutions/ipug35_DDR_DDR2_SDRAM_Cont_PLinedUG.pdf)
在 操作DDR 之前, 需要把 init_start 拉高, 等 init_done 被core 拉高之后, 就可以把 init_start 拉低。
当 inited 被拉高之后, 就可以 操作 DDR了。
一、写 DDR:
等cmd_rdy 被拉高之后, 同时,cmd 赋值为 4’d2,拉高cmd_valid,把地址赋值.
二、 读DDR:
等cmd_rdy 被拉高之后, 同时,cmd 赋值为 4’d1,拉高cmd_valid,把地址赋值.
这几天来一直都在折腾一件小事, 为什么 可以把数据 写进 DDR_IP, 在读DDR的时候, read_data_valid 一直为低电平, 不被拉高。 我就把 IP自带的test_mem_ctrl.v改写,一直不停滴改, 改到和我自己写的 tb 基本一致的时候,我写的 tb还是有问题, 读不出 数据。就在 绝望时刻, 问了下网友军仔,感谢他。
要在 testbench中加上 `include "tb_config_params.v" 才可以,原因不详。 可能和 mem_db_width_32 这个模块有关系。 还望路过的大神 指点一二。
最后 附上我的源码。
http://download.csdn.net/detail/angelbosj/7823189
文档 的下载地址(http://www.latticesemi.com/~/media/Documents/Solutions/Technology%20Solutions/ipug35_DDR_DDR2_SDRAM_Cont_PLinedUG.pdf)
在 操作DDR 之前, 需要把 init_start 拉高, 等 init_done 被core 拉高之后, 就可以把 init_start 拉低。
always @(posedge clk or negedge rst_n) begin if (~rst_n) begin init_start <= 1'b0; inited <= 1'b0; end else if ((~init_start) & (~inited)) init_start <= 1'b1; else if (init_done & init_start) begin init_start <= 1'b0; inited <= 1'b1; end end
当 inited 被拉高之后, 就可以 操作 DDR了。
一、写 DDR:
等cmd_rdy 被拉高之后, 同时,cmd 赋值为 4’d2,拉高cmd_valid,把地址赋值.
4'd0: begin /// 555 write_req <= 1'b1; if (write_req & cmd_rdy) begin // 44 // data_rdy if ((col_addr_wr == MAX_COL - BST) && (row_addr_wr[12: 0] != MAX_ROW)) row_addr_wr <= row_addr_wr + 13'h1; if (col_addr_wr == MAX_COL -BST) col_addr_wr <= 9'h0; else col_addr_wr <= col_addr_wr + BST; end//// 44 if (row_addr_wr == 13'd7) begin // 33 state <= 4'h1; bank_addr_wr <= 2'b0; row_addr_wr <= 13'b0; col_addr_wr <= 9'b0; write_req <= 1'b0; #(200*c) ; end /// 33 end/////// 555等到 data_rdy 被拉高之后, 就可以把数据 发给 ddr了。
二、 读DDR:
等cmd_rdy 被拉高之后, 同时,cmd 赋值为 4’d1,拉高cmd_valid,把地址赋值.
4'd1: begin // 22 read_req <= 1'b1; if (cmd_rdy) begin // 11 if ((col_addr_wr == MAX_COL - BST) && (row_addr_wr[12: 0] != MAX_ROW)) row_addr_wr <= row_addr_wr + 13'h1; if (col_addr_wr == MAX_COL -BST) col_addr_wr <= 9'h0; else col_addr_wr <= col_addr_wr + BST; /// BST.. end // 11 end // 22等到 read_data_valid被拉高,就代表有数据出来。
这几天来一直都在折腾一件小事, 为什么 可以把数据 写进 DDR_IP, 在读DDR的时候, read_data_valid 一直为低电平, 不被拉高。 我就把 IP自带的test_mem_ctrl.v改写,一直不停滴改, 改到和我自己写的 tb 基本一致的时候,我写的 tb还是有问题, 读不出 数据。就在 绝望时刻, 问了下网友军仔,感谢他。
要在 testbench中加上 `include "tb_config_params.v" 才可以,原因不详。 可能和 mem_db_width_32 这个模块有关系。 还望路过的大神 指点一二。
最后 附上我的源码。
http://download.csdn.net/detail/angelbosj/7823189
相关文章推荐
- lattice 的 ddr_ip使用
- 关于vivado HLS IP核仿真中的消费机制
- 关于WebLogic 9.2与10.0中console异地IP登录不上的解决方法
- 关于IP比较得心得
- 关于利用CMWAP的方式不能通过TCP/IP连接INTERNET的说明!
- 关于UDP和IP报校验和
- 关于linux IP 配置
- 关于TCP/IP数据包的截取和分析
- 关于p2p仿真模型
- 关于超过255台电脑的内网IP规划问题
- JAVA笔记 关于IP的小程序
- 关于《TCP/IP Tutorial and Technical Overview》的翻译
- 关于超过255台电脑的内网IP规划问题
- 关于超过255台电脑的内网IP规划问题
- 关于每次dhcp获得同一ip的FAQ
- 关于超过255台电脑的内网IP规划问题
- TCP/IP终端仿真协议(TELNET)--网络大典
- 关于IP-MAC地址绑定的交换机设置
- 关于IP-MAC绑定的交换机设置
- 请教问题:关于网络--关于一根网线有两个静态IP