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

news2025/1/11 8:48:51

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学习之路!

希望本文对大家有帮助,上文若有不妥之处,欢迎指正

分享决定高度,学习拉开差距

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenCV 例程 300篇】248. 特征描述之HOG描述符

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】248. 特征描述之HOG描述符 1. 方向梯度直方图 方向梯度直方图&#xff08;Histogram of Oriented Gradient, HOG&#xff09;使用梯度方向的分布作为特征来构造描述符&#xff0c;应用非常广泛。 梯…

07-HTTPS双向认证及Java案例

1.双向认证流程 客户端发起建立HTTPS连接请求&#xff0c;将SSL协议版本的信息发送给服务端&#xff1b;服务器端将本机的公钥证书&#xff08;server.crt&#xff09;发送给客户端&#xff1b;客户端读取公钥证书&#xff08;server.crt&#xff09;&#xff0c;取出了服务端公…

wordpress的手工迁移

我的场景 将某个在阿里云服务器&#xff08;windows操作系统&#xff09;上apache容器下的wordpress服务迁移到另一个linux主机上的apache上。 迁移要点 1、迁移源主机下的wordpress文件夹&#xff0c;在apache容器下的htdocs文件夹中 2、迁移数据库 3、根据目标&#xff0…

表弟大学毕业要学前端,我给他制定了一份亲属自学计划

表弟也终于到了马上要大学毕业的时间&#xff0c;然后听说我在做前端开发工作&#xff0c;就想着能不能和我一起搞一搞。 我说这又不是小时候一起去地里抓兔子&#xff0c;说走就一起走&#xff0c;拿上工具一起走了&#xff0c;这得学啊。看着表弟期待的眼神&#xff0c;他问了…

Scientific Reports|比较转录组分析揭示了杀菌剂氰烯菌酯对尖孢镰刀菌的抗性调控机制和杀菌活性

TITLE&#xff1a;Comparative transcriptome analysis reveals the resistance regulation mechanism and fungicidal activity of the fungicide phenamacril in Fusarium oxysporum 译名&#xff1a;比较转录组分析揭示了杀菌剂氰烯菌酯对尖孢镰刀菌的抗性调控机制和杀菌活性…

Java代码审计——文件操作漏洞

目录 &#xff08;一&#xff09;、 文件操作漏洞简介 &#xff08;二&#xff09; 、漏洞发现与修复案例 2.1 文件包含漏洞 2.2 文件上传漏洞 &#xff08;三&#xff09; 文件下载/读取漏洞 &#xff08;四&#xff09;&#xff0e;文件写入漏洞 &#xff08;五&…

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

效果 1、准备数据 DEM、DSM数据精度尽量高一些 1)DEM 2)DSM 3)建筑shp 所有数据坐标统一,而且加载后位置能对上,DEM和DSM具有相同的像元大小 2、准备数据前的一些操作 1)矢量shp裁剪

C#实现最大公约数和最小公倍数

最大公约数&#xff1a; 最大公因数&#xff0c;也称最大公约数、最大公因子&#xff0c;指两个或多个整数共有约数中最大的一个。a&#xff0c;b的最大公约数记为&#xff08;a&#xff0c;b&#xff09;&#xff0c;同样的&#xff0c;a&#xff0c;b&#xff0c;c的最大公约…

net.sf.json.JSONObject 类的日常使用,非阿里巴巴的JSONObject,附上作者的jsonDemo

文章目录Json介绍作者的Demo项目地址常见的转化使用测试json的添加属性&#xff0c;打印bean与json互转deepBean与json互转list与json互转map与json互转demo所用到的实体类StudentGrade个人使用的依赖常用方法其他参考文档Json介绍 1、JSONObject只是一种数据结构&#xff0c;可…

DJYGUI系列文章七:GDD窗口系统

