Xilinx DDR3学习总结——2、MIG exmaple直接上板

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

Xilinx DDR3学习总结——2、MIG exmaple直接上板查看初始化状态

  • 前言
  • 修改内容
  • 上板


前言

上一篇,我们生成了一个example,example的测试激励看起来都比较复杂,仿真先不看,实际上,这个example稍加改动就可以直接上板了。这里我们就是查看MIG IP输出的init_calib_complete信号

修改内容

init_calib_complete是DDR3初始化成功的指示信号,所有的读写操作都必须等待该信号拉高。因此,我们example的内容什么都不改,只改必要的接口时钟,直接上板是否init_calib_complete能够拉高,如果直接上板能够拉高,那么表示DDR3正常工作了,给自己树立极大的信心。

只要改 mig_7series_0模块的两个输入
一个sys_clk_i
一个sys_rst

简单吧,一个系统时钟,需要输入200M,一个复位。
因为板载是100M时钟,这里需要一个PLL把它变成200M,然后把PLL lock信号作为sys_rst不就O了么,很简单呢

example_top文件,注释掉sys_rst,将剩下三个端口绑定管脚,tg_compare_error和init_calib_complete直接连接到两个灯上面

   input                                        sys_clk_i,output                                       tg_compare_error, // LED1output                                       init_calib_complete  // LED2// input                                        sys_rst
create_clock -period 10.000 -name sys_clk_i -waveform {0.000 5.000} [get_ports sys_clk_i]
set_property PACKAGE_PIN AD12 [get_ports sys_clk_i]
set_property IOSTANDARD SSTL135 [get_ports sys_clk_i]set_property PACKAGE_PIN AB28 [get_ports tg_compare_error]  
set_property IOSTANDARD LVCMOS18 [get_ports tg_compare_error]
set_property PACKAGE_PIN AA27 [get_ports init_calib_complete]
set_property IOSTANDARD LVCMOS18 [get_ports init_calib_complete]

DDR3的管脚不需要在进行约束了,因为在创建MIG的时候就已经约束好了,约束文件在IP核的文件夹里面

然后添加一个PLL

