文章目录

  • 前言
  • 一、添加RAM IP核
  • 二、编写测试程序
  • 三、添加ILA
  • 四、分配管脚
  • 五、Simulator仿真
  • 六、硬件调试
  • 总结

前言

本实验的主要内容是介绍如何使用 FPGA内部的RAM以及程序对该RAM数据的读写操作。Vivado软件中提供了RAM的IP核 , 我们只需通过IP核例化一个RAM,根据RAM的读写时序来写入和读取RAM中存储的数据。


一、添加RAM IP核

首先创建一个名为ram_test的工程,具体的步骤可以参见:Vivado软件的使用——以led的交替闪烁为例。
新工程到下图所示的界面后点击Finish即可完成工程的创建。

工程创建完成后依次按照下图中的序号找到Block Memory Generator双击打开。

弹出如下对话框,在该界面中修改部分参数。

需要修改Component Name和Memory Type这两个部分,修改后如下图所示。

其中 Memory Type 选择的Simple Dual Prot RAM是伪双口RAM,它是最常用的,因为它有两个端口,输入和输出信号是独立的。
Simple Dual Prot RAM模块端口说明如下表。

RAM 的数据写入和读出都是按时钟的上升沿操作的,端口 A 数据写入的时候需要置高wea信号,同时提供地址和要写入的数据。而端口B是不能写入数据的,只能从 RAM 中读出数据,只要提供地址就可以了,一般情况下在下一个周期就可采集到有效的数据。
切换到Port A Options下依次修改数据宽度、深度以及使能管脚,修改后如下图所示。

接着切换到 Port B Options下,将使能管脚 Enable PortType 改为 Always Enable ,也可不修改保持默认Use ENB Pin ,相当于读使能信号,再把 Primitives Output Register取消勾选,其功能是在输出数据上加寄存器,这可以有效改善时序 ,但读出的数据会落后地址两个周期,因此在很多情况下,不用这项功能,保持读出的数据落后地址一个周期即可。

到这里,需要修改的部分已经完成了,其他各选项下的参数保持默认即可,点击OK按钮,弹出如下对话框。

点击Generate就可以生成RAM IP。


二、编写测试程序

编写测试程序来测试RAM的功能,我们向RAM的端口A写入一串连续的数据,且只写一次,并从端口B中读出,使用逻辑分析仪查看数据。
新建名为ram_test的Verilog文件,依次按照下图中标注的序号进行即可。

在新建好的ram_test.v中写入如下代码。

