FPGA_学习_16_IP核_ROM(延迟一拍输出)

在寻找APD最合适的偏压的过程中,一般会用到厂商提供一条曲线,横坐标是温度的变化,纵坐标表示击穿偏压的变化,但每个产品真正的击穿偏压是有差异的。 为了能够快速的找到当前温度下真实的击穿偏压,我们可以这样做,我先根据温度,得到厂商提供的击穿偏压。 然后再用厂商提供的击穿偏压,减去几伏。 我们以此作为寻找真实击穿偏压的起点。以一个固定的步长提升APD的偏压,直到满足我们设定的击穿判断条件。 但是呢,在整个这个流程中,我们需要解决一个问题,就如何在FPGA程序中实时的去获取当前温度下对应的击穿偏压。 如果是dsp或者stm32等嵌入式平台,可以直接把温度-击穿偏压数据做成一个数据表存到一个数组,然后直接查表。 但是在FPGA中,我们不能用数组了,但可以选择用ROM IP核 去实现。 在FPGA中,一些固定的初始化参数也可以用ROM来保存。 本文记录ROM的使用方法。

1 ROM是什么

ROM 是只读存储器(Read-Only Memory)的简称,是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除,且资料不会因为电源关闭而消失。而事实上在 FPGA 中通过 IP 核生成的 ROM 或 RAM 调用的都是 FPGA 内部的 RAM 资源,掉电内容都会丢失(这也很容易解释,FPGA 芯片内部本来就没有掉电非易失存储器单元)。用 IP 核生成的 ROM 模块只是提前添加了数据文件(.coe 格式),在 FPGA 运行时通过数据文件给 ROM 模块初始化,才使得 ROM 模块像个“真正”的掉电非易失存储器;也正是这个原因,ROM 模块的内容必须提前在数据文件中写死,无法在电路中修改。

简单说就是FPGA的ROM你随便搞,不用担心一次写死后,后面再也不能改了。

2 .coe文件生成

ROM 作为只读存储器,在进行 IP 核设置时需要指定初始化文件,即写入存储器中的 数据,数据要以规定的格式才能正确写入 ROM,这种格式就是 coe 文件。coe Vivado 规定的一种文件格式,下图为文件格式示意图

 下面提供一个.coe文件的 MatLAB生成代码,一键即可生成你想要的.coe

clear;clear all;clc;FileName=['mycoe','.coe']; fid = fopen(FileName,'w'); fprintf(fid,'memory_initialization_radix = 16;\n');
fprintf(fid,'memory_initialization_vector =\n');
% 位宽
Width = 16;
% 深度
Depth = 20;Hexlen = Width / 4;for i=1:Depthdata = i;% 根据位宽补0HexCode = dec2hex(data);HexSize = size(HexCode,2);ZeroCode='';for j=1:(Hexlen-HexSize)ZeroCode=['0',ZeroCode];endstr0 = [ZeroCode,HexCode];% 判断是否为最后一行if i < DepthHexstr = [str0,','];fprintf(fid,'%s\n',Hexstr);elseif i==DepthHexstr = [str0,';'];fprintf(fid,'%s',Hexstr);end
end
fclose(fid);open(FileName);

3 ROM IP 配置

ROM分单口ROM和双口ROM,它们配置的区别仅仅只是Basic这一页Memory Type的选项的区别,其他的都是一样的。 所以本文仅以单口ROM的配置为例。

 傻瓜式截图,从最原始的IP Catalog开始

取名这里,还是关注一下,比如我是用的单口rom,深度20,位宽16位。我的IP核命名就可以是 s_rom_20x16b。 比如我是用双口rom,深度256,位宽8位呢,那IP核命名则为 d_rom_256x8b。 这样的命名,能做到一目了然。

 👆上面这个图有个值得关注的点: Totoal Port A Read Latency :1 Clock Cycle 。 意思是读的时候要输出要延迟一个时钟周期。👆

IP生成了,这个参数文件也被成功加载过来了。 

瞅一眼是怎么例化的。

 4 Modelsim仿真

ROM在读取数据的时候,要给ROM IP核输入你的ROM地址。 而ROM地址应该是从0开始的。 比如你Rom的深度是20(= 0x14),那你的ROM读地址就是 0x00 ~ 0x13(10进制是19)。那地址 0x00对应的是ROM存的第一个数据(本例中是0x0001)。 0x13对应的是ROM存的最后一个数据(本例中是0x0014)。

源码如下:

`timescale 1ns / 1psmodule lab_rom(input   wire    clk,input   wire    rst_n
);//==================================================================
//                        Parameter define
//==================================================================
parameter       MAX_ADDRA       = 20 - 1;//==================================================================
//                        Internal Signals
//==================================================================
reg     [4:0]   addra;
wire    [15:0]  douta;//----------------------------- addra自增 -----------------------------
always @(posedge clk or negedge rst_n) beginif (rst_n == 1'b0) beginaddra <= 'd0;        endelse if(addra == MAX_ADDRA)beginaddra <= 'd0;endelse beginaddra <= addra + 1'b1;end
end//----------------------------- s_rom_20x16b例化 -----------------------------
s_rom_20x16b s_rom_20x16b_inst (.clka(clk),    // input wire clka.addra(addra),  // input wire [4 : 0] addra.douta(douta)  // output wire [15 : 0] douta
);endmodule

 约束文件

create_clock	-period			20.000		[	get_ports	clk	]set_property    PACKAGE_PIN		N18			[	get_ports	clk			]
set_property    PACKAGE_PIN		T12			[	get_ports	rst_n		]set_property    IOSTANDARD      LVCMOS33	[	get_ports	clk			]  
set_property    IOSTANDARD      LVCMOS33	[	get_ports	rst_n		]  

仿真代码

`timescale 1ns/1ps
module tb_lab_rom (); /* this is automatically generated */// clockreg clk;initial beginclk = 1'b0;forever #(10) clk = ~clk;end// asynchronous resetreg rst_n;initial beginrst_n <= 1'b0;#10rst_n <= 1'b1;end// (*NOTE*) replace reset, clock, othersparameter MAX_ADDRA = 20 - 1;lab_rom #(.MAX_ADDRA(MAX_ADDRA)) inst_lab_rom (.clk(clk), .rst_n(rst_n));endmodule

 仿真结果

5 ila在线调试

本着再复习一下ila在线调试的原则,这里做一个在线调试的测试。

代码

