⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 input_fifo_rev0.0.v

📁 Verilog jpec coder encoder source code
💻 V
字号:
/////////////////////////////////////////////////
//
//  Module Name: 	input_fifo
// 	Descr: 			Synchronous FIFO for Input
// 					Using 256x16 Dual Port BRAM
// 	Author: 		James Rosenthal
// 	Date: 			10/25/04
//
//
// 	Version	Date		Modifications
// 	---------------------------------
// 	0.0		10/28/04	Initial
//
/////////////////////////////////////////////////

`timescale 1ns / 10ps

module input_fifo(
	clk,		// Clock Sync'd for both R&W
	din,		// 13-Bit Data Input
	wr_en,		// Write Enable
	rd_en,		// Read Enable
	rst,		// Active Low Reset
	dout,		// 13-bit Data Output
	full,		// Full Flag
	empty		// Empty Flag
	);

	//
	// Inputs & Outputs
	//
	
	input [12:0] din;	// Data Input
	input wr_en;		// Write Enable
	input rd_en;		// Read Enable
	input rst;			// Active Low Reset
	input clk;			// Input clk
	
	output [12:0] dout; // Data Output
	output full;		// Full Flag
	output empty;		// Empty Flag

	//
	// Registers & Wires
	//
	reg [7:0] read_addr;
	reg [7:0] write_addr;
	wire [15:0] doutf;

	wire enrd, enwr;

	//
	// Behavioral Description
	//
	
	// Empty/Full Flag Generation
	assign empty = read_addr == write_addr;
	assign full = write_addr > read_addr ? (write_addr - read_addr) == 8'd255 : read_addr - write_addr == 8'd1;
	assign dout = doutf[12:0];
	assign enrd = rd_en & !empty;
	assign enwr = wr_en & !full;
	
	// Address Pointers
	// Concurrent Reads/Writes allowed in Block RAM
	always @ (posedge clk or negedge rst)
	begin
		if(!rst)
		begin
			write_addr <= 8'h0;
			read_addr <= 8'h0;
		end
		// read, not empty
		else if(rd_en && !wr_en && !empty)
			read_addr <= read_addr + 8'h1;
		// write, not full
		else if(wr_en && !rd_en && !full)
			write_addr <= write_addr + 8'h1;
		// simulataneous read/write, address pointers don't match
		else if(read_addr != write_addr && wr_en && rd_en)
		begin
			write_addr <= write_addr + 8'h1;
			read_addr <= read_addr + 8'h1;
		end
	end
	
	// Instantiate Block RAM
	// Port A for Writes
	// Port B for Reads
	bram_256x16 infifo(
		.addra(write_addr[7:0]),
		.addrb(read_addr[7:0]),
		.clka(clk),
		.clkb(clk),
		.dina({3'h0,din}),
		.doutb(doutf),
		.enb(enrd),
		.sinita(rst),
		.sinitb(rst),
		.wea(enwr)
	);
	
	
endmodule
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -