【牛客】VL68 同步FIFO

news2024/11/19 17:32:42

描述

请设计带有空满信号的同步FIFO,FIFO的深度和宽度可配置。双口RAM的参考代码和接口信号已给出,请在答案中添加并例化此部分代码。
电路的接口如下图所示。端口说明如下表。
接口电路图如下:

在这里插入图片描述

双口RAM端口说明:

端口名I/O描述
wclkinput写数据时钟
wencinput写使能
waddrinput写地址
wdatainput输入数据
rclkinput读数据时钟
rencinput读使能
raddrinput读地址
rdataoutput输出数据

同步FIFO端口说明:

端口名I/O描述
clkinput时钟
rst_ninput异步复位
wincinput写使能
rincinput读使能
wdatainput写数据
wfulloutput写满信号
remptyoutput读空信号
rdataoutput读数据

参考代码如下:

module dual_port_RAM #(parameter DEPTH = 16,
                       parameter WIDTH = 8)(
     input wclk
    ,input wenc
    ,input [$clog2(DEPTH)-1:0] waddr  
    ,input [WIDTH-1:0] wdata        
    ,input rclk
    ,input renc
    ,input [$clog2(DEPTH)-1:0] raddr  
    ,output reg [WIDTH-1:0] rdata       
);

reg [WIDTH-1:0] RAM_MEM [0:DEPTH-1];

always @(posedge wclk) begin
    if(wenc)
        RAM_MEM[waddr] <= wdata;
end 

always @(posedge rclk) begin
    if(renc)
        rdata <= RAM_MEM[raddr];
end 

endmodule 

输入描述:

input clk ,
input rst_n ,
input winc ,
input rinc ,
input wdata ,

输出描述:

output reg wfull ,
output reg rempty ,
output wire rdata


