基于vivado的DDR3仿真

这篇具有很好参考价值的文章主要介绍了基于vivado的DDR3仿真。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近在使用ddr,开发的过程中出现了好多问题,特别是在仿真这一块,现在把遇到的问题记录一下。
在vivado中仿真DDR的时候,有一个关键的地方,就是添加DDR模型和参数。
本文以黑金的开发例程来举例,程序主要包括三个部分:
vivado ddr3,FPGA,fpga开发
DDR测试程序、DDR控制程序、DDR IP核。这个时候直接点仿真,得不到任何结果,还需要添加DDR模型。

在设置好DDR mig ip核后,点击open example,即可得到以该IP核设置的DDR模型和参数。
vivado ddr3,FPGA,fpga开发
在example工程文件中搜索得到ddr3_model.sv,ddr3_model_parameter.vh两个文件。
vivado ddr3,FPGA,fpga开发
把这两个文件加入到原工程的仿真文件里面,再编写一个testbench,即可开始仿真。
vivado ddr3,FPGA,fpga开发
仿真结果如下:
vivado ddr3,FPGA,fpga开发
最终init_calib_complete在107.865us的时候开始拉高,完成初始化。
但在此过程中有一个要注意的地方,那就是如果DDR IP核里设置的位宽是32位,由于一个ddr model对应的位宽是16位,所以需要例化两个ddr model,否则init_calib_complete这个信号将会一直拉低,我刚开始仿真的时候就犯了这个错误,找了好久才找到原因。
vivado ddr3,FPGA,fpga开发
上图即为黑金的连线,所以实际使用的时候要根据自身的情况来改变。所以testbench需要按照下面的方式来例化ddr model。文章来源地址https://www.toymoban.com/news/detail-538333.html

