首页 > 其他分享 >FPGA入门笔记012——嵌入式块RAM应用之ROM

FPGA入门笔记012——嵌入式块RAM应用之ROM

时间:2024-04-09 15:57:49浏览次数:25  
标签:ROM 波形 FPGA RAM mif II 012 所示 数据

1、实验现象

​ 实现一组固定的数据(三角波形表)存储在 FPGA 中使用 IP 核构建的片上 ROM 中,开发板上电后,系统开始从 ROM 中读出数据,并将数据直接通过并口输出。通过使用 Signal Tap II 软件实时抓取并口上的数据,显示得到三角波形。然后使用 Quartus 软件中 提供的 In-System Memory Content Editor 工具在线更改 ROM 中的数据(将数据更改为正弦波形表),然后再次观察 signal Tap II 工具抓取到的波形数据。

2、知识点

​ (1)ROM 存储器 IP 核的使用;

​ (2)In-System Memory Content Editor 内存查看工具的使用;

​ (3) SignalTap II 调试工具的简单使用

3、IP 核使用之 ROM

​ ROM 在上电后需要进行初始化,这里支持 HEX 以及 MIF 格式文件初始化。新建一个以名为 rom 的工程保存在 prj 下,单击 File→New,或者工具栏中的 New,弹出下图的选择框。此处选择 Memory Files 中的 Memory Initialization File,来创建一个 mif 文件。这里 选择数据个数为 256,数据位宽为 8。以 ROM.mif 保存至工程目录下。

image-20240409104027222

​ 为了生成三角波的数据,其中一种方式是使用 excel,本工程可在一列里使数据从 0 加 到 127 再减为 0。然后直接复制此列粘贴到生成的 mif 中即可,更为便捷和可靠的方法是使用 Mif 精灵工具填好参数后点击 OK,直接在 mif 精灵所在文件夹生成 mif 文件。

​ 如果使用 mif 精灵工具生成文件,则需要明确生成 rom 数据的具体信息,包括位宽,进制,波形,存储深度,峰值等。需注意,这里的信息需和 FPGA 的 IP 设计存储容量相适配。

image-20240409105446098

​ 生成好 Mif 文件后,修改生成的 Mif 文件的文件名。例如本实验将其命名为 ROM,后缀 Mif 保持不变。

​ 下一步,单击 Tools→MegaWizard Plug-In Manager 启动 IP 核目录。

image-20240409105534687

​ 选择生成一个新的 IP。

image-20240409105552663

​ 选择 Memory Compiler 下的 ROM:1-PORT(单端口 ROM),并将输出目录确定为工程文 件夹下的 ip 文件夹,以 rom 为文件名保存成 Verilog 格式,单击 Next,如下图所示。

image-20240409105616616

​ 这里将 ROM 的数据个数与位度设置为与 mif 文件大小一致,存储块类型自动,单时钟 操作,如下图所示。

image-20240409105640242

​ 选择输出端口 q 寄存,如下图所示。

image-20240409105705157

​ ROM 初始化设置,这里可以看出必须进行初始化即 leave it blank 不可选,这里与上一 讲的 RAM 不同。通过 Browse 选择初始化文件,初始化文件可以选择为 hex 或者 mif 格式, 这里选择前面生成的已经存放于工程根目录下的三角波 mif 文件。为了在调试的时候使用系统内存储器内容编辑器,这里使能此功能,并将 ID 命名为 ROM,如下图所示。

image-20240409105809162

​ 然后预览汇总信息,确认后即可点击 Finish 来完成此 IP 的配置并将其加入工程中设置为顶层文件。

4、激励创建及仿真测试

​ 为了测试仿真编写测试激励文件,新建 rom_tb.v 文件,保存到 testbench 文件夹下。这里除了实现例化需要仿真的文件以及时钟创建,还实现了地址数从 0 自加到 2550d,但是由于本 ROM 的最大数据个数是 255d,因此在 address 第一次加满 255 后会重新从 0 开始自加, 这样就有十个地址数循环。

