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

相关推荐
Shang180989357261 天前
T41LQ 一款高性能、低功耗的系统级芯片(SoC) 适用于各种AIoT应用智能安防、智能家居方案优选T41L
人工智能·驱动开发·嵌入式硬件·fpga开发·信息与通信·信号处理·t41lq
安全不再安全1 天前
免杀技巧 - 早鸟注入详细学习笔记
linux·windows·笔记·学习·测试工具·web安全·网络安全
BreezeJuvenile1 天前
外设模块学习(8)——HC-SR04超声波模块(STM32)
stm32·单片机·嵌入式硬件·学习·超声波测距模块·hc-sr04
LBuffer1 天前
破解入门学习笔记题三十八
笔记·学习
微露清风1 天前
系统性学习C++-第十讲-stack 和 quene
java·c++·学习
PyAIGCMaster1 天前
钉钉的设计理念方面,我可以学习
人工智能·深度学习·学习·钉钉
Elias不吃糖1 天前
第四天学习总结:C++ 文件系统 × Linux 自动化 × Makefile 工程化
linux·c++·学习
CodeCraft Studio1 天前
PPT处理控件Aspose.Slides教程:使用Java将PowerPoint笔记导出为PDF
java·笔记·pdf·powerpoint·aspose·ppt转pdf·java将ppt导出pdf
雍凉明月夜1 天前
人工智能学习中深度学习之python基础之 类
python·学习
王同学要变强1 天前
【深入学习Vue丨第二篇】构建动态Web应用的基础
前端·vue.js·学习