Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.
If you are asking why ALMOST FULL in addition to FULL it's because in some systems, due to latency or other considerations, you may need to know if the FIFO is near its limit before it actually gets there.
I will divide the answer into 2 parts, synchronous and asynchronous FIFOs.
This is the case where both producer and consumer are working on same clock frequency. Consider the EMPTY condition in a 8 location FIFO. Write pointer (WP) and read pointer (RP) are at same location (say 000). Now consider FULL case. Let us say that producer has written to all 8 locations and WP has rolled back to location 000 after writing to 111. At the same time RP is still at 000. FIFO is FULL and WP=RP. As you can see that WP=RP (or Wp-RP= 0)is condition for both FULL and EMPTY. Thus, to differentiate the 2 we need to know if it was almost full or almost empty some clocks before. Let us say WP-RP=6, at this point it is almost full and when WP-RP=0 occurs we know that it is FULL. You can think of vica versa.
Both producer and consumer are working on different clock frequency. Here we never use almost full and almost empty. Using them might result in deadlock situation. Rather we use n+1 bit WP and RP pointers.