ZYNQ之FPGA学习----RAM IP核使用实验
1 RAM IP核介绍
RAM 的英文全称是 Random Access Memory, 即随机存取存储器
, 它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度由时钟频率决定
Xilinx 7 系列器件具有嵌入式存储器结构,嵌入式存储器结构由一列列 BRAM(块 RAM)存储器模块
组成,通过对这些 BRAM 存储器模块进行配置,可以实现各种存储器的功能,例如:RAM、移位寄存器、ROM 以及 FIFO 缓冲器
Vivado 软件自带了 BMG IP 核(Block Memory Generator,块 RAM 生成器),可以配置成 RAM 或者 ROM
2 实验任务
实验任务是使用 Xilinx BMG IP 核,配置成一个单端口的 RAM
,然后对 RAM 进行读写操作。BMG IP 核配置成单端口 RAM 如图所示:
图片来自《领航者ZYNQ之FPGA开发指南》
- DINA: RAM 端口 A 写数据信号
- ADDRA: RAM 端口 A 读写地址信号,对于单端口 RAM 来说,读地址和写地址共用同该地址线
- WEA: RAM 端口 A 写使能信号,
高电平
表示向 RAM 中写入数据,低电平
表示从 RAM 中读出数据 - ENA: 端口 A 的使能信号,
高电平
表示使能端口 A,低电平
表示端口 A 被禁止,禁止后端口 A 上的读写操作都会变成无效。另外 ENA 信号是可选的,当取消该使能信号后,RAM 会一直处于有效状态 - RSTA: RAM 端口 A 复位信号,可配置成高电平或者低电平复位,该复位信号是一个可选信号
- REGCEA: RAM 端口 A 输出寄存器使能信号,当 REGCEA 为高电平时,DOUTA 保持最后一次输出的数据,REGCEA 同样是一个可选信号
- CLKA: RAM 端口 A 的时钟信号
- DOUTA: RAM 端口 A 读出的数据
3 实验设计
3.1 创建工程
新建工程,操作如图所示:
输入工程名和工程路径,如图所示:
选择创建RTL工程,如图所示:
直接点击Next:
继续点击Next:
添加芯片型号,操作如图所示:
完成工程创建:
3.2 设计输入
点击IP Catalog,搜索Block Memory,如图所示:
双击Block Memory Generator,弹出如下窗口:
- Component Name: 设置该 IP 核的名称
- Interface Type: RAM 接口总线,选择 Native 接口类型(标准 RAM 接口总线)
- Memory Type: 存储器类型,可配置成 Single Port RAM(单端口 RAM)、Simple Dual Port RAM(伪双端口 RAM)、True Dual Port RAM(真双端口 RAM)、Single Port ROM(单端口 ROM)和 Dual Port ROM(双端口 ROM),本实验选择 Single Port RAM,即配置成
单端口 RAM
- ECC Options: Error Correction Capability,纠错能力选项,单端口 RAM 不支持 ECC
- Write Enable: 字节写使能选项,勾中后可以单独将数据的某个字节写入 RAM 中
- Algorithm Options: 算法选项,可选择 Minimum Area(最小面积) 、 Low Power(低功耗)和 Fixed Primitives(固定的原语)
设置端口A的参数,如图所示:
- Write Width: 端口 A 写数据位宽,单位 Bit
- Read Width: 端口 A 读数据位宽,一般和写数据位宽保持一致
- Write Depth: 写深度,即 RAM 所能访问的地址范围为 0-31
- Read Depth: 读深度,默认和写深度保持一致
- Operating Mode: RAM 读写操作模式,共分为三种模式,分别是 Write First(写优先模式)、Read First(读优先模式)和 No Change(不变模式)。写优先模式指数据先写入 RAM 中,然后在下一个时钟输出该数据;读优先模式指数据先写入 RAM 中,同时输出 RAM 中同地址的上一次数据;不变模式指读写分开操作,不能同时进行读写
- Enable Port Type: 使能端口类型,Use ENA pin(添加使能端口 A 信号);Always Enabled(取消使能信号,端口 A 一直处于使能状态)
- Port A Optional Output Register: 端口 A 输出寄存器选项,其中Primitives Output Register默认是选中状态,作用是打开 BRAM 内部位于输出数据总线之后的输出流水线寄存器
- Port A Output Reset Options: RAM 复位信号选项
Other Options 选项界面用于设置 RAM 的初始值:
Summary选项界面显示了存储器的类型,消耗的 BRAM 资源等,如图所示:
弹出如下窗口,直接点击Generate:
点击OK即可:
IP 核自动生成的只读的 verilog 例化模板文件,双击打开,如图所示:
创建工程顶层文件,操作如图所示:
创建文件,输入文件名ip_ram:
创建完成:
双击打开,输入代码如下:
module ip_ram( input sys_clk , //系统时钟 input sys_rst_n, //系统复位,低电平有效 output ram // 任意定义); //wire define
wire ram_en ; //RAM 使能
wire ram_wea ; //ram 读写使能信号,高电平写入,低电平读出
wire [4:0] ram_addr ; //ram 读写地址
wire [7:0] ram_wr_data ; //ram 写数据
wire [7:0] ram_rd_data ; //ram 读数据 //ram 读写模块
ram_rw u_ram_rw( .clk (sys_clk ), .rst_n (sys_rst_n ),
//RAM .ram_en (ram_en ), .ram_wea (ram_wea ), .ram_addr (ram_addr ), .ram_wr_data (ram_wr_data ), .ram_rd_data (ram_rd_data ) ); //ram ip 核
blk_mem_gen_0 blk_mem_gen_0 ( .clka (sys_clk ), // input wire clka .ena (ram_en ), // input wire ena .wea (ram_wea ), // input wire [0 : 0] wea .addra (ram_addr ), // input wire [4 : 0] addra .dina (ram_wr_data ), // input wire [7 : 0] dina .douta (ram_rd_data ) // output wire [7 : 0] douta );
endmodule
继续创建文件ram_rw,如图所示:
双击打开,输入代码:
module ram_rw( input clk , //时钟信号 input rst_n , //复位信号,低电平有效 output ram_en , //ram 使能信号 output ram_wea , //ram 读写选择 output reg [4:0] ram_addr , //ram 读写地址 output reg [7:0] ram_wr_data, //ram 写数据 input [7:0] ram_rd_data //ram 读数据 ); //reg define
reg [5:0] rw_cnt ; //读写控制计数器
//控制 RAM 使能信号
assign ram_en = rst_n;
//rw_cnt 计数范围在 0~31,写入数据;32~63 时,读出数据
assign ram_wea = (rw_cnt <= 6'd31 && ram_en == 1'b1) ? 1'b1 : 1'b0; //读写控制计数器,计数器范围 0~63
always @( posedge clk or negedge rst_n) begin if(rst_n == 1'b0)rw_cnt <= 1'b0; else if(rw_cnt == 6'd63) rw_cnt <= 1'b0; else rw_cnt <= rw_cnt + 1'b1;
end //产生 RAM 写数据
always @( posedge clk or negedge rst_n) begin if(rst_n == 1'b0) ram_wr_data <= 1'b0; else if(rw_cnt <= 6'd31) //在计数器的 0-31 范围内,RAM 写地址累加 ram_wr_data <= ram_wr_data + 1'b1; else ram_wr_data <= 1'b0 ;
end //读写地址信号 范围:0~31
always @( posedge clk or negedge rst_n) begin if(rst_n == 1'b0) ram_addr <= 1'b0; else if(ram_addr == 5'd31) ram_addr <= 1'b0; else ram_addr <= ram_addr + 1'b1;
end endmodule
如图所示:
3.3 分析与综合
对设计进行分析,操作如图所示:
分析后的设计,Vivado自动生成顶层原理图,如图所示:
对设计进行综合,操作如图所示:
综合完成后,弹出窗口如下,直接关闭:
3.4 约束输入
创建约束文件,操作如图所示:
创建文件,输入文件名:
双击打开,输入约束代码:
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
如图所示:
3.5 设计实现
点击 Flow Navigator 窗口中的 Run Implementation,如图所示:
点击OK:
报错,如图所示:
错误解决方案:Vivado 设计实现时报错The design is empty的解决方案(亲测有效)
3.6 功能仿真
创建TestBench,操作如图所示:
创建文件,输入文件名:
创建完成:
双击打开,输入TestBench(激励)代码:
`timescale 1ns / 1ps module tb_ip_ram (); reg sys_clk;
reg sys_rst_n; always #10 sys_clk = ~sys_clk; initial begin sys_clk = 1'b0; sys_rst_n = 1'b0; #200 sys_rst_n = 1'b1;
end ip_ram u_ip_ram( .sys_clk (sys_clk ), .sys_rst_n (sys_rst_n ) ); endmodule
如图所示:
开始进行仿真,操作如下:
选择HDL仿真对象,这里把我们解决错误时,任意添加的输出ram也选择了(不需要选择):
选择HDL仿真对象:
点击Restart,波形窗口中的当前仿真时刻点回归到0ns:
删掉误添加的ram,开始仿真,ram进行写操作:
ram进行读操作:
关闭仿真:
点击OK即可:
3.7 下载验证
由于疫情,一直无法去实验室,故ZYNQ开发板不在身边,该步骤内容待更新
致谢领航者ZYNQ开发板,开启FPGA学习之路!
希望本文对大家有帮助,上文若有不妥之处,欢迎指正
分享决定高度,学习拉开差距
ZYNQ之FPGA学习----RAM IP核使用实验相关推荐
- FPGA学习---3.IP核使用,Counter IP核
三 LPM--counter IP核使用 小结:counter(IP核)cin进位输入,clock时钟信号,cout进位输出,q当前计数值 FPGA设计方式 调用IP核 路径放到prj的ip文件夹下 ...
- Altera FPGA 储存单元IP核之RAM、FIFO
一.储存单元简介 1.ROM 只读存储器,系统上电后数据就被写入ROM,运行过程中只能从ROM中读取数据,而不能改变ROM中的数值. 2.RAM 随机存取储存器,可以随时把数据写入任一指定地址的储存单 ...
- 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 整 ...
- FPGA 单端口RAM IP核使用 vivado仿真
一.各类存储器简介 ROM:只读,只有读接口(读地址.读数据) RAM:可读可写,有读接口(读地址.读数据)和写接口(写使能.写数据.写地址),默认任何时刻都能读,没有读使能,大小和位宽查手册,需要持 ...
- SPI和RAM IP核
学习目的: (1) 熟悉SPI接口和它的读写时序: (2) 复习Verilog仿真语句中的$readmemb命令和$display命令: (3) 掌握SPI接口写时序操作的硬件语言描述流程(本例仅以写 ...
- (43)Xilinx RAM IP核配置(四)(第9天)
(43)Xilinx RAM IP核配置(四)(第9天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Xilinx RAM IP核配置(四)(第9天) 5)技术 ...
- 通过vivado工具实现zynq的FPGA内部RAM读写
通过vivado工具实现zynq的FPGA内部RAM读写(调用vivado自带IP核),从新建工程到仿真并下载到FPGA开发板中,通过vivado自带的ILA逻辑分析仪查看读写数据是否正确,包含详细步 ...
- (59)简单介绍RAM IP核类型和接口信号?
1.1 简单介绍RAM IP核类型和接口信号? 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)简单介绍RAM IP核类型和接口信号?: 5)结束语. 1.1.2 本节引 ...
- ISE使用中RAM IP核配置及ram测试(两种测试)
简单总结ISE中RAM的ip核配置过程以及相关的端口. 分类 ram分为分布式ram(distributed ram)以及块ram(block ram) 前者是自己用寄存器搭建的,这里理解可以转至Vi ...
最新文章
- Fedora安装Nvidia显卡驱动方法
- bat怎么获取前一天 的日期_bat脚本 得到前一天的日期
- 给Visual Studio Code的文件夹和文件替换图标
- PID控制器开发笔记之一:PID算法原理及基本实现
- canvas路径剪切和判断是否在路径内
- 【Es】Es 集群设置分片很大导致集群无法选举主节点异常等
- 最大子序和--动态规划
- Jmeter查看log日志
- 我的世界java版地牢种子_《我的世界》12个地牢种子位置解析
- sys caffe教程
- Docker容器化部署报Fatal error: Can‘t open and lock privilege tables: Table ‘mysql.user‘ doesn‘t exis的解决办法
- 用Python批量修改文件名称
- 计算机图形学圆反走样代码,计算机图形学——反走样
- C语言迷宫如何实现多个关卡,c语言实现迷宫问题#仅供借鉴
- halcon在图片上画几何形状并保存
- 今天是教师节,我也即将成为一名老师
- vue关于时间顺序排序
- 14. Setting Ta and RTO【设置Ta和RTO】
- Windows workflow foundation入门
- 【动态规划】字符串类型动态规划