`timescale 1ns/1ns
`define clk_period 20

module rom_tb;

	reg	[7:0]addr;
	reg Clk;

	wire [7:0]q;

    integer i;

    rom rom(
        .address(addr),
        .clock(Clk),
        .q(q)
    );

    initial Clk = 1;
    always#(`clk_period/2) Clk = ~Clk;

    initial begin
        addr = 0;
        #(`clk_period + 1);
        for(i = 0;i < 2560;i = i + 1)begin
            #`clk_period;
            addr = addr + 1;
        end
        #(`clk_period * 50);
        $stop;
    end

endmodule

​ 设置好仿真脚本后进行功能仿真,可以看到如图 1 所示的数据输出时的波形文件。 发现数据发生变化了,但是不能直观看到三角波。可通过在 q 右键选择 Format→ Analog(automatic),将所有信号均切换到无符号数,并把输出数据格式改为模拟的自动模式, 即可看到图 2 所示的十个周期三角波波形文件。

image-20240409151515908

图1——修改输出数据显示格式

image-20240409151553335

图2——三角波仿真波形

​ 下面仿真正弦波,使用 Sin3e 软件,或使用 mif 精灵生成一个正弦波的 mif 文件,并以此初始化 ROM。

​ 完成 IP 的再次配置后,再次启动仿真可能看到如图 3 的波形文件,这是由于数据 格式为有符号整型,只需要修改为无符号整型即可。

image-20240409151717447

图3——正弦波仿真波形

​ 如果看到如图 4 所示的波形,是因为这里当前波形数据的范围设置问题,只需右键 打开 Properties 按照图 5 修改即可。

image-20240409151820934

图4——正弦波仿真波形

image-20240409151850926

图5——修改波形数据范围

​ 设置无误后,即可看到如图6所示的正弦波波形,这样 ROM 的仿真即为通过。

image-20240409151931352

图6——正弦波仿真波形

5、SignaTap II 使用及板级验证

​ 现在为了实现用 SignaTap II 逻辑分析仪以及 In-System Memory Content Editor,进行板级测试,编写一个顶层文件并以 ROM_top.v。这里除了实现调用已经设计好的ROM IP 核, 还实现了每当系统时钟上升沿到来后,ROM 地址进行加一。

module ROM_top(
    Clk,
    Rst_n,
    q
);

    input Clk;
    input Rst_n;

    output [7:0]q;

    reg [7:0]addr;

    rom rom(
        .address(addr),
        .clock(Clk),
        .q(q)
    );

    always@(posedge Clk or negedge Rst_n)
    if(!Rst_n)
        addr <= 8'd0;
    else
        addr <= addr + 1'b1;

endmodule

​ SignaTap II 逻辑分析仪,用于辅助设计调试过程,提供了用户设计全速运行在 FPGA 芯 片上时不使用外部 I/O 引脚就能检查内部信号状态的解决方案。其与传统的外部物理逻辑分 析仪类似,可以在不使用硬件测试设备的前提下,调试正常操作期间的 FPGA 设计。

​ (1)单击 File→New 新建一个 SignalTap II 文件,如下图所示。

image-20240409152413321

​ (2)在 Signal Configuration 中选择采样时钟,如图下所示。

image-20240409152511355

​ (3)先将筛选关键字设置为 Pin:all,单击 List 列出所有符合筛选标准的引脚。这里选中 Clk 单击“>”将其确定为采样时钟,这里也可以直接双击 Clk 确定,如下图所示。

image-20240409152619918

​ (4)现添加待采样信号,在 Setup 界面中双击空白处弹出如下图所示的界面。这里 选择输出信号 q 作为待测信号,这里只需将总线加入即可。

image-20240409152711734

​ (5)选择过滤方式为” Registers:pre-synthesis”,然后将 addr 添加到待采样信号列表中, 如下图所示。

image-20240409152747037

