草庐IT

紫光同创 FPGA 开发跳坑指南(五)—— DDR3 控制器 IP 的仿真

洋洋Young 2023-06-05 原文

这段时间一直忙着工作项目的事情,今天终于抽出时间,分享一下紫光同创 DDR3 IP 的仿真经验 ~

目录

1 搭建仿真环境

1.1 编写激励文件

1.2 自动化仿真

2 DDR3 写操作仿真

3 DDR3 读操作仿真


1 搭建仿真环境

1.1 编写激励文件

        仿真激励文件需要包含以下四个部分:

(1)时钟定义

        DDR3 IP 需要一个 50MHz 的参考时钟,这个时钟频率与前面 DDR3 IP 配置阶段的设定值是一致的。如果系统 PLL 的输入时钟频率也是 50MHz,那么这两个时钟可以是同一个。

(2) 顶层实体

        顶层实体其实就是你设计的顶层模块,没什么特殊的。

(3)DDR3 仿真模型

        DDR3 仿真模型存放在 IP 核的 example_design/bench/mem 文件夹下,仿真模型用于模拟 DDR3 单元,在仿真过程中与顶层实体进行数据交换。

        这里只需要 ddr3_parameters.vh 和 ddr3.v 这两个文件,注意仿真模型需要用 SystemVerilog 编译。

  (4)全局复位网络

        这个全局复位网络是紫光同创的仿真要求,全局复位网络的推荐写法可以在 Language Templates 工具中找到。

        如果激励文件没有例化 GTP_GRS,后续 Modelsim 仿真阶段会报错。

1.2 自动化仿真

        通常 DDR3 IP 的设计文件较为繁多,对于经常烧脑的 FPGA 工程师来说,使用 Python 文本自动化处理不失为一种好方法。

        紫光 DDR3 IP 的设计文件存放在 IP 核的 rtl 文件夹下,使用 Python os 库遍历该文件夹,根据后缀名筛选出 .v 文件和 .vp 文件,并写入 file_list.f 文件,此为自动化仿真的第一步。

import os

if __name__ == "__main__":
   file_list = []

   for root, directory, files in os.walk('./ddr3_controller/rtl'):
      for file in files:
         if file[-2:] == ".v" or file[-3:] == ".vp":
            file_list.append(root.replace('\\', '/')+'/'+file)

   with open('./file_list.f', 'w') as f:
      for file in file_list:
         f.write("{:s}\n".format(file))

        在生成的 file_list.f 文件后面加上 DDR3 仿真模型路径和仿真参数。

./ddr3_controller/example_design/bench/mem/ddr3_parameters.vh
./ddr3_controller/example_design/bench/mem/ddr3.v

+define+SIMULATION
+define+den4096Mb
+define+sg25E
+define+x16

        自动化仿真的第二步是编写 tcl 脚本,指定 SystemVerilog 语言编译设计文件。

# 创建工作库
if [file exists work] {
    file delete -force work
}
vlib work
vmap work ./work

# 使用SystemVerilog编译IP文件
vlog -sv -f ./file_list.f -work work

# 此处编译用户设计文件
# vlog -incr top.v top_tb.v -work work

# 启动仿真
vsim -voptargs=+acc work.top_tb -Lf pango -Lf ddrc -Lf ddrphy -t 1fs

# 运行2ms
run 2 ms

        自动化仿真的第三步是编写 bat 脚本。

powershell -command vsim -do ddr3_sim.tcl

        此处需要确保 Modelsim 安装路径添加到系统环境变量中。

         最后,双击运行 bat 脚本,就可以自动打开 Modelsim,编译并启动仿真。 

2 DDR3 写操作仿真

        要进行 DDR3 的读写操作,需要等待 ddr_init_done 拉高。当 write_finish 信号拉低之后,就进入了 DDR3 的写操作周期。

        数据端口在波形窗口中不便观察,可以结合命令行窗口查看。 

3 DDR3 读操作仿真

        新建一个波形窗口,观察 DDR3 读操作的过程。当 read_finish 信号拉低之后,进入 DDR3 的读操作周期。

         同样可以在命令行窗口查看读取得到的数据。

有关紫光同创 FPGA 开发跳坑指南(五)—— DDR3 控制器 IP 的仿真的更多相关文章

  1. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  2. ruby - 在 TCPServer (Ruby) 中,我如何从客户端获取 IP/MAC? - 2

    我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!

  3. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  4. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  5. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  6. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  7. ruby - Ruby gems 的问题(损坏?)试图让指南针在 npm 中工作 - 2

    我不是Ruby专家,但想弄清楚发生了什么,因为我试图让指南针在节点应用程序中工作,但我的Ruby似乎坏了。打字:ruby--version让我:ruby2.1.1p76(2014-02-24revision45161)[x86_64-darwin13.0]我安装了Homebrew,之前遇到过Ruby版本的问题,但它似乎已安装并且可以正常工作。但是,当我使用gem输入请求时,出现此错误:$gem-hErrorloadingRubyGemsplugin"/Users/user_dir/.rvm/gems/ruby-2.1.1@global/gems/executable-hooks-1.3

  8. ruby - 没有 nginx 的 Puma - 同一 IP 上的多个 ruby​​ 应用程序 :PORT - 2

    Nginx在生产中的重要性通常基于它为慢速客户端提供服务的能力;在RESTfulAPI的设置中,它似乎是生产堆栈的一个不必要的层,尤其是Puma(不像广泛使用的unicorn可以处理nginx工作)。Pumacanallowmultipleslowclientstoconnectwithoutrequiringaworkertobeblockedontherequesttransaction.Becauseofthis,Pumahandlesslowclientsgracefully.HerokurecommendsPumaforuseinscenarioswhereyouexpect

  9. Java IP归属地查询(离线方式+在线方式,内附查询IP方法) - 2

    一、离线方式1.1.下载ip2region.xdbGitHub项目地址:https://github.com/lionsoul2014/ip2region我们首先需要下载一个ip2region.xdb的文件下载地址:https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb打开后点击如图的Download图标即可下载。下载完成后,需要将该文件放到我们的项目中。ps:我是直接放到服务器的,因为放在项目的资源文件夹下,当我们调试的时候使用JavaSpring自带的工具去获取该文件的绝对路径时,没有任何问题,能够正

  10. IP数据报格式 - 2

    1、报文格式前几篇总结过较多网络层的知识,ARP,ip地址、子网掩码等等。这次总结一下IP数据报的报文格式IP数据报的格式能够说明IP协议都具有什么功能。在TCP/IP的标准中,各种数据格式常常以32位(4字节)为单位来描述的。wireshark中IP数据报文呈现一个IP数据报文由首部和数据两部分组成。首部的前一部分是固定长度,共20字节。是所有IP数据报文必须具有的。在首部的固定部分的后面是一些可选字段,其长度可变。2、首部个字段意义  1、版本占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。版本号为6(即IPv6)  2、首部

随机推荐