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
本文相对简单,只供自己看看就行。从其它的博客找了个代码,然后记录下仿真波形。 1. 功能 直接使用quartus生成的DDR2 IP核,然后实现循环 -->写入burst长度的数据后读出。 代码数据的传输是32位,实际使用了两片IC。因此IP核也是…...
【ES6】js 中class的extends、super关键字用法和避坑点
在JavaScript中,使用class关键字可以实现面向对象编程。其中,extends和super是两个非常重要的关键字,它们分别用于实现类的继承和调用父类的方法。 一、extends关键字 extends关键字用于实现类的继承,它可以让一个子类继承父类的…...
mysql排名函数row_number()over(order by)和with * as 的用法
601. 体育馆的人流量(力扣mysql题,难度:困难) 表:Stadium ------------------------ | Column Name | Type | ------------------------ | id | int | | visit_date | date | | people | int | ------------------------vis…...
linux局域网IP地址冲突检测
使用keepalived设置vip的时候,发现vip无法连接,经查是出现了ip地址冲突,使用了一个在用的ip作为了vip,但是这个ip其实ping不通,因为目标机禁用了ping,也即是丢弃了ICMP包。 一、那么怎么检测IP地址是否已经…...
远距离WiFi模组方案,实现移动设备之间高效通信,无人机远程图传应用
随着科技的不断进步,无线通信技术也在日新月异地发展。其中,WiFi技术已经成为现代生活中不可或缺的一部分。 从室内到室外,WiFi的应用场景正在不断扩大,为我们的日常生活和工业生产带来了极大的便利。 WiFi技术,即无…...
Docker构建Springboot项目,并发布测试
把SpringBoot项目打包成Docker镜像有两种方案: 全自动化:先打好docker镜像仓库,然后在项目的maven配置中配置好仓库的地址,在项目里配置好Dockerfile文件,这样可以直接在idea中打包好后自动上传到镜像仓库,…...
flutter架构全面解析
Flutter 是一个跨平台的 UI 工具集,它的设计初衷,就是允许在各种操作系统上复用同样的代码,例如 iOS 和 Android,同时让应用程序可以直接与底层平台服务进行交互。如此设计是为了让开发者能够在不同的平台上,都能交付拥…...
QHttpServer
QLineEdit-----输入提示 改动CmakeLists.txt 在帮助–索引查找QHttpServer 改动CmakeLists.txt,有三处改动 在谷歌浏览器测试,输入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 条命令: 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)是比较流行的数据冗余的存储方法,将原始数据分成k个数据块(data chunk),通过k个数据块计算出m个校验块(coding chunk)。把nkm个数据块保存在不同的节点,通过n中的任意k个块还原出原始数据。EC包含编码和解…...
C++ 之 命名空间
namespace_百度百科,有示例...
MyBatis关系映射
文章目录 前言一、一对一映射1.1 创建实体1.2 xml配置 二、一对多映射2.1 创建实体2.2 resultMap配置2.3 测试 三、 多对多映射3.1 创建实体3.2 resultMap配置3.3 测试 前言 MyBatis是一个Java持久化框架,它提供了一种将数据库表和Java对象之间进行关系映射的方式。…...
DVWA失效的访问控制
失效的访问控制,可以认为是系统对一些功能进行了访问或权限限制,但因为种种原因,限制并没有生效,造成失效的访问控制漏洞,比如越权等 这里以DVWA为例,先访问低难度的命令执行并抓包 删除cookie,并在请求头…...
docker 笔记2 Docker镜像和数据卷
参考: 1.镜像是什么?(面试题) 是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文…...
java springboot 时间格式序列化 UTC8
背景 我们在项目中使用序列化和反序列化组件中,默认一般采用Jackson,如果遇到特殊配置,我们该怎么配置呢,大致有如下两种方式:采用配置文件【application.yml】和代码配置 配置文件 比如添加jackson节点 spring:jac…...
攻防世界-Get-the-key.txt
原题 解题思路 notepad看到,这应该是一个压缩包,解压。 但是解压的时候提示格式不对,不是zip,rar可以。解压出来有一个key.txt,打开就行。...
MyBatisPlus之DQL编程控制
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 MyBatisPlus之DQL编程控制 一、 条件查询方式&…...
本地使用GFPGAN进行图像人脸修复
人脸修复 1.下载项目和权重文件2.部署环境3.下载权重文件4.运行代码5.网页端体验 首先来看一下效果图 1.下载项目和权重文件 https://github.com/iptop/GFPGAN-for-Video.git2.部署环境 根据README文件部署好环境,额外还需要: cd GFPGAN-1.3.8 pyt…...
Linux--进程概念
1.什么是程序?什么是进程?有什么区别? 程序:是静态的概念,gcc xxx.c -o pro 磁盘中生成的pro文件,叫做程序。 进程:是程序的一种与运行活动,通俗的意思是程序跑起来了,系…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