目录 1 窗口分类及关系 2 窗口的客户区与非客户区 3 坐标系统 4 窗口句柄与窗口ID的作用与区别 5 窗口的关闭、销毁、退出过程 6 API说明 6.1 ScreenToClient&#xff1a; 屏幕坐标转换为客户区坐标 6.2 ClientToScreen&#xff1a; 客户区坐标转换为屏幕坐标 6.3 Scre…

linux篇【11】:linux下的线程

目录 一.linux下的线程 1.linux下的线程概念 &#xff08;1&#xff09;教材上粗略的 线程 定义 &#xff08;2&#xff09;线程的引入 &#xff08;3&#xff09;线程真正定义 以及 示意图 &#xff08;4&#xff09;linux 和 windows等其他操作系统的线程对比 2.重新定…

22-python异常

异常一. 了解异常二. 异常的写法2.1 语法2.2 快速体验2.3 捕获指定异常2.3.1 语法2.3.2 体验2.3.3 捕获多个指定异常2.3.4 捕获异常描述信息2.3.5 捕获所有异常2.4 异常的else2.5 异常的finally三. 异常的传递四. 自定义异常五. 总结一. 了解异常 当检测到一个错误时&#xff…

Hibernate多表的关联关系、懒加载

一、一对多关系&#xff1a;插入&#xff1a; “一”的一方为主表&#xff0c;“多”的一方为副表&#xff0c;主表关联副表&#xff0c;应该在主表中加入副表对象作为属性。 根据顾客ID插入顾客信息 &#xff08;一&#xff09; &#xff0c;同时将顾客名下所有订单插入 &…

Python实现人脸识别检测,对主播进行颜值排行

前言 嗨嗨&#xff0c;我亲爱的家人们 今天来整点不一样的&#xff0c;嘿嘿 用Python简单实现对人脸识别的检测&#xff0c;对某平台主播照片进行评分排名 应该对女主播这个词不陌生吧&#xff0c;怎么说应该还是蛮多人看过一些女主播吧 我无聊的时候也会看看&#xff0c;…

2009年数学二真题复盘

选择题: 间断点的判断的前置芝士: 间断点的定义 设函数f(x)在点的去心领域内有定义,若f(x)满足以下条件之一: 在x=没有定义在x=有定义,但是不存在,或者存在,但是极限值不等于函数值。 类型定义 相关概念第一类间断点

CMS垃圾回收器

概述 CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上&#xff0c;这种垃圾回收器非常适合。在启动JVM参数加上-XX:UseConcMarkSweepGC&#xff0c;这个参数表示对于老年代的回收采用CMS。CMS采用的基础算…

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.13 j2cache 相关配置

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.13 j2cache 相关配置5.13.1 j2cache 相关配置5.13…

直播绿幕抠图的例子(绿幕抠图直播实例参考)

阿酷TONY / 2022-11-21 / 长沙 什么是绿幕抠图&#xff1a; 设定绿幕或绿布&#xff0c;做直播软件抠图&#xff0c;这时绿幕绿布就可以被实时的抠掉&#xff0c;绿色就变成透明了&#xff0c;只剩下绿幕外的人物&#xff0c;此时添加上直播的背景画质&#xff0c;就实现了绿…

Git——Git常用命令

目录 常用命令概览 1. 设置用户签名 2. 初始化本地库 2.1 初始化本地库 2.2 查看文件 2.3 查看隐藏文件 2.4 进入到下一个目录 3. 查看本地库状态 4.添加暂存区 4.1 删除文件 5. 提交本地库 5.1 将暂存区的文件提交到本地库 6. 查看版本信息的命令 7.修改文件 8. 历史版本…

【Python入门指北】服务器信息清洗

服务器信息清洗 文章目录服务器信息清洗一、 subprocess 执行本机命令二、 获取服务器的硬件基础信息1. 基础信息2. 厂家和产品信息3. CPU 信息3.1 查看物理CPU型号3.2 查看物理CPU颗数3.3 查看每颗物理 CPU 的核心数4. 内存信息练习内存处理参考代码一、 subprocess 执行本机命…