uart_fifo.v

来自「uart协议、实现、验证」· Verilog 代码 · 共 279 行

V
279
字号
//////////////////////////////////////////////////////////////////////////                                                              ////////  uart_fifo.v                                                 ////////                                                              ////////                                                              ////////  This file is part of the "UART 16550 compatible" project    ////////  http://www.opencores.org/cores/uart16550/                   ////////                                                              ////////  Documentation related to this project:                      ////////  - http://www.opencores.org/cores/uart16550/                 ////////                                                              ////////  Projects compatibility:                                     ////////  - WISHBONE                                                  ////////  RS232 Protocol                                              ////////  16550D uart (mostly supported)                              ////////                                                              ////////  Overview (main Features):                                   ////////  UART core receiver FIFO                                     ////////                                                              ////////  Known problems (limits):                                    ////////  Note that the same FIFO is used for both transmission  and  ////////  reception but the error bit generation is ignored in tx.    ////////                                                              ////////  To Do:                                                      ////////  Nothing.                                                    ////////                                                              ////////  Author(s):                                                  ////////      - gorban@opencores.org                                  ////////      - Jacob Gorban                                          ////////                                                              ////////  Created:        2001/05/12                                  ////////  Last Updated:   2001/05/17                                  ////////                  (See log for the revision history)          ////////                                                              ////////                                                              //////////////////////////////////////////////////////////////////////////////                                                              //////// Copyright (C) 2000 Jacob Gorban, gorban@opencores.org        ////////                                                              //////// This source file may be used and distributed without         //////// restriction provided that this copyright statement is not    //////// removed from the file and that any derivative work contains  //////// the original copyright notice and the associated disclaimer. ////////                                                              //////// This source file is free software; you can redistribute it   //////// and/or modify it under the terms of the GNU Lesser General   //////// Public License as published by the Free Software Foundation; //////// either version 2.1 of the License, or (at your option) any   //////// later version.                                               ////////                                                              //////// This source is distributed in the hope that it will be       //////// useful, but WITHOUT ANY WARRANTY; without even the implied   //////// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      //////// PURPOSE.  See the GNU Lesser General Public License for more //////// details.                                                     ////////                                                              //////// You should have received a copy of the GNU Lesser General    //////// Public License along with this source; if not, download it   //////// from http://www.opencores.org/lgpl.shtml                     ////////                                                              ////////////////////////////////////////////////////////////////////////////// CVS Revision History//// $Log: uart_fifo.v,v $// Revision 1.3  2001/05/31 20:08:01  gorban// FIFO changes and other corrections.//// Revision 1.3  2001/05/27 17:37:48  gorban// Fixed many bugs. Updated spec. Changed FIFO files structure. See CHANGES.txt file.//// Revision 1.2  2001/05/17 18:34:18  gorban// First 'stable' release. Should be sythesizable now. Also added new header.//// Revision 1.0  2001-05-17 21:27:12+02  jacob// Initial revision////`include "timescale.v"`include "uart_defines.v"module uart_fifo (clk, 	wb_rst_i, data_in, data_out,// Control signals	push, // push strobe, active high	pop,   // pop strobe, active high// status signals	underrun,	overrun,	count,	error_bit,	fifo_reset,	reset_status	);// FIFO parametersparameter fifo_width = `UART_FIFO_WIDTH;parameter fifo_depth = `UART_FIFO_DEPTH;parameter fifo_pointer_w = `UART_FIFO_POINTER_W;parameter fifo_counter_w = `UART_FIFO_COUNTER_W;input				clk;input				wb_rst_i;input				push;input				pop;input	[fifo_width-1:0]	data_in;input				fifo_reset;input       reset_status;output	[fifo_width-1:0]	data_out;output				overrun;output				underrun;output	[fifo_counter_w-1:0]	count;output				error_bit;wire	[fifo_width-1:0]	data_out;// FIFO itselfreg	[fifo_width-1:0]	fifo[fifo_depth-1:0];// FIFO pointersreg	[fifo_pointer_w-1:0]	top;reg	[fifo_pointer_w-1:0]	bottom;reg	[fifo_counter_w-1:0]	count;reg				overrun;reg				underrun;// These registers and signals are to detect rise of of the signals.// Not that it slows the maximum rate by 2, meaning you must reset the signals and then// assert them again for the operation to repeat// This is done to accomodate wait statesreg				push_delay; reg				pop_delay;wire				push_rise = push_delay & push;wire				pop_rise  = pop_delay  & pop;wire [fifo_pointer_w-1:0] top_plus_1 = top + 1;always @(posedge clk or posedge wb_rst_i)begin	if (wb_rst_i)		push_delay <= #1 1'b0;	else		push_delay <= #1 ~push;endalways @(posedge clk or posedge wb_rst_i)begin	if (wb_rst_i)		pop_delay <= #1 1'b0;	else		pop_delay <= #1 ~pop;endalways @(posedge clk or posedge wb_rst_i) // synchronous FIFObegin	if (wb_rst_i)	begin		top		<= #1 0;//		bottom		<= #1 1; igor		bottom		<= #1 1'b0;		underrun	<= #1 1'b0;		overrun		<= #1 1'b0;		count		<= #1 0;		fifo[0]		<= #1 0;		fifo[1]		<= #1 0;		fifo[2]		<= #1 0;		fifo[3]		<= #1 0;		fifo[4]		<= #1 0;		fifo[5]		<= #1 0;		fifo[6]		<= #1 0;		fifo[7]		<= #1 0;		fifo[8]		<= #1 0;		fifo[9]		<= #1 0;		fifo[10]	<= #1 0;		fifo[11]	<= #1 0;		fifo[12]	<= #1 0;		fifo[13]	<= #1 0;		fifo[14]	<= #1 0;		fifo[15]	<= #1 0;	end	else	if (fifo_reset) begin		top		<= #1 0;//		bottom		<= #1 1; igor		bottom		<= #1 1'b0;		underrun	<= #1 1'b0;		overrun		<= #1 1'b0;		count		<= #1 0;	end  else  if(reset_status)    begin  		underrun	<= #1 1'b0;  		overrun		<= #1 1'b0;    end	else	begin		case ({push_rise, pop_rise})		2'b00 : begin				underrun <= #1 1'b0;//				overrun  <= #1 1'b0;// Igor Ko se postavita ostaneta aktivna tako dolgo, dokler se ne naredi read LSR registra	 	        end		2'b10 : if (count==fifo_depth)  // overrun condition			begin				overrun   <= #1 1'b1;				underrun  <= #1 1'b0;			end			else			begin				top       <= #1 top_plus_1;//				fifo[top_plus_1] <= #1 data_in; igor				fifo[top] <= #1 data_in;//				overrun   <= #1 0;// Igor Ko se postavita ostaneta aktivna tako dolgo, dokler se ne naredi read LSR registra				overrun   <= #1 0;				count     <= #1 count + 1;			end		2'b01 : if (~|count)			begin//				overrun  <= #1 1'b0;  Igor Ko se postavita ostaneta aktivna tako dolgo, dokler se ne naredi read LSR registra				overrun  <= #1 1'b0;			end			else			begin				bottom   <= #1 bottom + 1;//				overrun  <= #1 1'b0;  Igor Ko se postavita ostaneta aktivna tako dolgo, dokler se ne naredi read LSR registra				overrun  <= #1 1'b0;				count	 <= #1 count - 1;			end		2'b11 : begin				bottom   <= #1 bottom + 1;				top       <= #1 top_plus_1;//				fifo[top_plus_1] <= #1 data_in; igor				fifo[top] <= #1 data_in;				underrun <= #1 1'b0;//				overrun  <= #1 1'b0;  Igor Ko se postavita ostaneta aktivna tako dolgo, dokler se ne naredi read LSR registra		        end		endcase	endend   // always// please note though that data_out is only valid one clock after pop signalassign data_out = fifo[bottom];// Additional logic for detection of error conditions (parity and framing) inside the FIFO// for the Line Status Register bit 7wire	[fifo_width-1:0]	word0 = fifo[0];wire	[fifo_width-1:0]	word1 = fifo[1];wire	[fifo_width-1:0]	word2 = fifo[2];wire	[fifo_width-1:0]	word3 = fifo[3];wire	[fifo_width-1:0]	word4 = fifo[4];wire	[fifo_width-1:0]	word5 = fifo[5];wire	[fifo_width-1:0]	word6 = fifo[6];wire	[fifo_width-1:0]	word7 = fifo[7];wire	[fifo_width-1:0]	word8 = fifo[8];wire	[fifo_width-1:0]	word9 = fifo[9];wire	[fifo_width-1:0]	word10 = fifo[10];wire	[fifo_width-1:0]	word11 = fifo[11];wire	[fifo_width-1:0]	word12 = fifo[12];wire	[fifo_width-1:0]	word13 = fifo[13];wire	[fifo_width-1:0]	word14 = fifo[14];wire	[fifo_width-1:0]	word15 = fifo[15];// a 1 is returned if any of the error bits in the fifo is 1assign	error_bit = |(word0[1:0]  | word1[1:0]  | word2[1:0]  | word3[1:0]  |            		      word4[1:0]  | word5[1:0]  | word6[1:0]  | word7[1:0]  |            		      word8[1:0]  | word9[1:0]  | word10[1:0] | word11[1:0] |            		      word12[1:0] | word13[1:0] | word14[1:0] | word15[1:0] );endmodule

⌨️ 快捷键说明

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