​ (6)设置好采样时钟以及待采样数据后,点击 file save 至工程目录下,名字可自取,这时即可以看出此时资源使用数据,包括使用的逻辑单元和存储器大小,如下图所示。

image-20240409152828855

image-20240409152842268

​ (7)这里采样时钟为 50M,一个周期的波形划分为 256 份,因此如果想看十个周期的波形这里深度最少 256*10,这里直接设置为 4K 深度,如下图。修改后可以看到资源使用随之增加。

image-20240409152946010

​ (8)保存 SignalTap II 设置后,分配引脚后进行全编译,这里分配的 Pin 并没有实际意义, 因此输出可以随意设置为板子的空闲引脚即可,如下图所示。为保证本教程的可操作性,我们仍然给出了如下管脚绑定表供参考。例如我们这里给管脚分配作如下定义:

image-20240409153029481

image-20240409153041453

​ 下图是 AC620 开发板管脚绑定完成后效果示例,前面已经提到过,管脚的绑定并无实 际的输入输出功能,仅用于学习 SignalTapII 而生成演示的端口。

image-20240409153109814

​ (9)编译无误后,将本工程生成的 sof 文件下载进开发板。下载后双击工程下的 STP 文件来使用 SignalTap II 逻辑分析仪并设置好 JTAG。这里有两种采样方式,一种为单次采样,这样是单次抓取数据直到 4K 深度填满;一种为循环采集,如下图所示。这里选择循环采样,可看到下图的数据。

image-20240409153223794

image-20240409153231602

​ 这里跟 modelsim 仿真时数据类似,也想看到更直观的波形。只需在信号 q 右键选择 Bus Display Fomat 中的 Unsigned Line Chart,如下图所示。

image-20240409153317309

设置完成后 Signaltap 中的数据 就以模拟波形的形式显示了,如下图所示。

image-20240409153327265

​ (10)这样就成功实现了 SignalTap II 逻辑分析仪抓取数据,现在为了实现在线更改 ROM 中的数据,这里介绍 In-System Memory Content Editor 工具的使用。

​ (11)单击 Tools 打开 In-System Memory Content Editor,如下图所示。

image-20240409153418432

​ (12)选择好调试器待界面状态变成 JTAG ready,此时会看到数据框全为“??”,这是由 于尚未对 ROM 进行读取,只需先将列表中 rom 选取呈蓝底色,然后单击读取键即可,ROM 中的数据就会被读取出来如下图,读出的数据可与 mif 文件进行比对是否一致。

image-20240409153500233

​ (13)实现在线数据读取后,现在实现数据写入。可直接在 rom 右键找到 Inport Data From File,如下图所示选择需要替换的三角波 mif 文件即可。

image-20240409153553041

​ 选择后点击写入,这时回到 SignalTap II 界面即可以看到更改 ROM 后的输出 q 的波形已切换为三角波,如下图所示。

image-20240409153620574

image-20240409153627370

​ (14)这时可以回到 In-System Memory Content Editor 界面,点击读取,ROM 中的数据就 会被再次读取出来如图 4.3-29,此时可与 mif 文件进行比对是否一致。

image-20240409153649550

​ 这样板级调试结束。这样就实现了将一组固定的数据(三角波形表)存储在 FPGA 中使用嵌入式块配置为 ROM 中,开发板上电后,系统开始从 ROM 中读出数据,并将数据直接 通过并口输出。通过使用 Signal Tap II 软件实时抓取并口上的数据,显示得到三角波形。然 后使用 Quartus 软件中提供的 In-System Memory Content Editor 工具在线更改 ROM 中的数据(将数据更改为正弦波形表),然后再次观察 signal Tap II 工具抓取到的波形数据。

标签:ROM,波形,FPGA,RAM,mif,II,012,所示,数据
From: https://www.cnblogs.com/little55/p/18124133

