「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详解及代码分享_牛客网

相关推荐
9527华安18 分钟前
Xilinx系列FPGA实现HDMI2.1视频收发,支持8K@60Hz分辨率,提供2套工程源码和技术支持
fpga开发·音视频·8k·hdmi2.1
RadNIkMan19 分钟前
Python学习(二)操作列表
网络·python·学习
笑鸿的学习笔记21 分钟前
ROS2笔记之服务通信和基于参数的服务通信区别
android·笔记·microsoft
yanxy5121 小时前
【TS学习】(15)分布式条件特性
前端·学习·typescript
lalapanda1 小时前
UE5学习记录 part13
学习·ue5
大熊Superman1 小时前
FPGA实现LED流水灯
fpga开发
高林雨露1 小时前
Java对比学习Kotlin的详细指南(一)
java·学习·kotlin
安建资小栗子2 小时前
2025年汽车加气站操作工备考题库
笔记
齐尹秦2 小时前
HTML5 Web Workers 学习笔记
笔记·学习
DarkBule_2 小时前
零基础驯服GitHub Pages
css·学习·html·github·html5·web