当前位置: 首页 > news >正文

DDR2 IP核调式记录2

本文相对简单,只供自己看看就行。从其它的博客找了个代码,然后记录下仿真波形。

1. 功能

        直接使用quartus生成的DDR2 IP核,然后实现循环 -->写入burst长度的数据后读出。

        代码数据的传输是32位,实际使用了两片IC。因此IP核也是32位交互。

2.信号分析

        burst=4,是IC固有的=预取值。而代码中LEN为用户一次想要读取数据的长度的。与local_size和burst_length无关。

        分为4个状态: IDLE、WRITER、WRITING、READR、READING。WRITER和READR状态下,开始读写burst的第一个数据,其余的在WRITING和READING状态读写。

         local_ready:很重要的一个指示信号。要进行读写操作,必须在IP核(ddr2)准备好的情况下进行。因此,需要一直对此信号进行检测判断。

        写入地址(mem_local_addr),一开始为1,当读到的数据长度rdatalen=5时(初始值=1),mem_local_addr <= mem_local_addr + 4;

命令

连续写

连续读

读完写

3. 仿真波形分析

如下图所示:每次先写入连续4个数据,(例如1,2,3,4),然后再依次读出。

读过程及下一次写

4. 附代码

顶层代码:

module ddr2wrtest (input 					clk 			,    // Clockinput 					global_reset_n 	,  // Asynchronous reset active lowoutput  [ 12: 0]		mem_addr 		,	output  [  2: 0] 		mem_ba 			,	output					mem_cas_n 		,	output					mem_cke 		,	inout					mem_clk 		,	inout 					mem_clk_n 		,	output 					mem_cs_n 		,	output 	[  1: 0]		mem_dm 			,	inout	[ 15: 0]		mem_dq 			,	inout	[  1: 0]		mem_dqs 		,	output					mem_odt 		,	output					mem_ras_n 		,	output					mem_we_n 			);parameter 			LEN 	= 8; 				// 突发长度 4parameter 			IDEL 		= 5'b00001;		// 空闲态parameter 			WRITER 		= 5'b00010;		// 准备写parameter 			WRITING 	= 5'b00100;		// 写状态parameter 			READR 	 	= 5'b01000;		// 准备读parameter 			READING 	= 5'b10000;		// 读状态reg	 [  5: 0]		state;
//**********************与IP相连部分********************//reg [ 24: 0]	mem_local_addr		=1	;wire 				mem_local_init_done		;	wire 				local_burstbegin_sig	;								wire [ 31: 0]	mem_local_rdata 		;wire 				mem_local_rdata_valid	;wire 				mem_local_read_req		;wire 				mem_local_ready			;							wire [  3: 0]	mem_local_size			;reg  [ 31: 0]	mem_local_wdata			;wire 				mem_local_write_req		;wire 				phy_clk 				;wire 				reset_phy_clk_n 		;
//*****************************************************//wire 				rst_n 					;reg  [  3: 0] 		rdatalen 				; // 读突发长度计数器reg  [  3: 0] 		wdatalen 				; // 写突发长度计数器reg  [100: 0]		state_name				; // 状态名assign rst_n = reset_phy_clk_n&&mem_local_init_done;assign mem_local_size = LEN;assign local_burstbegin_sig = ((state == WRITER&&mem_local_ready) || (state == READR&&mem_local_ready))?1:0;assign mem_local_write_req  = (state == WRITING)?1:0;assign mem_local_read_req 	= (state == READR&&mem_local_ready)?1:0;ddr2 ddr2_inst(
//==============================《				   》===============================.aux_full_rate_clk 	(						),	//全速率时钟.aux_half_rate_clk 	(						),	//半速率时钟
//==============================《    用户操作信号   》===============================.global_reset_n		(global_reset_n 		),	//全局复位.local_address 		(mem_local_addr			),	//当前操作地址.local_be 			(8'hff					),	//数据掩码.local_burstbegin 	(local_burstbegin_sig	),	//突发起始信号.local_init_done 		(mem_local_init_done	),	//初始化完成信号.local_rdata 			(mem_local_rdata 		),	//读数据总线.local_rdata_valid 	(mem_local_rdata_valid	),	//读有效标志.local_read_req 		(mem_local_read_req		),	//读请求,保持一个时钟周期.local_ready 			(mem_local_ready		),	//接受到请求.local_refresh_ack 	(						),	//自动刷新.local_size 			(mem_local_size			),	//突发长度.local_wdata 			(mem_local_wdata		),	//写数据总线.local_write_req 		(mem_local_write_req	),	//写请求
//==============================《  与DDR2相连的信号  》===============================.mem_addr 			(mem_addr 				),	//地址总线.mem_ba 				(mem_ba					),	//bank地址.mem_cas_n 			(mem_cas_n				),	//行选通.mem_cke 				(mem_cke				),	//时钟使能.mem_clk 				(mem_clk 				),	//操作时钟.mem_clk_n 			(mem_clk_n				),	//反向时钟.mem_cs_n 			(mem_cs_n 				),	//片选信号.mem_dm 				(mem_dm 				),	//DDR2数据屏蔽信号.mem_dq 				(mem_dq 				),	//数据总线.mem_dqs 				(mem_dqs 				),	//数据选取脉冲信号.mem_odt 				(mem_odt 				),	//片内终结信号.mem_ras_n 			(mem_ras_n 				),	//行选通.mem_we_n 			(mem_we_n 				),	//使能
//==============================《    用户操作信号    》===============================.phy_clk 				(phy_clk 				),	//提供给用户的操作时钟.pll_ref_clk 			(clk 					),	//给ddr2的输入时钟.reset_phy_clk_n 		(reset_phy_clk_n 		),	//提供给用户的复位信号.reset_request_n 		(						),	//当PLL锁定后为低电平.soft_reset_n 		(1'b1 					)	//软复位,不包括PLL的复位);always@(*)case (state)IDEL  	:	state_name = "IDEL";WRITER 	:	state_name = "WRITER"		;		WRITING	:	state_name = "WRITING"		;		READR 	:	state_name = "READR"		;			READING	:	state_name = "READING";default : /* default */;endcasealways@(posedge phy_clk or negedge rst_n)begin if(!rst_n)state <= IDEL;elsecase (state)IDEL 	:	state <= WRITER;WRITER 	: 	if(mem_local_ready)state <= WRITING;elsestate <= WRITER;WRITING : 	if(wdatalen == LEN)state <= READR;elsestate <= state;READR 	: 	if(mem_local_ready)state <= READING;elsestate <= READR;READING : 	if(rdatalen == LEN)state <= IDEL;elsestate <= state;		default : state <= state;endcaseend// 写的数据自加1always@(posedge phy_clk or negedge rst_n)begin if(!rst_n)mem_local_wdata <= 1;else if(state == WRITING && mem_local_ready)mem_local_wdata <= mem_local_wdata + 1;elsemem_local_wdata <= mem_local_wdata;end// 当前写的数据突发长度always@(posedge phy_clk or negedge rst_n)begin if(!rst_n) wdatalen <= 1;else if(state == WRITING && mem_local_ready)wdatalen <= wdatalen + 1;else if(state == WRITING && !mem_local_ready)wdatalen <= wdatalen ;elsewdatalen <= 1;end// 当前读的数据突发长度always@(posedge phy_clk or negedge rst_n)begin if(!rst_n) rdatalen <= 1;else if(state == READING && mem_local_rdata_valid)rdatalen <= rdatalen + 1;elserdatalen <= 1;end// 操作地址自加always@(posedge phy_clk or negedge rst_n)begin if(!rst_n)mem_local_addr <= 1;else if(rdatalen == LEN)mem_local_addr <= mem_local_addr + LEN;endendmodule

测试代码

`timescale 1ns/1ps
module test_tb ();reg				clk 		;
reg				global_reset_n;wire  	[ 12: 0]	mem_addr 	;
wire  	[  2: 0] 	mem_ba 		;
wire				mem_cas_n 	;
wire				mem_cke 	;
wire				mem_clk 	;
wire 				mem_clk_n 	;
wire 				mem_cs_n 	;
wire 	[  1: 0]	mem_dm 		;
wire	[ 15: 0]	mem_dq 		;
wire	[  1: 0]	mem_dqs 	;
wire				mem_odt 	;
wire				mem_ras_n 	;
wire				mem_we_n 	;ddr2wrtest u1 (.clk 			(clk 			),    // Clock.global_reset_n (global_reset_n ) ,  // Asynchronous reset active low.mem_addr 		(mem_addr 		),	.mem_ba 		(mem_ba 		),	.mem_cas_n 		(mem_cas_n 		),	.mem_cke 		(mem_cke 		),	.mem_clk 		(mem_clk 		),	.mem_clk_n 		(mem_clk_n 		),	.mem_cs_n 		(mem_cs_n 		),	.mem_dm 		(mem_dm 		),	.mem_dq 		(mem_dq 		),	.mem_dqs 		(mem_dqs 		),	.mem_odt 		(mem_odt 		),	.mem_ras_n 		(mem_ras_n 		),	.mem_we_n 		(mem_we_n 		)	);ddr2_mem_model mem (.mem_dq      (mem_dq),.mem_dqs     (mem_dqs),.mem_dqs_n   (mem_dqs_n),.mem_addr    (mem_addr),.mem_ba      (mem_ba),.mem_clk     (mem_clk),.mem_clk_n   (mem_clk_n),.mem_cke     (mem_cke),.mem_cs_n    (mem_cs_n),.mem_ras_n   (mem_ras_n),.mem_cas_n   (mem_cas_n),.mem_we_n    (mem_we_n),.mem_dm      (mem_dm),.mem_odt     (mem_odt));
always #10 clk = ~clk;
initial begin clk = 0;global_reset_n = 0;@(posedge clk);@(posedge clk);@(posedge clk);@(posedge clk);@(posedge clk);@(posedge clk);@(posedge clk);@(posedge clk);@(posedge clk);global_reset_n = 1;
end
endmodule

相关文章:

DDR2 IP核调式记录2

本文相对简单&#xff0c;只供自己看看就行。从其它的博客找了个代码&#xff0c;然后记录下仿真波形。 1. 功能 直接使用quartus生成的DDR2 IP核&#xff0c;然后实现循环 -->写入burst长度的数据后读出。 代码数据的传输是32位&#xff0c;实际使用了两片IC。因此IP核也是…...

【ES6】js 中class的extends、super关键字用法和避坑点

在JavaScript中&#xff0c;使用class关键字可以实现面向对象编程。其中&#xff0c;extends和super是两个非常重要的关键字&#xff0c;它们分别用于实现类的继承和调用父类的方法。 一、extends关键字 extends关键字用于实现类的继承&#xff0c;它可以让一个子类继承父类的…...

mysql排名函数row_number()over(order by)和with * as 的用法

601. 体育馆的人流量(力扣mysql题,难度:困难) 表&#xff1a;Stadium ------------------------ | Column Name | Type | ------------------------ | id | int | | visit_date | date | | people | int | ------------------------vis…...

linux局域网IP地址冲突检测

使用keepalived设置vip的时候&#xff0c;发现vip无法连接&#xff0c;经查是出现了ip地址冲突&#xff0c;使用了一个在用的ip作为了vip&#xff0c;但是这个ip其实ping不通&#xff0c;因为目标机禁用了ping&#xff0c;也即是丢弃了ICMP包。 一、那么怎么检测IP地址是否已经…...

远距离WiFi模组方案,实现移动设备之间高效通信,无人机远程图传应用

随着科技的不断进步&#xff0c;无线通信技术也在日新月异地发展。其中&#xff0c;WiFi技术已经成为现代生活中不可或缺的一部分。 从室内到室外&#xff0c;WiFi的应用场景正在不断扩大&#xff0c;为我们的日常生活和工业生产带来了极大的便利。 WiFi技术&#xff0c;即无…...

Docker构建Springboot项目,并发布测试

把SpringBoot项目打包成Docker镜像有两种方案&#xff1a; 全自动化&#xff1a;先打好docker镜像仓库&#xff0c;然后在项目的maven配置中配置好仓库的地址&#xff0c;在项目里配置好Dockerfile文件&#xff0c;这样可以直接在idea中打包好后自动上传到镜像仓库&#xff0c…...

flutter架构全面解析

Flutter 是一个跨平台的 UI 工具集&#xff0c;它的设计初衷&#xff0c;就是允许在各种操作系统上复用同样的代码&#xff0c;例如 iOS 和 Android&#xff0c;同时让应用程序可以直接与底层平台服务进行交互。如此设计是为了让开发者能够在不同的平台上&#xff0c;都能交付拥…...

QHttpServer

QLineEdit-----输入提示 改动CmakeLists.txt 在帮助–索引查找QHttpServer 改动CmakeLists.txt&#xff0c;有三处改动 在谷歌浏览器测试&#xff0c;输入127.0.0.1/api/login 测试代码 #include<QCoreApplication> #include <QHttpServer> //http服务器 int m…...

21.3 CSS 背景属性

1. 背景颜色 background-color属性: 设置元素的背景颜色. 它可以接受各种颜色值, 包括命名颜色, 十六进制颜色码, RGB值, HSL值等.快捷键: bctab background-color:#fff;<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…...

Ansible 常用命令50条

以下是 Ansible 常用的 50 条命令&#xff1a; ansible --version: 查看 Ansible 版本信息。ansible all -m ping: 检查所有主机的连通性。ansible-playbook playbook.yml: 运行指定的 Ansible Playbook 文件。ansible-doc module_name: 查看指定模块的帮助文档。ansible-conf…...

ceph源码阅读 erasure-code

1、ceph纠删码 纠删码(Erasure Code)是比较流行的数据冗余的存储方法&#xff0c;将原始数据分成k个数据块(data chunk)&#xff0c;通过k个数据块计算出m个校验块(coding chunk)。把nkm个数据块保存在不同的节点&#xff0c;通过n中的任意k个块还原出原始数据。EC包含编码和解…...

C++ 之 命名空间

namespace_百度百科&#xff0c;有示例...

MyBatis关系映射

文章目录 前言一、一对一映射1.1 创建实体1.2 xml配置 二、一对多映射2.1 创建实体2.2 resultMap配置2.3 测试 三、 多对多映射3.1 创建实体3.2 resultMap配置3.3 测试 前言 MyBatis是一个Java持久化框架&#xff0c;它提供了一种将数据库表和Java对象之间进行关系映射的方式。…...

DVWA失效的访问控制

失效的访问控制&#xff0c;可以认为是系统对一些功能进行了访问或权限限制&#xff0c;但因为种种原因&#xff0c;限制并没有生效&#xff0c;造成失效的访问控制漏洞,比如越权等 这里以DVWA为例&#xff0c;先访问低难度的命令执行并抓包 删除cookie&#xff0c;并在请求头…...

docker 笔记2 Docker镜像和数据卷

参考&#xff1a; 1.镜像是什么&#xff1f;&#xff08;面试题&#xff09; 是一种轻量级、可执行的独立软件包&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文…...

java springboot 时间格式序列化 UTC8

背景 我们在项目中使用序列化和反序列化组件中&#xff0c;默认一般采用Jackson&#xff0c;如果遇到特殊配置&#xff0c;我们该怎么配置呢&#xff0c;大致有如下两种方式&#xff1a;采用配置文件【application.yml】和代码配置 配置文件 比如添加jackson节点 spring:jac…...

攻防世界-Get-the-key.txt

原题 解题思路 notepad看到&#xff0c;这应该是一个压缩包&#xff0c;解压。 但是解压的时候提示格式不对&#xff0c;不是zip&#xff0c;rar可以。解压出来有一个key.txt&#xff0c;打开就行。...

MyBatisPlus之DQL编程控制

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 MyBatisPlus之DQL编程控制 一、 条件查询方式&…...

本地使用GFPGAN进行图像人脸修复

人脸修复 1.下载项目和权重文件2.部署环境3.下载权重文件4.运行代码5.网页端体验 首先来看一下效果图 1.下载项目和权重文件 https://github.com/iptop/GFPGAN-for-Video.git2.部署环境 根据README文件部署好环境&#xff0c;额外还需要&#xff1a; cd GFPGAN-1.3.8 pyt…...

Linux--进程概念

1.什么是程序&#xff1f;什么是进程&#xff1f;有什么区别&#xff1f; 程序&#xff1a;是静态的概念&#xff0c;gcc xxx.c -o pro 磁盘中生成的pro文件&#xff0c;叫做程序。 进程&#xff1a;是程序的一种与运行活动&#xff0c;通俗的意思是程序跑起来了&#xff0c;系…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...