//该代码由正点原子提供
`timescale 1ns / 1psmodule ram_test(input clk,                 //50MHz时钟input rst_n                    //复位信号,低电平有效 );reg       [8:0]       w_addr;         //RAM PORTA写地址
reg     [15:0]      w_data;         //RAM PORTA写数据
reg                 wea;            //RAM PORTA使能
reg     [8:0]       r_addr;         //RAM PORTB读地址
wire    [15:0]      r_data;         //RAM PORTB读数据//产生RAM PORTB读地址
always @(posedge clk or negedge rst_n)
beginif(!rst_n) r_addr <= 9'd0;else if (|w_addr)           //w_addr位或,不等于0r_addr <= r_addr+1'b1;elser_addr <= 9'd0;
end//产生RAM PORTA写使能信号
always@(posedge clk or negedge rst_n)
begin   if(!rst_n) wea <= 1'b0;else beginif(&w_addr)           //w_addr的bit位全为1,共写入512个数据,写入完成wea <= 1'b0;                 else               wea   <= 1'b1;        //ram写使能end
end //产生RAM PORTA写入的地址及数据
always@(posedge clk or negedge rst_n)
begin   if(!rst_n) beginw_addr <= 9'd0;w_data <= 16'd1;endelse beginif(wea)                   //ram写使能有效begin        if (&w_addr)         //w_addr的bit位全为1,共写入512个数据,写入完成beginw_addr <= w_addr ;    //将地址和数据的值保持住,只写一次RAMw_data <= w_data ;endelsebeginw_addr <= w_addr + 1'b1;w_data <= w_data + 1'b1;endendend
end //实例化RAM
ram_ip ram_ip_inst (.clka      (clk),         // input clka.wea       (wea),        // input [0 : 0] wea.addra     (w_addr),     // input [8 : 0] addra.dina      (w_data),     // input [15 : 0] dina.clkb      (clk),        // input clkb.addrb     (r_addr),     // input [8 : 0] addrb.doutb     (r_data)      // output [15 : 0] doutb
);//实例化ila逻辑分析仪
ila_0 ila_0_inst (.clk  (clk), .probe0  (r_data), .probe1   (r_addr)
);endmodule

其中实例化RAM部分的代码来自ram_ip中的ram_ip.veo文件,不过需要将括号内的参数做一修改。


三、添加ILA

我们还需要添加ILA,其添加过程可参见:使用Vivado软件进行硬件调试。
探针的数量这里设置为2,即数据和地址两个探针。

这里每个探针的位数按照代码中的分配,r_data是16位,r_addr是9位。

对应的代码如下。

reg      [8:0]       r_addr;         //RAM PORTB读地址
wire    [15:0]      r_data;         //RAM PORTB读数据

点击OK后在弹出的对话框中生成IP,耐心等待其完成!

实例化ila逻辑分析仪部分的代码来自ila_0中的ila_0.veo文件,不过需要将括号内的参数做一修改。


四、分配管脚

本实验中需要分配管脚的只有时钟信号clk(管脚为U18)和复位信号rst_n(管脚为N15),按照下图中的数字顺序即可完成管脚的分配。

管脚分配完成后Ctrl+S保存,名称与工程名保持一致。

管脚分配的信息在下图圈中的文件中。


五、Simulator仿真

Simulator仿真创建文件的过程可参见:Vivado中Simulator仿真软件的使用。
按照下图中的顺序新建TB文件。

在tb_ram_test.v文件中写入如下代码。

//该代码由正点原子提供
`timescale 1ns / 1psmodule vtf_ram_tb;
// Inputs
reg clk;
reg rst_n;// Instantiate the Unit Under Test (UUT)
ram_test uut (.clk  (clk),      .rst_n  (rst_n)
);initial
begin// Initialize Inputsclk = 0;rst_n = 0;// Wait 100 ns for global reset to finish#100;rst_n = 1;       endalways #10 clk = ~ clk;   //20ns一个周期,产生50MHz时钟源endmodule

保存代码后选择SIMULATION下的Run Simulation,选择第一个行为仿真。
将所有代码中定义的信号拖入到波形仿真窗口,设置仿真时间为1000ns,运行后结果如下图所示。

由仿真结果可知,RAM 的数据写入和读出都是按时钟的上升沿操作的,数据写入的时候需要置高wea信号,在下一个周期就可采集到有效的数据。


六、硬件调试

连接开发板,点击Generate Bitstream生成比特流文件,将其下载到开发板上。

下载后弹出如下窗口,设置r_addr的初始数值为000,然后点击运行按钮,得到如下波形,将游标移动到红线附近并放大得到下图。

由上图可以看到 r_addr 不断地从0 累加到 1f f,随着 r_addr 的变化,r_data 也在变化,而r_data的数据正是我们写入到RAM中的 512个数据。
这里需要注意 r_addr出现新地址时, r_data对应的数据要延时两个时钟周期才会出现,数据比地址晚两个时钟周期出现,这与仿真的结果是一致的。


总结

以上就是ZYNQ之FPGA 片内RAM读写测试实验的所有内容了,本实验较为综合,包括了前面介绍过的建工程、编写Verilog代码、例化IP核、仿真和硬件调试等内容,注意这些部分在该流程中的顺序和作用。
本文参考资料:正点原子–course_s1_ZYNQ那些事儿-FPGA实验篇V1.06.pdf