`timescale 1ns/1ns

/**********************************RAM************************************/
module dual_port_RAM #(parameter DEPTH = 16,
					   parameter WIDTH = 8)(
	 input wclk
	,input wenc
	,input [$clog2(DEPTH)-1:0] waddr  
	,input [WIDTH-1:0] wdata      	
	,input rclk
	,input renc
	,input [$clog2(DEPTH)-1:0] raddr  
	,output reg [WIDTH-1:0] rdata 		
);

reg [WIDTH-1:0] RAM_MEM [0:DEPTH-1];

always @(posedge wclk) begin
	if(wenc)
		RAM_MEM[waddr] <= wdata;
end 

always @(posedge rclk) begin
	if(renc)
		rdata <= RAM_MEM[raddr];
end 

endmodule  

/**********************************SFIFO************************************/
module sfifo#(
	parameter	WIDTH = 8,
	parameter 	DEPTH = 16
)(
	input 					clk		, 
	input 					rst_n	,
	input 					winc	,
	input 			 		rinc	,
	input 		[WIDTH-1:0]	wdata	,

	output reg				wfull	,
	output reg				rempty	,
	output wire [WIDTH-1:0]	rdata
);

localparam DEPTH_WIDTH = $clog2(DEPTH);

reg [DEPTH_WIDTH : 0] 	rd_ptr_r = 'd0, 
						wr_ptr_r = 'd0;

wire fifo_wenc_s, fifo_renc_s;
wire [WIDTH-1:0] fifo_wdata_s, fifo_rdata_s;
reg [WIDTH-1:0] rdata_r;
reg fifo_wenc_r = 1'b0;

assign fifo_wenc_s = ~wfull & winc;
assign fifo_renc_s = ~rempty & rinc;
assign fifo_wdata_s = wdata;
assign rdata = fifo_rdata_s; 

// always @(posedge clk, negedge rst_n) begin
// 	if (~rst_n) begin
// 		rdata_r <= 'd0;
// 		fifo_wenc_r <= 1'b0;
// 	end else begin
// 		fifo_wenc_r <= fifo_wenc_s;
// 		if (fifo_wenc_r) begin
// 			rdata_r <= fifo_rdata_s;
// 		end
// 	end
// end


always @(posedge clk, negedge rst_n) begin
	if (~rst_n) begin
		wr_ptr_r <= 'd0;
	end else begin
		if (~wfull & winc) begin
			wr_ptr_r <= wr_ptr_r + 1;
		end
	end
end

always @(posedge clk, negedge rst_n) begin
	if (~rst_n) begin
		rd_ptr_r <= 'd0;
	end else begin
		if (~rempty & rinc) begin
			rd_ptr_r <= rd_ptr_r + 1;
		end
	end
end

always @(posedge clk, negedge rst_n) begin
	if (~rst_n) begin
		rempty <= 'd0;
		wfull <= 'd0;
	end else begin
		rempty <= (rd_ptr_r == wr_ptr_r);
		wfull <= (rd_ptr_r[DEPTH_WIDTH] != wr_ptr_r[DEPTH_WIDTH]) && (rd_ptr_r[DEPTH_WIDTH - 1 : 0] == wr_ptr_r[DEPTH_WIDTH - 1 : 0]);
	end
end

dual_port_RAM #(
	.DEPTH(DEPTH),
	.WIDTH(WIDTH)
) dual_port_RAM_inst(									 
	.wclk(clk)								,
	.wenc(fifo_wenc_s)						,
	.waddr(wr_ptr_r[DEPTH_WIDTH - 1 : 0]) 	,
	.wdata(fifo_wdata_s)      				,
	.rclk(clk)								,
	.renc(fifo_renc_s)						,
	.raddr(rd_ptr_r[DEPTH_WIDTH - 1 : 0]) 	,
	.rdata(fifo_rdata_s) 		
);
    
endmodule

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

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

相关文章

使用IDEA远程Debug调试

文章目录 背景配置IDEA设置启动脚本改造 细节细节1&#xff1a;停在本地断点&#xff0c;关闭程序后会继续执行吗?细节2&#xff1a;jar包代码和本地不一致会怎么样&#xff1f;细节3&#xff1a;日志打印在哪里&#xff1f;细节4&#xff1a;调试时其他人会不会卡住&#xff…

【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别

文章目录 0. 前言1. 级联神经网络介绍2. MTCNN介绍2.1 MTCNN提出背景2.2 MTCNN结构 3. MTCNN PyTorch实战3.1 facenet_pytorch库中的MTCNN3.2 识别图像数据3.3 人脸识别3.4 关键点定位 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff…

Android将自己写的maven库上传至jitpack(2024靠谱版)

浏览了一堆陈年旧贴&#xff0c;终于实验成功了 第一步 将自建空项目同步至github并保证能正常运行第二步新增一个library类型的modul第三步 在新建的library里面写一些测试用的代码第四步在library的gradle文件增加插件和发布脚本第五步新建一个配置文件第六步 把所有更改push…

3D模型+BI分析,打造全新的交互式3D可视化大屏开发方案

背景介绍 在数字经济建设和数字化转型的浪潮中&#xff0c;数据可视化大屏已成为各行各业的必备工具。然而&#xff0c;传统的数据大屏往往以图表和指标为主&#xff0c;无法真实地反映复杂的物理世界和数据关系。为了解决这个问题&#xff0c;3D模型可视化和数字孪生技术应运…

OSI(Open Systems Interconnection)模型和TCP/IP模型

OSI模型 OSI模型是一个概念模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在1984年提出&#xff0c;用于促进不同系统间的通信互联。OSI模型将网络通信的过程分为七层&#xff0c;每一层都有其特定的功能&#xff0c;从下至上依次是&#xff1a; 物理层&#x…

专题二 -滑动窗口 - leetcode 209. 长度最小的子数组 | 中等难度

leetcode 209. 长度最小的子数组 leetcode 209. 长度最小的子数组 | 中等难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 209. 长度最小的子数组 | 中等难度 1. 题目详情 给定一个含有 n 个正整数…

WIN11环境下Git配置SSH Key拉取Gitee仓库代码

Gitee官方配置参考网址&#xff1a; https://help.gitee.com/base/account/SSH%E5%85%AC%E9%92%A5%E8%AE%BE%E7%BD%AE。https://help.gitee.com/base/account/SSH%E5%85%AC%E9%92%A5%E8%AE%BE%E7%BD%AE。 A.生成 SSH 公钥 Windows 用户建议使用 Windows PowerShell 或者 Git…

C#,数值计算,用割线法(Secant Method)求方程根的算法与源代码

1 割线法 割线法用于求方程 f(x) 0 的根。它是从根的两个不同估计 x1 和 x2 开始的。这是一个迭代过程&#xff0c;包括对根的线性插值。如果两个中间值之间的差值小于收敛因子&#xff0c;则迭代停止。 亦称弦截法&#xff0c;又称线性插值法.一种迭代法.指用割线近似曲线求…

【linux】02 :Linux基础命令

1.掌握linux系统的目录结构 linux只有一个顶级目录&#xff0c;称之为&#xff1a;根目录。 windows系统有多个顶级目录&#xff0c;即各个盘符。 2.linux路径的描述方式 /在Linux中的表示&#xff1a;出现在开头表示根目录&#xff0c;出现在后面表示层级关系。 3.什么是命…

官网在线客服系统源码 完全开源可二开 带完整的安装代码包以及搭建教程

在互联网时代&#xff0c;用户对于线上服务的便捷性和高效性要求越来越高。官网在线客服系统作为企业与用户之间实时沟通的工具&#xff0c;不仅能够提高用户满意度&#xff0c;还能够有效促进业务转化。然而&#xff0c;市面上的在线客服系统大多价格昂贵且功能单一&#xff0…

提高Python代码效率:*args与**kwargs的高级应用指南

提高Python代码效率&#xff1a;*args与**kwargs的高级应用指南 引言*args的使用和技巧基本用法示例代码&#xff1a; 结合位置参数和*args使用示例代码&#xff1a; 使用*args传递参数给另一个函数示例代码&#xff1a; 解包列表或元组为函数参数示例代码&#xff1a; 高级技巧…

不同路径 不同路径 II 整数拆分

62.不同路径 力扣题目链接(opens new window) 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。…

jupyter notebook 突然莫名奇妙的白屏

jupyter notebook 突然莫名奇妙的白屏 事件背景&#xff1a; 最近在折腾openai&#xff0c;哎&#xff0c;一言难尽&#xff0c;使用的是conda管理python版本的切换&#xff0c;使用jupyter notebook来运行python程序&#xff0c;其实PyCharm也行&#xff0c;但是&#xff0c;…

数据标注专业团队

数据标注服务 在跟一些淘宝、多多商家老板合作后&#xff0c;客户一般付款后&#xff0c;中介是有20%左右的提成&#xff0c;我们主要是希望可以实现数据标注无中介化&#xff0c;有需求可以直接联系数据标注团队直接负责人&#xff0c; 若有意愿请添加添加v&#xff1a;shu_ju…

萨科微所在的功率半导体行业在电子产业中占据重要地位,产品用于电力设备的电能转换和电路控制,是进行电能处理的核心器件

萨科微slkor&#xff08;www.slkormicro.com&#xff09;半导体宋仕强说&#xff0c;萨科微所在的功率半导体行业在电子产业中占据重要地位&#xff0c;产品用于电力设备的电能转换和电路控制&#xff0c;是进行电能处理的核心器件。功率半导体细分产品主要有MOSFET、IGBT、BJT…

恒驰上云规划实施解决方案上线华为云官网

华为云与伙伴共同打造联合解决方案 已成为更多企业的数字化转型利器 1月恒驰上云规划实施解决方案 完成上市宣讲并正式上架华为云官网 恒驰上云规划实施解决方案能力全景图&#xff1a;融合厂商云服务能力&#xff0c;一站式高效云迁移 从深入了解企业的本地IT环境、业务特点…

前端的数据标记协议

文章目录 数据标记协议是什么数据标记协议的作用常见的数据标记协议Open Graph protocol 开放图谱协议基本元数据协议可选元数据结构化属性 —— 元数据的属性多个相同的元数据标签类型元数据的使用方法全局类型使用自定义类型使用对象类型使用歌曲对象类型视频对象类型文章对象…

应急响应-Webshell-典型处置案例

网站后台登录页面被篡改 事件背景 在2018年11月29日4时47分&#xff0c;某网站管理员发现网站后台登录页面被篡改&#xff0c;“中招”服务器为windows系统&#xff0c;应采用java语言开发&#xff0c;所使用的中间件为Tomcat。 事件处置 Webshell排查 利用D盾对网站目录进…

【框架学习 | 第四篇】Spring下篇(Spring AOP、Spring 事务、Spring中7种设计模式)

文章目录 4.详讲AOP4.1什么是AOP&#xff1f;4.2为什么叫做面向切面编程&#xff1f;4.3AOP解决的问题4.4AOP应用场景4.5AOP实现方式4.5.1动态代理的实现&#xff08;1&#xff09;JDK代理&#xff08;2&#xff09;CGLB代理&#xff08;3&#xff09;基于接口的动态代理&#…

国产云数据库介绍

这是ren_dong的第35篇原创 前言 目前布局数据库的IT公司越来越多&#xff0c;主要基于 计算场景的延伸和拓展。在不同的计算场景下&#xff0c;所需要的数据库的性能会有所差异。 特别是在 云计算场景下&#xff0c;传统的数据库面临一定挑战。腾讯、阿里巴巴等纷纷开发更加适合…