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

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

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

相关文章

51单片机热水器温度控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

51单片机热水器温度控制系统仿真设计 1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单 &&下载链接 51单片机热水器温度控制系统仿真设计( proteus仿真程序原理图报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#x…

【图解RabbitMQ-2】图解JMS规范与AMQP协议是什么

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

FreeRTOS操作系统中,断言输出 Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,766 原因

分析&#xff1a;Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,766 出现这个原因表示&#xff0c;你现在系统某个中断的优先级高于FreeRTOS可管理的优先级范围&#xff0c;一旦你这个中断触发&#xff0c;断言的信息即你串口就会输出这个条语句&#xff08;前提你串口…

这3个教学难题,你中招了吗?

在当今教育领域&#xff0c;提高教育质量和学生学习成果是学校和教育机构的首要任务之一。教育管理者、教师和政策制定者都在寻求创新的方法来监督和改进教育过程。 在线巡课系统应运而生&#xff0c;成为教育界的一项重要工具&#xff0c;旨在帮助学校管理者更好地理解教育实践…

Python爬虫:下载小红书无水印图片、视频

该代码只提供学习使用&#xff0c;该项目是基于https://github.com/JoeanAmier/XHS_Downloader的小改动 1.下载项目 git clone https://github.com/zhouayi/XHS_Downloader.git2.找到需要下载的文章的ID 写入main.py中 3.下载 python main.py最近很火的莲花楼为例<嘿嘿…

uniapp 集成蓝牙打印功能(个人测试佳博打印机)

uniapp 集成蓝牙打印功能&#xff08;个人测试京博打印机&#xff09; uniapp 集成蓝牙打印功能集成佳博内置的接口 uniapp 集成蓝牙打印功能 大家好今天分析的是uniapp 集成蓝牙打印功能&#xff0c;个人开发是app,应该是支持H5(没试过) 集成佳博内置的接口 下载dome地址&…

【Apollo】开启Apollo之旅:让自动驾驶如此简单

前言 Apollo 是百度公司推出的自动驾驶平台。它是一个综合性的自动驾驶解决方案&#xff0c;提供了包括感知、决策、规划和控制等核心功能&#xff0c;以及地图、定位、仿真、数据管理等配套工具。 文章目录 前言Apollo 的发展历程Apollo 8.0新特性软件包管理感知框架工具链小…

开发指导—利用 CSS 动画实现 HarmonyOS 动效(二)

注&#xff1a;本文内容分享转载自 HarmonyOS Developer 官网文档 点击查看《开发指导—利用CSS动画实现HarmonyOS动效&#xff08;一&#xff09;》 3. background-position 样式动画 通过改变 background-position 属性&#xff08;第一个值为 X 轴的位置&#xff0c;第二个…

西电Latex毕业模板使用时的小技巧

西电Latex毕业模板 配置的环境&#xff1a;textlivetextstudio \qqad 空格 参考文献先设置成bib&#xff0c;放到tex文件下&#xff0c;然后如下操作就可以将参考文献加载进去 如果搜不到相关文献的bib格式&#xff0c;可以用zotero软件将下载好的文件导出为bib格式&#xf…

Hadoop HDFS 高阶优化方案

目录 一、短路本地读取&#xff1a;Short Circuit Local Reads 1.1 背景 ​1.2 老版本的设计实现 ​1.3 安全性改进版设计实现 1.4 短路本地读取配置 1.4.1 libhadoop.so 1.4.2 hdfs-site.xml 1.4.3 查看 Datanode 日志 二、HDFS Block 负载平衡器&#xff1a;Balan…

详解4种类型的爬虫技术

聚焦网络爬虫是“面向特定主题需求”的一种爬虫程序&#xff0c;而通用网络爬虫则是捜索引擎抓取系统&#xff08;Baidu、Google、Yahoo等&#xff09;的重要组成部分&#xff0c;主要目的是将互联网上的网页下载到本地&#xff0c;形成一个互联网内容的镜像备份。 增量抓取意…

Java“牵手”阿里巴巴商品列表数据,关键词搜索阿里巴巴商品数据接口,阿里巴巴API申请指南

阿里巴巴商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取阿里巴巴商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问阿里巴巴商城的网页来获取商品详情信息。以下是两种常用方…

华为数通方向HCIP-DataCom H12-821题库(单选题:261-280)

第261题 以下关于IPv6过渡技术的描述,正确的是哪些项? A、转换技术的原理是将IPv6的头部改写成IPv4的头部,或者将IPv4的头部改写成IPv6的头部 B、使用隧道技术,能够将IPv4封装在IPv6隧道中实现互通,但是隧道的端点需要支持双栈技术 C、转换技术适用于纯IPv4网络与纯IPv…

系统学习Linux-PXE无人值守装机(附改密)

目录 pxe实现系统自动安装pxe工作原理 大致的工作过程如下&#xff1a; PXE的组件&#xff1a; 一、配置vsftpd 二、配置tftp 三、准备pxelinx.0文件、引导文件、内核文件 四、配置dhcp 配置ip 配置dhcp 五、创建default文件 六、新建测试主机用来测试装机效果 七、…

SQLite简单介绍

一.简单介绍 SQLite是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的&#xff0c;而且已经在很多嵌入式产品中使用了它&#xff0c;它占用资源非常的低&…

uni-app 之 目录结构

目录结构&#xff1a; 工程简介 | uni-app官网 (dcloud.net.cn) pages/index/index.vue 页面元素等 static 静态文件&#xff0c;图片 字体文件等 App.vue 应用配置&#xff0c;用来配置App全局样式以及监听 应用生命周期 index.html 项目运行最终生成的文件 main.js 引用的…

Jenkins

文章目录 下载安装登录安装插件创建用户配置访问地址访问jenkins操作页面再次确认插件 配置配置maven配置jdk远程配置凭证应用服务器 下载安装 我使用的是Docker 参考链接https://blog.csdn.net/a3562323/article/details/108490419?csdn_share_tail%7B%22type%22%3A%22blog%…

Fiddler中 AutoResponder 使用

Fiddler的 AutoResponder &#xff0c;即URL重定向功能非常强大。不管我们做URL重定向&#xff0c;还是做mock测试等&#xff0c;都可以通过该功能进行实践。 下面&#xff0c;小酋就来具体讲下该功能的用法。 Enable rules 启用规则Unmatched requests passthrough 没有匹配…

知识储备--基础算法篇-矩阵

2.矩阵 2.1第54题螺旋矩阵 第一题上来就跪了&#xff0c;看了官方答案感觉不是很好理解&#xff0c;找了一个比较容易理解的。 class Solution(object):def spiralOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""…

【JMeter】 二次开发插件开发 Dubbo 接口测试插件浅析

概述 在一些企业中&#xff0c;各类业务系统非常丰富&#xff0c;相互之间或对外提供很多的服务或接口这些服务或接口中&#xff0c;有很多是需要强契约约束的&#xff0c;服务的提供方、服务的使用方必须遵守相同契约这类服务最典型的就是RPC&#xff0c;其中应用广泛的有Dub…