在该页面中,我们去掉了q output port(去掉输出寄存器),并且添加了一个rden读使能信号,所谓rden读使能信号就是,当该信号为高电平时,我们才可以读取RAM IP核中的数据。
其余的页面我们使用默认设置即可,不要忘记勾选inst初始化模板文件。

//该代码主要实现了先往RAM IP核中的0-31地址写入0-31数据,
//每个地址对应一个数据,比如0地址对应0数据,1地址对应1数据,以此类推
//写完了32个数据之后,我们在将RAM IP核中的0-31地址中的数据读出
//当写数据时,我们需要将写使能信号拉高,当读数据时,我们需要将读使能信号拉高

//该代码主要实现了先往RAM IP核中的0-31地址写入0-31数据,
//每个地址对应一个数据,比如0地址对应0数据,1地址对应1数据,以此类推
//写完了32个数据之后,我们在将RAM IP核中的0-31地址中的数据读出
//当写数据时,我们需要将写使能信号拉高,当读数据时,我们需要将读使能信号拉高

module verilog_ip_RAM
(
input clk_50M,
input   RST_N,
/*RAM端口*/
output reg [4:0] address,  //RAM的地址端口
output reg [7:0] wrdata,   //RAM的写数据端口
output [7:0] rddata,   //RAM的读数据端口
output reg [5:0] time_cnt,  //计数器
output  wren,                   //RAM的写使能端口
output  rden                    //RAM的读使能端口
);//计数器
reg [5:0] time_cnt_n;//time_cnt的下一个状态//RAM的地址端口
reg [4:0] address_n;  //address的下一个状态//RAM的写数据端口
reg [7:0] wrdata_n;  //wrdata的下一个状态//时序逻辑电路,用来给time_cnt寄存器赋值
always @ (posedge clk_50M or negedge RST_N)
begin
if(!RST_N)time_cnt<=1'b0;
elsetime_cnt<=time_cnt_n;
end/*组合电路*/
always @ (*)
beginif(time_cnt==6'd63)time_cnt_n=0;elsetime_cnt_n=time_cnt+1;
end/*时序电路,用来给address寄存器赋值*/
always @ (negedge clk_50M or negedge RST_N)
beginif(!RST_N)address<=1'b0;elseaddress<=address_n;
end/*组合电路,用来生成RAM地址*/
always @ (*)
beginif(address==5'd31)address_n=1'b0;elseaddress_n=address+1'b1;
end/*组合电路,根据计数器用来生成RAM写使能*/
assign wren = (time_cnt>=1'b0&&time_cnt<=5'd31)?1'b1:1'b0;/*时序电路,用来给wrdata寄存器赋值*/
always @ (negedge clk_50M or negedge RST_N)
beginif(!RST_N)wrdata<=1'b0;elsewrdata<=wrdata_n;
end/*组合电路,根据计数器用来生成写入RAM的数据*/
always @ (*)
beginif(time_cnt>=1'b0&&time_cnt<=5'd31)wrdata_n=time_cnt;elsewrdata_n=wrdata;end/*组合电路,根据计数器用来生成RAM读使能*/
assign rden =(time_cnt>=6'd32&&time_cnt<=6'd63)?1'b1:1'b0;/*RAM IP核模块*/RAM RAM_inst (.address ( address ),  //RAM的地址端口.clock ( clk_50M ),  //时钟端口.data ( wrdata ),//RAM的写数据端口.rden ( rden ),   //RAM的读使能端口.wren ( wren ),   //RAM的写使能端口.q ( rddata )     //RAM的读数据端口);endmodule


写数据如上图所示
从图中可以看到写使能信号为高,读使能信号为低时候,该操作就是往RAM IP核里面写数据。
上升沿,数据生成由time_cnt生成,在下降沿进行写数据,由上图可以看到在地址30的时候,就写入数据30,在地址31的时候,就写入数据31.


读数据如上图所示
读数据由于有一个寄存器的延时,在下降沿的地址递增,在下一个上升沿输出对应地址的数据。
也可以用signal tap II 调试观察


verilog基础篇RAM IP核的使用相关推荐

  1. 【Verilog基础】ROM IP 核基础知识

    本小节为大家介绍一种较为常用的存储类 IP 核--ROM 的使用方法. ROM 是只读存储器(Read-Only Memory)的简称,是一种只能读出事先所存数据的固态半导体存储器.其特性是一旦储存资 ...

  2. (43)Xilinx RAM IP核配置(四)(第9天)

    (43)Xilinx RAM IP核配置(四)(第9天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Xilinx RAM IP核配置(四)(第9天) 5)技术 ...

  3. SPI和RAM IP核

    学习目的: (1) 熟悉SPI接口和它的读写时序: (2) 复习Verilog仿真语句中的$readmemb命令和$display命令: (3) 掌握SPI接口写时序操作的硬件语言描述流程(本例仅以写 ...

  4. 如何将自己写的verilog模块封装成IP核(二)

    =======================第一篇======================= 如何将自己写的verilog模块封装成IP核 将你的设计制作成BlackBox,也就是网表文件,这样 ...

  5. (59)简单介绍RAM IP核类型和接口信号?

    1.1 简单介绍RAM IP核类型和接口信号? 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)简单介绍RAM IP核类型和接口信号?: 5)结束语. 1.1.2 本节引 ...

  6. ISE使用中RAM IP核配置及ram测试(两种测试)

    简单总结ISE中RAM的ip核配置过程以及相关的端口. 分类 ram分为分布式ram(distributed ram)以及块ram(block ram) 前者是自己用寄存器搭建的,这里理解可以转至Vi ...

  7. ZYNQ之FPGA学习----RAM IP核使用实验

    1 RAM IP核介绍 RAM 的英文全称是 Random Access Memory, 即随机存取存储器, 它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度 ...

  8. Xilinx RAM IP核的使用

    背景 RAM和ROM也是类似的,由于这也是常用的IP核,所有完全有必要在这里记录一下,以后用到了实际后,再补充到实际工程中.随机存储器(RAM),它可以随时从任一指定地址读出数据,也可以随时把数据写入 ...

  9. FPGA中ROM IP与RAM IP核配置与调用

    目录 一.ROM IP核 1.简介 2.创建立初始化文件 3.配置 4.调用 4.1 整体设计 4.2 编写rtl代码: 4.3 仿真验证 二.RAM IP核 1.简介 2.配置 3.调用 3.1 整 ...

最新文章

  1. 2020 年 6 月编程语言排行榜,C 稳居第一,Rust 首进 Top 20!
  2. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(1):Mybatis和Hibernate概念理解...
  3. spring data mongo比较两个字段查询
  4. Spring学习(二)Spring IoC 和 DI 简介
  5. nginx http子模块conf的初始化
  6. 联想微型计算机报价,联想电脑一体机报价
  7. msg_p!=(void*) 0 --消息邮箱(点滴学习)
  8. 用友U8常见问题之最大单据号修复语句
  9. SSH应用之BBS之路-1、项目构设之数据库设计
  10. 听说社保不能补缴了,像我们这种没缴社保的打工者,该怎么办?
  11. sinx/x的极限为什么是1_某个波长的激光最小的聚焦光斑可以到多少?怎么让聚焦光斑更细?为什么聚焦系统要用扩束镜?...
  12. Mysql数据库 自动增长 重新从0开始
  13. Linux 基本命令(自学笔记)
  14. C/C++中的位运算
  15. 模拟电路 二极管伏安特性(一)
  16. 开学季,微信公众号图文排版必备十大素材
  17. 淘宝为何总是有骗子账号屡禁不止,气愤之下只能发帖告诫了
  18. Android 圆形头像实现
  19. 首届西瓜PLAY视频嘉年华狂欢来袭,万张门票几近售罄
  20. “顶流”长沙,如何发展MCN?

热门文章

  1. Redis 和 Memcached 的区别
  2. Google Dremel数据模型详解(下)
  3. struts2处理请求流程详解
  4. 八种方法防止数据库被下载
  5. linux安装apache mysql tomcat
  6. bochs调试linux内核学习4 - bochs配置文件的$BXSHARE变量、bochs的System BIOS must end at 0xfffff错误、运行内核0.00版本
  7. Win 驱动编程 - 内核里操作注册表
  8. 案例实作图解.Net Entity Framework 教程
  9. 小程序 获取用户信息
  10. SpringBoot中自定义Banner(启动图案)