📄 m3s007an.v
字号:
// Transmit FIFO Controller// Copyright Mentor Graphics Corporation and Licensors 1999// V1.500// This module provides the transmit FIFO control// for the M16550a UART.// Revision history:// V1.500 - 29 September 1999// Remove signal THold1 from this module as superflous (ECN 1267)// V1.400 - 12 May 1999// Signals renamed// V1.3 - Added DELTA_TRST output 10/11/97// V1.2 - TFULL modified to match the real part more closely// V1.1 - OP_A and IP_A reduced to 4-bits in the port list// V1.0 - Created 26/9/96module m3s007an ( CLK, MR, NWR, ADD0, ADD2, LoadTxBuff, DI2, DI0, FIFOE, TOP_A, TIP_A, TEmpt, TFull, NVWR, NVRD, DELTA_TRST );input CLK, MR, NWR, ADD0, ADD2, LoadTxBuff;input DI2, DI0, FIFOE;output [3:0] TOP_A, TIP_A;output TEmpt, TFull;output NVWR, NVRD;output DELTA_TRST; // Delta version of TX FIFO resetreg [3:0] TOP_A, TIP_A;reg [4:0] OP_A, IP_A, TOffset;reg [1:0] TSR;reg DTRST, TRST, TEmpt, TFull;reg NVRD, NVWR, DELTA_TRST;// Generate reset for Tx FIFO counter using bit 2 in FCRalways @(posedge NWR or posedge MR) if (MR) DTRST <= 0; else if (ADD2 & DI2 & DI0) // Ensures fifo are enabled (DI0) DTRST <= ~TSR[1];always @(posedge CLK or posedge MR) if (MR) TSR <= 2'b00; else TSR <= {TSR[0],DTRST};// Holds FIFOs in reset when disabledalways @(DTRST or TSR or FIFOE)begin TRST = ((DTRST ^ TSR[1]) | ~FIFOE); DELTA_TRST = (DTRST ^ TSR[1]);end// Prevent writing if FIFO is fullalways @(ADD0 or TOffset or FIFOE) NVWR = ~(ADD0 & ~TOffset[4] & FIFOE);// Prevent reading if FIFO is emptyalways @(TEmpt or LoadTxBuff) NVRD = (TEmpt | ~LoadTxBuff);// Counter is held in reset when FIFOs are disabled//// Tx FIFO input counteralways @(posedge NWR or posedge MR) if (MR) IP_A <= 0; else if (~NVWR) // Only write to FIFO when not full IP_A <= IP_A + 1;// Tx FIFO output counteralways @(posedge CLK or posedge MR) if (MR) OP_A <= 0; else if (TRST) OP_A <= IP_A; // Synchronous reset else if (~NVRD) // Only read from FIFO when it contains something OP_A <= OP_A + 1;// Works out difference between input and output pointers.always @(IP_A or OP_A) TOffset = (IP_A - OP_A);// Decide if FIFO is below trigger level or holding 1 characteralways @(TOffset)begin TEmpt = (TOffset == 0);end// IP_A & OP_A reduced by 1 bit for exporting to upper levelalways @(IP_A or OP_A)begin TIP_A = IP_A[3:0]; TOP_A = OP_A[3:0];endalways @(posedge CLK or posedge MR) if (MR) TFull <= 0; else TFull <= ((TFull | TOffset[4]) & ~TEmpt);endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -