ROM-IP

1.原理

通过添加数据文件,使ROM看起来不是易失性存储器,

产生256个数据,每个数据的位宽是8

如果前面为x,后面就是x+256-1

2.单端口ROM配置

FPGA内部没有非易失性存储器。调用的ROM和RAM都是用RAM来生成的

3.双端口ROM配置

使用第一种单时钟

默认不选择使能信号

添加了寄存器,输入时钟可以选择更高的频率

对时钟的使能信号,默认不勾选

是否给寄存器添加清0信号。默认不勾选

4.实验代码

K1按下,给ROM写入一个随机的地址,读取这个地址的数据。K2同理。将读取数据和mif文件对比。

4.1 rom_ctrl.v

        

module rom_ctrl#(
	parameter CNT_MAX=24'd9_999_999
)
(
	input wire 			sys_clk		,
	input wire 			sys_rst_n	,
	input wire 			key1		,
	input wire 			key2		,
	
	output reg[7:0]	    addr		
);

reg [23:0]cnt_200ms;   //10,000,000个时钟周期,0-9_999_999
reg key1_en		;
reg key2_en		;


always@(sys_clk or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		cnt_200ms<=24'd0;
	else if((cnt_200ms==CNT_MAX)||(key1_en==1'b1)||(key2_en==1'b1))
		cnt_200ms<=24'd0;
	else
		cnt_200ms<=cnt_200ms+1'b1;
		
always@(sys_clk or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		key1_en<=1'b0;
	else if(key2==1'b1)
		key1_en<=1'b0;
	else if(key1==1'b1)
		key1_en<=~key1_en;
	else 
		key1_en<=key1_en;
		
always@(sys_clk or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		key2_en<=1'b0;
	else if(key2==1'b1)
		key2_en<=~key2_en;
	else
		key2_en<=key2_en;

always@(sys_clk or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		addr<=8'd0;
	else if((cnt_200ms==CNT_MAX)&&(addr==8'd255))
		addr<=8'd0;
	else if(key1_en==1'b1)
		addr<=8'd99;
	else if(key2_en==1'b1)
		addr<=8'd199;
	else if(cnt_200ms==CNT_MAX)
		addr<=addr+1'b1;
	else
		addr<=addr;
	
endmodule

4.2 tb_rom_ctrl.v

`timescale 1ns/1ns
module tb_rom_ctrl();

reg sys_clk;
reg sys_rst_n;
reg key1;
reg key2;

wire[7:0] addr;

initial 
	begin
		sys_clk=1'b1;
		sys_rst_n<=1'b0;
		key1<=1'b0;
		key2<=1'b0
		#20
		sys_rst_n<=1'b1;
		#7000     //让数码管完整显示0-255地址,因为一个地址200ns,250*200=500_000
	//key1
		key1<=1'b1;
		#20
		key1<=1'b0;
		#20000
		key1<=1'b1;
		#20
		key1<=1'b0;
	//key2
		key2<=1'b1;
		#20
		key2<=1'b0;
		#20000
		key2<=1'b1;
		#20
		key2<=1'b0;
		#600000
	end

always #10 sys_clk=~sys_clk;





rom_ctrl#(
	CNT_MAX=24'd99
)
rom_ctrl_inst
(
	.sys_clk	(sys_clk	)	,
	.sys_rst_n	(sys_rst_n	),
	.key1		(key1		),
	.key2		(key2		),
	
	.addr		(addr		)
);

endmodule

4.3

4.3 rom.v

module rom(
	input wire 			sys_clk     ,
	input wire 			sys_rst_n	,
	input wire 			key1		,
	input wire 			key2		,
	
	output reg 			ds			,
	output reg 			oe			,
	output reg 			shcp		,
	output reg 			stcp		
);

wire key1_flag;
wire key2_flag;
wire [7:0] addr;
wire [7:0] data;
wire  [5:0]point				;
wire  sign	            ;
wire  seg_en    ;


key_filter
#(
	.CNT_MAX(20'd999_999)
)
key_filter_inst
(
	.sys_clk	(sys_clk	)		,
	.sys_rst_n	(sys_rst_n	)	,
	.key_in		(key1	)	,
	
	.key_flag	(key1_flag	)	
);

key_filter
#(
	.CNT_MAX(20'd999_999)
)
key_filter_inst
(
	.sys_clk	(sys_clk	)		,
	.sys_rst_n	(sys_rst_n	)	,
	.key_in		(key2	)	,
	
	.key_flag	(key2_flag	)	
);

rom_ctrl#(
	.CNT_MAX(24'd9_999_999)
)
rom_ctrl_inst
(
	.sys_clk	(sys_clk	)	,
	.sys_rst_n	(sys_rst_n	),
	.key1		(key1_flag		),
	.key2		(key2_flag		),
				
	.addr		(addr		)
);

rom_8x256 rom_8x256_inst
(
	.address (addr),
	.clock   (sys_clk),
	
	.q		  (data)
);

seg_595_dynamic seg_595_dynamic_inst(
	.sys_clk	(sys_clk	)		,
	.sys_rst_n	(sys_rst_n	)	,
	.data		({12'b0,data}	,   
	.point		(6'b000_000		)	,
	.sign		(1'b0			)	,
	.seg_en		(1'b1			)	,
				 			
	.ds			(ds			)	,
	.oe			(oe			)	,
	.shcp		(shcp		)	,
	.stcp		(stcp		)
);

endmodule

4.4 tb_rom.v

`timescale 1ns/1ns
module tb_rom();

reg sys_clk     ;
reg sys_rst_n	;
reg key1		;
reg key2		;
				
wire ds			;
wire oe			;
wire shcp		;
wire stcp		;


initial 
	begin
		sys_clk=1'b1;
		sys_rst_n<=1'b0;
		key1<=1'b1;
		key2<=1'b1;
		#20
		sys_rst_n<=1'b1;
		#7000     //让数码管完整显示0-255地址,因为一个地址200ns,250*200=500_000
//key1
		key1<=1'b0;
		#20
		key1<=1'b1;
		#20
		key1<=1'b0;
		#20
		key1<=1'b1;
		#20
		key1<=1'b0;
		#200
		key1<=1'b1;
		#20
		key1<=1'b0;
		#20
		key1<=1'b1;
		#20
		key1<=1'b0;
		#20
		key1<=1'b1;
//key2
		#2000
		key2<=1'b0;
		#20
		key2<=1'b1;
		#20
		key2<=1'b0;
		#20
		key2<=1'b1;
		#20
		key2<=1'b0;
		#200
		key2<=1'b1;
		#20
		key2<=1'b0;
		#20
		key2<=1'b1;
		#20
		key2<=1'b0;
		#20
		key2<=1'b1;
//key2
		#2000
		key2<=1'b0;
		#20
		key2<=1'b1;
		#20
		key2<=1'b0;
		#20
		key2<=1'b1;
		#20
		key2<=1'b0;
		#200
		key2<=1'b1;
		#20
		key2<=1'b0;
		#20
		key2<=1'b1;
		#20
		key2<=1'b0;
		#20
		key2<=1'b1;
	end

always #10 sys_clk=~sys_clk;

rom rom_inst(
	.sys_clk    (sys_clk    ),
	.sys_rst_n	(sys_rst_n	),
	.key1		(key1		),
	.key2		(key2		),
				
	.ds			(ds			),
	.oe			(oe			),
	.shcp		(shcp		),
	.stcp		(stcp		)
);




endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React系列之虚拟DOM、FIBER和DIFF算法

文章目录 虚拟 DOM 和 DIFF 算法虚拟DOM虚拟DOM对象虚拟DOM的优势预防XSS DIFF算法旧的DIFF算法Fiber树渲染过程算法过程key 的作用 虚拟 DOM 和 DIFF 算法 虚拟DOM React使用虚拟DOM来更新真正的DOM。 DOM表示“文档对象模型”&#xff0c;浏览器遵循HTML指令来构造文档对象…

Temu api接口 获取商品详情 数据采集

iDataRiver平台 https://www.idatariver.com/zh-cn/ 提供开箱即用的Temu电商数据采集API&#xff0c;供用户按需调用。 接口使用详情请参考Temu接口文档 接口列表 1. 获取商品详情 参数类型是否必填默认值示例值描述apikeystring是idr_***从控制台里复制apikeycountrystrin…

一文看懂什么是OpenHarmony流转架构

随着全场景多设备的生活方式不断深入&#xff0c;用户拥有的设备越来越多&#xff0c;不同设备都能在适合的场景下提供良好的体验&#xff0c;例如手表可以提供及时的信息查看能力&#xff0c;电视可以带来沉浸的观影体验。但是&#xff0c;每个设备也有使用场景的局限&#xf…

四川思维跳动商务信息咨询有限公司抖音电商的领航者

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以其独特的魅力改变着传统的商业模式。作为这一变革的先锋力量&#xff0c;四川思维跳动商务信息咨询有限公司&#xff08;以下简称“思维跳动”&#xff09;凭借其深厚的行业经验和创新思维&#xff0c;专注于抖音电商服务&a…

如何保障MySQL和Redis的数据一致性?

在满足实时性的条件下&#xff0c;不存在两者完全保存一致的方案&#xff0c;只有最终一致性方案。 根据网上的众多解决方案&#xff0c;总结出 6 种&#xff0c;直接看目录&#xff1a; 不好的方案 1. 先写 MySQL&#xff0c;再写 Redis 图解说明&#xff1a; 这是一副时序图…

C++ STL - vector使用详解

目录 0.引言 1.构造函数 2. 赋值函数 3. vector 容量与大小 4. vector 插入和删除 5. vector 元素访问与更改 6. vector 互换 9. vector 预留空间 0.引言 这篇博客将详细介绍 vector&#xff0c;由于总体上与上一篇介绍的 string 类似&#xff0c;在此处注意展示其…

【Python】Data Science with Python 数据科学(1)环境搭建

一、操作系统 使用运行在Windows11主机上的Ubuntu 22.04虚拟机&#xff0c;虚拟化平台为Oracle VM VirtualBox。 二、PyCharm安装 有关PyCharm的安装和快捷方式创建&#xff0c;可分别参考我的博客 Ubuntu安装PyCharm、Ubuntu创建桌面快捷方式 &#xff0c;以及Ubuntu创建桌…

Vue2(十一):全局事件总线、消息订阅与发布pubsub、TodoList的编辑功能、$nextTick、过渡与动画

一、全局事件总线 1、思路解析 一种组件间通信的方式&#xff0c;适用于任意组件间通信。通俗理解就是一个定义在所有组件之外的公共x&#xff0c;这个x可以有vm或vc上的同款$on、$off、$emit&#xff0c;也可以让所有组件都访问到。 第一个问题&#xff1a;那怎样添加这个x才…

GPU-CPU-ARM-X86-RISC-CUDA

CPU更适合处理复杂逻辑运算和单线程任务&#xff0c;而GPU则更适合处理大规模并行计算任务。 CPU&#xff08;中央处理器&#xff09;通常具有较少的核心数量&#xff08;一般在2到16个之间&#xff09;&#xff0c;但每个核心的性能较强&#xff0c;擅长执行复杂的运算和逻辑…

SpringCloud Alibaba实战和源码(8)OpenFeign使用

1、 使用Feign实现远程HTTP调用 1.1、常见HTTP客户端 HttpClient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 Http 协 议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 J…

Postman核心功能解析-参数化和测试报告

一、参数化处理 参数化&#xff1a;针对于某一个接口&#xff0c;有大量的的测试数据需要批量验证&#xff0c;一个一个的更改请求参数太耗时耗力&#xff0c;使用参数化批量处理数据会比较高效&#xff0c;常规通过文档参数化实现。 创建文件 格式CSV 文件内第一行信息 需要…

【YOLOv8代码详解】各个任务Loss损失函数梳理

YOLOv8官方将各类任务&#xff08;目标检测&#xff0c;关键点检测&#xff0c;实例分割&#xff0c;旋转目标框检测&#xff0c;图像分类&#xff09;的损失函数封装了在ultralytics\utils\loss.py中&#xff0c;本文主要梳理一下各类任务Loss的大致组成&#xff0c;不涉及到具…

封装-练习

T2、以面向对象的思想&#xff0c;编写自定义类描述IT从业者。设定属性包括&#xff1a;姓名&#xff0c;年龄&#xff0c;技术方向&#xff0c;工作年限&#xff1b;方法包括&#xff1a;工作。 要求&#xff1a; 设置属性的私有访问权限&#xff0c;通过公有的get,set方法实现…

第2章 辐射度、光度和色度学基本理论

一、前言 辐射度学&#xff08;radiology&#xff09;是一门以整个电磁波段&#xff08;electromagnetic band&#xff09;的电磁辐射能&#xff08;electromagnetic radiation energy&#xff09;测量为研究对象的科学。计算机图形学中涉及的辐射度学&#xff0c;则集中于整个…

代码随想录算法训练营三刷day35 |贪心 之 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

三刷day35 860.柠檬水找零406.根据身高重建队列452. 用最少数量的箭引爆气球 860.柠檬水找零 题目链接 解题思路&#xff1a; 局部最优&#xff1a;遇到账单20&#xff0c;优先消耗美元10&#xff0c;完成本次找零。全局最优&#xff1a;完成全部账单的找零。 代码如下&#x…

Internet Explorer 降级

Internet Explorer 降级 1. version2. Internet Explorer 降级References 1. version 帮助 -> 关于Internet Explorer(A) 2. Internet Explorer 降级 开始 -> 控制面板 -> 卸载程序 -> 查看已安装的更新 搜索 Internet -> Internet Explorer 11 -> 卸载 -…

office办公技能|word中的常见使用问题解决方案2.0

一、设置多级列表将表注从0开始&#xff0c;设置为从1开始 问题描述&#xff1a;word中插入题注&#xff0c;出来的是表0-1&#xff0c;不是1-1&#xff0c;怎么办&#xff1f; 写论文时&#xff0c;虽然我设置了“第一章”为一级标题&#xff0c;但是这三个字并不是自动插入的…

[leetcode]118.杨辉三角

前言&#xff1a;剑指offer刷题系列 问题&#xff1a; 给定一个非负整数 *numRows&#xff0c;*生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例&#xff1a; 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,…

C# NumericUpDown 控件正整数输入控制

用到了控件的 KeyPress 和 KeyUp事件。 KeyPress 中控制输入“点、空格&#xff0c;负号”&#xff1b; KeyUp 中防止删空&#xff0c;以及防止输入超过最大值或最小值 。 private void nudStart_KeyPress(object sender, KeyPressEventArgs e){numericUpDownKeyPress(sender…