wire sys_rst;
wire clk_200m;clk_wiz_0 clk_wiz_0(// Clock out ports.clk_out1(clk_200m),     // 连接到mig_7series_0.sys_clk_i// Status and control signals.locked(sys_rst),       // 连接到mig_7series_0.sys_rst// Clock in ports.clk_in1(sys_clk_i));      // input clk_in1

就这么简单

但在编译的过程中,会出现一个错误,提示需要加这个约束

CLOCK_DEDICATED_ROUTE = BACKBONE

查阅了资料,也有这么处理,也可以避免错误,sys_clk_i输入先经过一个 BUFG,然后在输入到PLL,PLL中source 需要选Global Buffer。之前选的是pin输入,就会有错误

wire sys_clk_d;BUFG BUFG_inst (.O(sys_clk_d), // 1-bit output: Clock output.I(sys_clk_i)  // 1-bit input: Clock input);wire sys_rst;
wire clk_200m;clk_wiz_0 clk_wiz_0(// Clock out ports.clk_out1(clk_200m),     // output clk_out1// Status and control signals.locked(sys_rst),       // output locked// Clock in ports.clk_in1(sys_clk_i));      // input clk_in1

上板

修改完成之后,编译可以生成bit文件,下载到FPGA中,init_calib_complete对应的灯点亮了,说明DDR3初始化成功了。说明我们操作无误,尽管我们抢先进行了上板测试,并且证明了DDR3初始化成功。

但里面的测试例程 mig_7series_v4_2_traffic_gen_top比较复杂,作为初学者我也不太像去了解,我直接将其删除

整个工程就剩下如下内容:


`timescale 1ps/1psmodule example_top(// Inoutsinout [15:0]                         ddr3_dq,inout [1:0]                        ddr3_dqs_n,inout [1:0]                        ddr3_dqs_p,output [14:0]                       ddr3_addr,output [2:0]                      ddr3_ba,output                                       ddr3_ras_n,output                                       ddr3_cas_n,output                                       ddr3_we_n,output                                       ddr3_reset_n,output [0:0]                        ddr3_ck_p,output [0:0]                        ddr3_ck_n,output [0:0]                       ddr3_cke,output [0:0]           ddr3_cs_n,output [1:0]                        ddr3_dm,output [0:0]                       ddr3_odt,// Single-ended system clockinput                                        sys_clk_i,output                                       tg_compare_error, // LED1output                                       init_calib_complete  // LED2);
wire sys_clk_d;BUFG BUFG_inst (.O(sys_clk_d), // 1-bit output: Clock output.I(sys_clk_i)  // 1-bit input: Clock input);wire sys_rst;
wire clk_200m;clk_wiz_0 clk_wiz_0(// Clock out ports.clk_out1(clk_200m),     // output clk_out1// Status and control signals.locked(sys_rst),       // output locked// Clock in ports.clk_in1(sys_clk_d));      // input clk_in1reg [28:0]                 app_addr = 0;reg [2:0]                            app_cmd = 0;reg                                  app_en = 0;wire                                  app_rdy;wire [127:0]             app_rd_data;wire                                  app_rd_data_end;wire                                  app_rd_data_valid;reg [127:0]             app_wdf_data = 128'h0;reg                                  app_wdf_end = 0;reg [15:0]             app_wdf_mask = 0;wire                                  app_wdf_rdy;wire                                  app_sr_active;wire                                  app_ref_ack;wire                                  app_zq_ack;reg                                  app_wdf_wren = 0;wire [11:0]                           device_temp;wire clk;
wire rst;mig_7series_0 u_mig_7series_0(// Memory interface ports.ddr3_addr                      (ddr3_addr),.ddr3_ba                        (ddr3_ba),.ddr3_cas_n                     (ddr3_cas_n),.ddr3_ck_n                      (ddr3_ck_n),.ddr3_ck_p                      (ddr3_ck_p),.ddr3_cke                       (ddr3_cke),.ddr3_ras_n                     (ddr3_ras_n),.ddr3_we_n                      (ddr3_we_n),.ddr3_dq                        (ddr3_dq),.ddr3_dqs_n                     (ddr3_dqs_n),.ddr3_dqs_p                     (ddr3_dqs_p),.ddr3_reset_n                   (ddr3_reset_n),.init_calib_complete            (init_calib_complete),.ddr3_cs_n                      (ddr3_cs_n),.ddr3_dm                        (ddr3_dm),.ddr3_odt                       (ddr3_odt),
// Application interface ports.app_addr                       (app_addr),.app_cmd                        (app_cmd),.app_en                         (app_en),.app_wdf_data                   (app_wdf_data),.app_wdf_end                    (app_wdf_end),.app_wdf_wren                   (app_wdf_wren),.app_rd_data                    (app_rd_data),.app_rd_data_end                (app_rd_data_end),.app_rd_data_valid              (app_rd_data_valid),.app_rdy                        (app_rdy),.app_wdf_rdy                    (app_wdf_rdy),.app_sr_req                     (1'b0),.app_ref_req                    (1'b0),.app_zq_req                     (1'b0),.app_sr_active                  (app_sr_active),.app_ref_ack                    (app_ref_ack),.app_zq_ack                     (app_zq_ack),.ui_clk                         (clk),.ui_clk_sync_rst                (rst),.app_wdf_mask                   (app_wdf_mask),// System Clock Ports.sys_clk_i                       (clk_200m),.device_temp            (device_temp),.sys_rst                        (sys_rst));// End of User Design top instanceendmodule

注意,MIG的输入需要赋值,否则编译的时候会报错

  reg [28:0]                 app_addr = 0;reg [2:0]                            app_cmd = 0;reg                                  app_en = 0;wire                                  app_rdy;wire [127:0]             app_rd_data;wire                                  app_rd_data_end;wire                                  app_rd_data_valid;reg [127:0]             app_wdf_data = 128'h0;reg                                  app_wdf_end = 0;reg [15:0]             app_wdf_mask = 0;wire                                  app_wdf_rdy;wire                                  app_sr_active;wire                                  app_ref_ack;wire                                  app_zq_ack;reg                                  app_wdf_wren = 0;

修改完成之后,重新编译可以生成bit文件,下载到FPGA中,init_calib_complete对应的灯点亮了,说明DDR3功能不受影响。
接下来我就可以基于这个简化的工程添加一些读写功能了。但如果还需要添加更多的功能的话,还是首先需要进行仿真的,接下来,我们就进行DDR3参考例程的仿真工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/33498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 3.0中的Treeshaking?

1.treeshaking是什么? Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术,专业术语叫 Dead code elimination 简单来讲,就是在保持代码运行结果不变的前提下,去除无用的代码 如果把代码打包比作制作蛋糕&#…

5. 服务发现

当主机较少时,在抓取配置中手动列出它们的IP地址和端口是常见的做法,但不适用于较大规模的集群。尤其不适用使用容器和基于云的实例的动态集群,这些实例经常会变化、创建或销毁的情况。 Prometheus通过使用服务发现解决了这个问题&#xff1…

C# 扩展方法

C# 扩展方法 假设该类是密封的,不能访问代码,或有其他的设计原因使这些方法不能工作,就不得不在另一个类中使用该类的公有可用成员编写一个方法。 假设这个类是密封的: sealed class MyData{double D1;double D2;double D3;publi…

【Mysql】修改definer

修改definer 本文介绍如何修改MySQL中的function、procedure、event、view和trigger的definer 修改function、procedure的definer 首先,我们需要登录MySQL命令行界面,然后执行以下命令: select definer from mysql.proc;这个命令会列出所…

EFLFK——ELK日志分析系统+kafka+filebeat架构(3)

zookeeperkafka分布式消息队列集群的部署 紧接上期,在ELFK的基础上,添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志:192.168.116.40,修改配置将采集到的日志转发给kafka; kafka集群&#xff…

(5)所有角色数据分析页面的构建-5

所有角色数据分析页面,包括一个时间轴柱状图、六个散点图、六个柱状图(每个属性角色的生命值/防御力/攻击力的max与min的对比)。 """绘图""" from pyecharts.charts import Timeline from find_type import FindType import pandas …

RN 使用react-navigation写可以滚动的横向导航条(expo项目)

装包: yarn add react-navigation/material-top-tabs react-native-tab-view npx expo install react-native-pager-view import React from react import { View, Text, ScrollView, SafeAreaView } from react-native import { Icon } from ../../../../../compo…

栈和队列详解

目录 栈 栈的概念及结构: 栈的实现: 代码实现: Stack.h stack.c 队列: 概念及结构: 队列的实现: 代码实现: Queue.h Queue.c 拓展: 循环队列(LeetCode题目链接&#xff0…

rust里如何快速实现一个LRU 本地缓存?

LRU是Least Recently Used(最近最少使用)的缩写,是一种常见的缓存淘汰算法。LRU算法的基本思想是,当缓存空间已满时,优先淘汰最近最少使用的数据,以保留最常用的数据。 在计算机系统中,LRU算法…

http历史版本

1,HTTP0.9 最早的http版本,后来才被定义为0.9版本。 这时候通信采用的是纯文本格式; 只支持get请求,且在服务器响应之后就关闭连接; 没有请求头的概念,功能比较简单。 2,HTTP1.0 这个版本增…

C++中new/malloc,delete/free的区别

new和delete是操作符,malloc和free是库函数。 执行new实际上执行了两个操作:1、分配未初始化的内存空间,也就是调用malloc库函数。2、使用对象的构造函数对空间进行初始化,并返回空间的首地址。 如果第一步分配空间出现问题&…

机器学习基础08-回归算法矩阵分析(基于波士顿房价(Boston House Price)数据集)

回归算法通常涉及到使用矩阵来表示数据和模型参数。线性回归是最常见的回归算法之一,它可以用矩阵形式来表示。 考虑一个简单的线性回归模型: y m x b y mx b ymxb,其中 y y y 是因变量, x x x 是自变量, m m m 是…

美团视觉GPU推理服务部署架构优化实战

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

【C++】开源:tinyxml2解析库配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍tinyxml2解析库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,…

【问题解决】Git命令行常见error及其解决方法

以下是我一段时间没有使用xshell,然后用git命令行遇到的一些系列错误和他们的解决方法 遇到了这个报错: fatal: Not a git repository (or any of the parent directories): .git 我查阅一些博客和资料,可以解决的方式: git in…

Linux单进程、单线程调试命令

l //显示main函数所在的文件的源代码list 文件名:num //显示filename文件num行上下的源代码b 行号 //给指定行添加断点b 函数名 //给指点函数的第一有效行添加一个断点info break //显示断点信息delete 断点号 //删除指定断点disable 断点号 //将断点设定为无效的,不…

冒泡排序 简单选择排序 插入排序 快速排序

bubblesort 两个for循环&#xff0c;从最右端开始一个一个逐渐有序 #include <stdio.h> #include <string.h> #include <stdlib.h>void bubble(int *arr, int len); int main(int argc, char *argv[]) {int arr[] {1, 2, 3, 4, 5, 6, 7};int len sizeof(…

学习Linux,要把握哪些重点?

不知道有没有想学习Linux&#xff0c;但又把握不住学习重点&#xff0c;找不到合适的学习方法的小伙伴&#xff0c;反正我刚开始学习Linux时就像无头苍蝇似的“乱撞”&#xff0c;没有把握住学习重点&#xff0c;不知道怎么去学&#xff0c;差点要放弃了&#xff0c;还好在慢慢…

栈和队列详解(1)

目录 一、什么是栈&#xff1f; 二、创建一个我们自己的栈 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口的实现 2.1初始化栈结构体 2.2尾插(压栈) 2.3栈存放的元素个数和判断栈是否为空 2.4获取栈顶元素 2.5出栈 2.6摧毁栈 2.7测试接口 三、…

【Freertos基础入门】freertos任务的优先级

文章目录 前言一、任务优先级1.Tick2.修改任务优先级 总结 前言 本系列基于stm32系列单片机来使用freerots 任务管理是实时操作系统&#xff08;RTOS&#xff09;的核心功能之一&#xff0c;它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS&…