ZYNQ之FPGA 片内RAM读写测试实验相关推荐

  1. ZYNQ之FPGA 片内ROM读写测试实验

    文章目录 前言 一.创建ROM初始化文件 二.添加ROM IP核 三.编写测试程序 四.添加ILA 五.分配管脚 六.Simulator仿真 七.硬件调试 总结 前言 FPGA本身是SRAM架构的,断 ...

  2. 【ZYNQ Ultrascale+ MPSOC FPGA教程】第六章 FPGA片内RAM读写测试实验

    原创声明: 本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处. 适用于板卡型号: AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E ...

  3. 【ZYNQ Ultrascale+ MPSOC FPGA教程】第八章FPGA片内FIFO读写测试实验

    原创声明: 本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处. 适用于板卡型号: AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E ...

  4. 【ZYNQ】从入门到秃头07 FPGA 片内 RAM ROM 读写测试实验

    文章目录 FPGA 片内RAM读写测试实验 实验原理 创建Vivado工程 RAM的端口定义和时序 测试程序编写 Verilog IO约束 Testbeach simulation仿真 板上验证 添加 ...

  5. Quartus 平台 FPGA 片内 RAM 使用

    Quartus 平台 FPGA 片内 RAM 使用 本文将以 Quartus 自带的 RAM:2-PORT 为例,介绍 EP4CE6E22C8 On Chip Memory 的使用 一.在 IP Ca ...

  6. 【正点原子FPGA连载】第四十六章SD卡读写测试实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  7. FPGA-RAM读写测试

    FPGA RAM读写测试  RAM的读写测试,利用signaltap ii进行板级测试 错误经验积累:  signaltap ii软件在信号测试的时候,有的信号是红色的,无法进行调试,这是因为这个信号 ...

  8. SDIO—SD 卡读写测试

    1.SDIO 简介 SD 卡 (Secure Digital Memory Card) 在我们生活中已经非常普遍了,控制器对 SD 卡进行读写通信操作一般有两种通信接口可选,一种是 SPI 接口,另外 ...

  9. 通过vivado工具实现zynq的FPGA内部RAM读写

    通过vivado工具实现zynq的FPGA内部RAM读写(调用vivado自带IP核),从新建工程到仿真并下载到FPGA开发板中,通过vivado自带的ILA逻辑分析仪查看读写数据是否正确,包含详细步 ...

最新文章

  1. 中国互联网+固体饮料行业商业模式创新与投资机会深度研究报告
  2. Oracle 包(Package)
  3. 误差向量幅度(EVM)介绍
  4. 表单的增 删 改 查
  5. MapGuide应用开发系列(五)---- Autodesk MapGuide Studio应用简介
  6. SVG PATH d参数的 ace
  7. POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】
  8. 不带头结点的链表基础操作(初始化,增删改查)
  9. 爬取淘宝商品信息selenium+pyquery+mongodb
  10. 中文BERT上分新技巧,多粒度信息来帮忙
  11. 特征筛选9——根据重要性SelectFromModel筛选特征(有监督筛选)
  12. GC原理---对象可达判断
  13. SprinBoot-data-jpa整合Vue使用Swagger2实现前后端分离
  14. sql server 2005学习笔记之触发器简介(一)
  15. Java 书籍 Top 10
  16. Ubuntu中锐捷客户端的配置与使用
  17. 详解浮点数的精度问题
  18. 高速数据采集卡之FMC子板丨FMC接口AD/DA子卡丨坤驰科技
  19. 降噪无线耳机推荐,热销火爆的降噪蓝牙耳机分享
  20. 同步四进制加减法可逆计数器设计(D触发器+74153)

热门文章

  1. php第三方阿里云接口
  2. java 和 c# 下的RSA证书+AES+DES加解密实现
  3. PAMI2018跟踪算法HCFTstar的配置(Robust Visual Tracking via Hierarchical Convolutional Features)
  4. 【app开发学习】APP开发的标准流程
  5. python 数据分析、挖掘与可视化 day3
  6. 消息推送----微信小程序,公众号
  7. 2022-2028年中国5G 汽车产业应用市场竞争策略及未来发展潜力报告
  8. 关于线性代数:方程组同解
  9. 什么是VOLTE(2)
  10. 三分钟了解LAP Framework编程框架