「Verilog学习笔记」同步FIFO

专栏前言

本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网

复制代码
`timescale 1ns/1ns
/**********************************RAM************************************/
module dual_port_RAM #(parameter DEPTH = 16,
					   parameter WIDTH = 8)(
	 input wclk
	,input wenc
	,input [$clog2(DEPTH)-1:0] waddr  //深度对2取对数,得到地址的位宽。
	,input [WIDTH-1:0] wdata      	//数据写入
	,input rclk
	,input renc
	,input [$clog2(DEPTH)-1:0] raddr  //深度对2取对数,得到地址的位宽。
	,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 ADDR_WIDTH = $clog2(DEPTH) ;

	reg [ADDR_WIDTH:0] waddr, raddr ; 

	always @ (posedge clk or negedge rst_n) begin 
		if (~rst_n) waddr <= 'b0 ; 
		else 
			if (winc && ~wfull) waddr <= waddr + 1'b1 ; // 当写使能且未写满时 写地址+1
			else waddr <= waddr ; 
	end

	always @ (posedge clk or negedge rst_n) begin 
		if (~rst_n) raddr <= 'b0 ; 
		else 
			if (rinc && ~rempty) raddr <= raddr + 1'b1 ; // 当读使能且未空时 读地址+1
			else raddr <= raddr ; 
	end

	always @ (posedge clk or negedge rst_n) begin 
		if (~rst_n) begin 
			wfull <= 'b0 ; 
			rempty <= 'b0 ; 
		end
		else begin 
			wfull <= (raddr == {~waddr[ADDR_WIDTH], waddr[ADDR_WIDTH - 1:0]}) ; //第n位相反 后n-1位相同
			rempty <= (raddr == waddr) ; // 读地址追上写地址
		end
	end

	dual_port_RAM #(.DEPTH(DEPTH), .WIDTH(WIDTH)) dual_port_RAM_U0 
	(
			.wclk(clk),
			.wenc(winc),
			.waddr(waddr[ADDR_WIDTH - 1:0]),
			.wdata(wdata),
			.rclk(clk),
			.renc(rinc),
			.raddr(raddr[ADDR_WIDTH - 1:0]),
			.rdata(rdata)
	);

endmodule

参考资料:FPGA数字IC笔试面试013---同步FIFO详解及代码分享_牛客网

相关推荐
im_AMBER11 分钟前
数据结构 18 【复习】广义表 | 各种内部排序 | 二叉排序树的平均查找长度 ASL
数据结构·笔记·学习·排序算法
世人万千丶14 分钟前
鸿蒙跨端框架Flutter学习day 2、常用UI组件-层叠布局 Stack & Positioned
学习·flutter·ui·实时互动·harmonyos·鸿蒙
好奇龙猫16 分钟前
【人工智能学习-AI入试相关题目练习-第四次】
人工智能·学习
马克学长19 分钟前
SSM学生出国境学习交流管理87153(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·学习·ssm 框架·学生出国境管理·在线申请
chilavert31832 分钟前
DashGO框架开发应用的笔记-1
笔记
航Hang*1 小时前
Photoshop 图形与图像处理技术——第9章:实践训练1——绘制禁烟标志和奥运五环
图像处理·笔记·学习·ui·photoshop
saoys1 小时前
Opencv 学习笔记:图像金字塔实现上采样(pyrUp)与降采样(pyrDown)
笔记·opencv·学习
大志若愚YYZ1 小时前
ROS2学习 C++中的this指针
c++·学习·算法
hhcccchh2 小时前
学习vue第十三天 Vue3组件深入指南:组件的艺术与科学
javascript·vue.js·学习
崔高杰2 小时前
【论文阅读笔记】Agent Memory相关文献追踪——异构存储和经验记忆相关
论文阅读·笔记