`timescale 1ns / 1psmodule lab_rom(input   wire    clk,input   wire    rst_n
);//==================================================================
//                        Parameter define
//==================================================================
parameter       MAX_ADDRA       = 20 - 1;//==================================================================
//                        Internal Signals
//==================================================================
(* MARK_DEBUG="true" *) reg     [4:0]   addra;    // 修改🔺
(* MARK_DEBUG="true" *) wire    [15:0]  douta;    // 修改🔺//----------------------------- addra自增 -----------------------------
always @(posedge clk or negedge rst_n) beginif (rst_n == 1'b0) beginaddra <= 'd0;        endelse if(addra == MAX_ADDRA)beginaddra <= 'd0;endelse beginaddra <= addra + 1'b1;end
end//----------------------------- s_rom_20x16b例化 -----------------------------
s_rom_20x16b s_rom_20x16b_inst (.clka(clk),    // input wire clka.addra(addra),  // input wire [4 : 0] addra.douta(douta)  // output wire [15 : 0] douta
);endmodule

 Run Synthesis - Open Synthesized Design    运行综合 - 打开已综合的设计

 Set up Debug → Next   设置调试→下一步 

添加要观测的信号并设置时钟域

 由于项目比较简单,刚刚截图的瞬间,系统刚刚应该是自动Run synthesis了一遍,并且还Run完了。

 编译完之后直接 Open Hareware Manager 打开硬件管理器 - 直接烧写程序,刷新设备

 在线调试功能正常。

参考文献

Vivado 下 IP核 之ROM 读写_OliverH-yishuihan的博客-CSDN博客

在给rom IP核命名的时候,我发现FPGA的代码应该有一个统一遵循的规范,包括ip核 模块 变量 参数的命名规则、注释、缩进风格等都应该有一个规范, 后续应该会有一篇博客讲规范,不过目前初学阶段接触的FPGA相关内容还不够全面,因此这篇博客应该是在初学阶段的尾声部分。 另外,约束文件中关于时序部分的约束也是后续关注的一个重点。  

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

八种架构演进

日升时奋斗&#xff0c;日落时自省 目录 1、单机架构 2、应用数据分离架构 3、应用服务集群架构 4、读写分离/主从分离架构 5、冷热分离架构 6、垂直分库架构 7、微服务架构 8、容器编排架构 9、小结 1、单机架构 特征&#xff1a;应用服务和数据库服务器公用一台服务…

(7)(7.6) 恢复任务回放

文章目录 前言 7.6.1 配置 7.6.2 工作原理 7.6.3 局限性 前言 本页介绍了什么是"任务继续时后退"功能以及如何使用该功能。 &#xff01;Note 从 4.1 版起&#xff0c;Plane、Copter 和 Rover 均可使用此功能。 在某些应用或运行区域&#xff0c;为了消除冲突&…

[国产MCU]-W801开发实例-GPIO输入与中断

GPIO输入与中断 文章目录 GPIO输入与中断1、硬件准备2、软件准备3、驱动实现4、驱动测试W801的GPIO支持软件配置中断,中断触发方式包含:上升沿触发、下降沿触发、高电平触发、低电平触发。本文在前面[ 国产MCU]-W801开发实例-按键与GPIO输入的基础上实现GPIO中断配置。 1、硬…

JAVA设计模式总结之23种设计模式

一、什么是设计模式 设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计…

分类预测 | MATLAB实现MTBO-CNN多输入分类预测

分类预测 | MATLAB实现MTBO-CNN多输入分类预测 目录 分类预测 | MATLAB实现MTBO-CNN多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现MTBO-CNN多输入分类预测 2.代码说明&#xff1a;基于登山队优化算法&#xff08;MTBO&#xff09;、卷积神经…

react使用antd的table组件,实现点击弹窗显示对应列的内容

特别提醒&#xff1a;不能在table的columns的render里面设置弹窗组件渲染&#xff0c;因为这会导致弹窗显示的始终是最后一行的内容&#xff0c;因为这样渲染的结果是每一行都会重新渲染一遍这个弹窗并且会给传递一个content的值&#xff0c;渲染到最后一行的时候&#xff0c;就…

【Spring Boot 源码学习】自动装配流程源码解析(下)

自动装配流程源码解析&#xff08;下&#xff09; 引言往期内容主要内容4. 排除指定自动配置组件5. 过滤自动配置组件6. 触发自动配置事件 总结 引言 上篇博文&#xff0c;笔者带大家了解了自动装配流程中有关自动配置加载的流程&#xff1b; 本篇将介绍自动装配流程剩余的内…

haproxy

目录 1、haproxy概述 2、常见的web集群调度器 2.1、软件&#xff1a; 2.2、硬件: 3、haproxy应用分析 4、HAProxy的主要特性有&#xff1a; 5、HAProxy负载均衡策略 6、 LVS、Nginx、HAproxy的区别 1、haproxy概述 HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP…

尚硅谷css3笔记

目录 一、新增长度单位 二、新增盒子属性 1.border-box 怪异盒模型 2.resize 调整盒子大小 3.box-shadow 盒子阴影 案例&#xff1a;鼠标悬浮盒子上时&#xff0c;盒子有一个过度的阴影效果 三、新增背景属性 1.background-origin 设置背景图的原点 2.background-clip 设置背…

【PCIE体系结构十七】PCIE电源管理之PCI-PM

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a;《PCI.EXPRESS系统体系结构标准教材 Mindshare》 目录 设…

Java自学到什么程度就可以去找工作了?

引言 Java作为一门广泛应用于软件开发领域的编程语言&#xff0c;对于初学者来说&#xff0c;了解到什么程度才能开始寻找实习和入职机会是一个常见的问题。 本文将从实习和入职这两个方面&#xff0c;分点详细介绍Java学习到什么程度才能够开始进入职场。并在文章末尾给大家安…

ue5读取外部文件

准备环境 我的环境是win10&#xff0c;ue5.1.1&#xff0c;cpux86。 创建工程时&#xff0c;需要选择C模式 这样在Content Browser中会出现C Classes文件夹&#xff0c;下面有一个本项目命名的文件夹&#xff0c;鼠标右键可以看到New C Class选项。 新建类的时候选择父类Blue…