相关文章

  • spring-LocalVariableTableParameterNameDiscoverer
    记录一下后期整理注:此工具类是解析class文件从class文件获取,而不是通过元空间的class对象的method获取 /***在jdk8以前java源码编译后通过反射是无法获得形参名的,在Java8及之后,编译的时候可以通过-parameters为反射生成元信息,可以获取到方法的参数名,但这......
  • HSPF(Hydrological Simulation Program Fortran)模型
    HSPF模型与SWAT模型一样都是著名的水文模型软件,在世界各地的水文模拟中得到广泛的应用。由于种种原因,HSPF模型在国内的影响力不如SWAT;但是,HSPF模型也有其自身的优势,比如:1.它有很高集成度的前后处理软件,减轻建模的负担;2.它可以自主调节水文响应单元的大小,模型有更好的灵活性;3.它......
  • dialog 中引用iframe, 通过iframe 调用 dialog 父页面方法
    父页面:<divid="ksbhif"><el-dialog:visible.sync="dialogVisible"title="开始备货"width="80%"top="50px"><iframe:src="iframeUrl"frameborder="0"width="100%"......
  • 【IP层的校验和与UDP的校验和】+【FPGA实现】
    MAC层的校验是CRC,而IP层也有其校验机制。CRC保证数据包的传输正确; IP头校验和IP头校验和是一种错误检测机制,用于在互联网协议(IP)中保证IP头的数据完整性。当一个IP数据包从源主机发送到目的主机时,它经过许多路由器和交换机,校验和可以帮助这些中间设备检查数据包......
  • 论文解读(CoCo)《CoCo: A Coupled Contrastive Framework for Unsupervised Domain Adap
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]论文信息论文标题:CoCo:ACoupledContrastiveFrameworkforUnsupervisedDomainAdaptiveGraphClassification论文作者:XiaoShen、QuanyuDai、Fu-laiChung、WeiLu、Kup-SzeChoi论文来源:2023aRxiv论文地址:download 论文代......
  • Pyramid RCNN
    PDF:PyramidR-CNN:TowardsBetterPerformanceandAdaptabilityfor3DObjectDetectionCODE:https://github.com/PointsCoder/Pyramid-RCNN一、大体内容PyramidR-CNN是一个两阶段的3D目标检测网络,主要是考虑目前的方法在第二阶段提取感兴趣RoI特征时,不能有效地处理兴趣......
  • FPGA入门笔记011_B——搭建串口收发与存取双口RAM简易应用系统
    1、实验现象​ 通过串口发送数据到FPGA中,FPGA接收到数据后将数据存储在双口ram的一段连续空间中,通过QuartusII软件提供的In-SystemMemoryContentEditor工具查看RAM中接收到的数据。当需要时,按下设计好的按键,则FPGA将RAM中存储的数据通过串口发送出去。2、......
  • 基于FPGA的数据采集、编码、通讯和存储系统设计(即FPGA+RTL8211千兆以太网+SD卡存储+RT
    介绍一个小项目,加强对FPGA相关接口的整体把握。硬件及软件代码梳理:硬件系统的主要功能框图,其中FPGA作为处理单元,实现了包括电流和电压的采集、千兆以太网通讯、SD卡本地数据存储和串口通讯等。已经过板级测试,测试包含:千兆网通讯收发测试、AD采集的数据验证、SD卡存储验证......
  • 【FPGA基础】Latch基础
    “本文主要转载自https://zhuanlan.zhihu.com/p/93133247,高屋建瓴。其中关于如何会产生latch的部分,转载自https://zhuanlan.zhihu.com/p/34408492?from_voters_page=true。”在FPGA的设计中,避免使用锁存器是几乎所有FPGA工程师的共识,Xilinx和Altera也在手册中提示大家要慎用......
  • Vue2中使用iframe展示文件流(PDF)以及blob类型接口错误展示返回值
    需求使用iframe展示后端接口传输来的文件流(pdf),如果接口返回错误则弹出提示html部分<iframe:src="url"width="100%"/>接口部分//接口封装已忽略,注意:如需接口接收文件流,请在请求中加入responseType:'blob'以及type:"application/json;chartset=UTF-8"function......