`timescale 1ps / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/07/13 18:58:51
// Design Name: 
// Module Name: top_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module top_tb(
    );
//
   // Inouts
   wire [31:0]                     ddr3_dq;
   wire [3:0]                      ddr3_dqs_n;
   wire [3:0]                      ddr3_dqs_p;
   // Outputs
   wire [14:0]                     ddr3_addr;
   wire [2:0]                      ddr3_ba;
   wire                            ddr3_ras_n;
   wire                            ddr3_cas_n;
   wire                            ddr3_we_n;
   wire                            ddr3_reset_n;
   wire [0:0]                      ddr3_ck_p;
   wire [0:0]                      ddr3_ck_n;
   wire [0:0]                      ddr3_cke;  
   wire [0:0]                      ddr3_cs_n;   
   wire [3:0]                      ddr3_dm;  
   wire [0:0]                      ddr3_odt;
   //Differential system clocks
   reg                             sys_clk_p;
   reg                             sys_clk_n;
   wire                            error;
   reg                             rst_n;

//
initial
begin
    rst_n = 1'b0;
    #1000000
    rst_n = 1'b1;
end

initial
begin
    sys_clk_n = 1'b0;
    sys_clk_p = 1'b1;
end

    always  sys_clk_n = #2500 ~sys_clk_n;
    always  sys_clk_p = #2500 ~sys_clk_p;


//
top u_top
  (
// Inouts
    .ddr3_dq                        (ddr3_dq[31:0]              ), // (inout )
    .ddr3_dqs_n                     (ddr3_dqs_n[3:0]            ), // (inout )
    .ddr3_dqs_p                     (ddr3_dqs_p[3:0]            ), // (inout )
// Outputs
    .ddr3_addr                      (ddr3_addr[14:0]            ), // (output)
    .ddr3_ba                        (ddr3_ba[2:0]               ), // (output)
    .ddr3_ras_n                     (ddr3_ras_n                 ), // (output)
    .ddr3_cas_n                     (ddr3_cas_n                 ), // (output)
    .ddr3_we_n                      (ddr3_we_n                  ), // (output)
    .ddr3_reset_n                   (ddr3_reset_n               ), // (output)
    .ddr3_ck_p                      (ddr3_ck_p[0:0]             ), // (output)
    .ddr3_ck_n                      (ddr3_ck_n[0:0]             ), // (output)
    .ddr3_cke                       (ddr3_cke[0:0]              ), // (output)
    .ddr3_cs_n                      (ddr3_cs_n[0:0]             ), // (output)
    .ddr3_dm                        (ddr3_dm[3:0]               ), // (output)
    .ddr3_odt                       (ddr3_odt[0:0]              ), // (output)
//Differential system clocks
    .sys_clk_p                      (sys_clk_p                  ), // (input )
    .sys_clk_n                      (sys_clk_n                  ), // (input )
    .error                          (error                      ), // (output)
    .rst_n                          (rst_n                      ) // (input )
   );

//两个ddr model 
ddr3_model u0_comp_ddr3
(
    .rst_n                          (rst_n                      ), 
    .ck                             (ddr3_ck_p                  ), 
    .ck_n                           (ddr3_ck_n                  ), 
    .cke                            (ddr3_cke                   ), 
    .cs_n                           (ddr3_cs_n                  ), 
    .ras_n                          (ddr3_ras_n                 ), 
    .cas_n                          (ddr3_cas_n                 ), 
    .we_n                           (ddr3_we_n                  ), 
    .dm_tdqs                        (ddr3_dm[3:2]               ), 
    .ba                             (ddr3_ba                    ), 
    .addr                           (ddr3_addr                  ), 
    .dq                             (ddr3_dq[31:16]             ), 
    .dqs                            (ddr3_dqs_p[3:2]            ), 
    .dqs_n                          (ddr3_dqs_n[3:2]            ), 
    .tdqs_n                         (                           ), 
    .odt                            (ddr3_odt                   )  
);  

ddr3_model u1_comp_ddr3
(
    .rst_n                          (rst_n                      ), 
    .ck                             (ddr3_ck_p                  ), 
    .ck_n                           (ddr3_ck_n                  ), 
    .cke                            (ddr3_cke                   ), 
    .cs_n                           (ddr3_cs_n                  ), 
    .ras_n                          (ddr3_ras_n                 ), 
    .cas_n                          (ddr3_cas_n                 ), 
    .we_n                           (ddr3_we_n                  ), 
    .dm_tdqs                        (ddr3_dm[1:0]               ), 
    .ba                             (ddr3_ba                    ), 
    .addr                           (ddr3_addr                  ), 
    .dq                             (ddr3_dq[15:0]              ), 
    .dqs                            (ddr3_dqs_p[1:0]            ), 
    .dqs_n                          (ddr3_dqs_n[1:0]            ), 
    .tdqs_n                         (                           ), 
    .odt                            (ddr3_odt                   )  
); 


endmodule

到了这里,关于基于vivado的DDR3仿真的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA-基于AXI4接口的DDR3读写顶层模块

    AXI4(Advancede Xtensible Interface 4)是一种高性能、高带宽的总线接口协议,用于在系统级芯片设计中连接不同的IP核(Intellectual Property)或模块。它是由ARM公司开发的,被广泛应用于各种SoC(System-on-Chip)设计中。 AXI4接口协议定义了一组规范,用于描述数据传输、地址传输、控

    2024年04月15日
    浏览(42)
  • Xilinx FPGA DDR3设计(三)DDR3 IP核详解及读写测试

    引言 :本文我们介绍下Xilinx DDR3 IP核的重要架构、IP核信号管脚定义、读写操作时序、IP核详细配置以及简单的读写测试。 7系列FPGA DDR接口解决方案如图1所示。 图1、7系列FPGA DDR3解决方案 1.1 用户FPGA逻辑(User FPGA Logic) 如图1中①所示,用户FPGA逻辑块是任何需要连接到外部

    2024年02月06日
    浏览(41)
  • 紫光同创 FPGA 开发跳坑指南(四)—— DDR3 控制器 IP 的使用

    DDR3 是一种大容量的存储器件,采用了预取技术和双边沿采样技术,以实现高速数据存储与读取,在视频处理中可以用来缓存 1 帧或多帧图像。 目录 一、紫光 DDR3 IP 的安装 二、紫光 DDR3 IP 的配置 三、DDR3 IP 的使用 3.1 DDR3 写操作 3.2 DDR3 读操作         在 Pango Design Suit 中,选

    2024年01月25日
    浏览(40)
  • 基于fpga的ddr3读写控制,纯verilog实现,能实现多通道图像数据读写控制

    基于fpga的ddr3读写控制,纯verilog实现,能实现多通道图像数据读写控制,模块接口清晰,可移植性高. 基于FPGA的DDR3读写控制是一项重要的技术,它为多通道图像数据的读写提供了高效的解决方案。本文将介绍一种纯Verilog实现的DDR3读写控制模块,旨在实现模块接口清晰、可移

    2024年04月12日
    浏览(48)
  • 【FPGA】MIG DDR3读写逻辑测试

            笔者在之前通过microblaze软核的方式实现了DDR3芯片的读写测试,当时对于Xilinx MIG DDR控制器的理解还比较肤浅。还是想通过控制用户接口时序的方式来读写DDR,扩展和加深自己对DDR的理解。 MIG IP核配置请看我的前一篇文章 【FPGA测试】Microblaze测试DDR读写_microblaze

    2024年01月22日
    浏览(32)
  • FPGA入门 —— DDR3(MIG IP 核) 入门

    DDR 简介 DDR=Double Data Rate双倍速率同步动态随机存储器。严格的说DDR应该叫DDR SDRAM,人们习惯称为DDR,其中,SDRAM 是Synchronous Dynamic Random Access Memory的缩写,即同步动态随机存取存储器。而DDR SDRAM是Double Data Rate SDRAM的缩写,是双倍速率同步动态随机存储器的意思。 SDRAM在一个时

    2024年01月16日
    浏览(43)
  • 【Xilinx FPGA】DDR3 MIG 时钟管脚分配

    之前在验证 FPGA 板卡的芯片管脚时,所用的测试工程使用内部 PLL 生成的时钟作为 DDR3 的参考时钟。后来尝试将参考时钟改为外部 100M 晶振时钟,发现 MIG IP 配置工具找不到相应管脚,于是学习并梳理了 Xilinx DDR3 MIG IP 时钟管脚的分配规则,在这里做个记录。   目录 1 MIG 时钟

    2024年02月06日
    浏览(35)
  • 【两周学会FPGA】从0到1学习紫光同创FPGA开发|盘古PGL22G开发板学习之DDR3 IP简单读写测试(六)

    本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGL22G开发平台(盘古22K) 一:盘古22K开发板(紫光同创PGL22G开发平台)简介 盘古22K开发板是基于紫光同创Logos系列PGL22G芯片设计的一款FPGA开发板,全

    2024年01月23日
    浏览(55)
  • 紫光FPGA DDR3 IP使用和注意事项(axi4协议)

    紫光DDR3 IP使用 对于紫光ddr3 IP核的使用需要注意事情。 阅读ddr ip手册: 1、注意:对于写地址通道,axi_awvalid要一直拉高,axi_awready才会拉高。使用的芯片型号时PG2L100H-6FBG676,不同的型号IP核接口和axi的握手协议也不一样(一定要注意),这点要注意,这也给我挖了一个很大的

    2024年04月12日
    浏览(39)
  • 超详细的FPGA使用MIG调用SODIMM DDR3内存条接口教程

    SODIMM 接口DDR3适配额外的内存条才能满足数据缓存的需求,这种需求一般用于高端项目,DDR3 SDRAM 常简称 DDR3, 是当今较为常见的一种储存器, 在计算机及嵌入式产品中得到广泛应用,特别是应用在涉及到大量数据交互的场合。 本文以XC7K325T-FFG900-2L为例,记录MIG的配置过程,

    2024年02月02日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包