讀華為技術文檔《FIFO經驗談》看到的這個電路:
FIFO的讀寫地址產生比較簡單,當讀使能有效時,在時鍾作用下,讀地址加1;當寫使能有效時,寫地址加1。
當FIFO深度較大時,同時FIFO的速度要求較高時,可以采用線性反饋移位計數器 (LFSR)。它的速度非常快,但是要犧牲一個地址。
針對同步的大FIFO,它們的讀寫地址完全可以使用線性反饋移位寄存器 LFSR 產生,而不 是簡單的加1操作,極大的提高了速度,如果對FIFO的利用率沒有很高要求的時候,推薦使用該方法。使用LFSR的優點是在XILINX的FPGA中布線,可以使用LUT直接完成。
1 /************************************************************\ 2 * * 3 * Generation of Read and Write address pointers. They use * 4 * LFSR counters, which are very fast. Because of the * 5 * nature of LFSR, one address is sacrificed. * 6 * * 7 \************************************************************/ 8 wire read_linearfeedback, write_linearfeedback; 9 10 assign read_linearfeedback = ! (read_addr[8] ^ read_addr[4]); 11 assign write_linearfeedback = ! (write_addr[8] ^ write_addr[4]); 12 13 always @(posedge clock or posedge fifo_gsr) 14 if (fifo_gsr) read_addr <= 9'h0; 15 else if (read_allow) 16 read_addr <= { read_addr[7], read_addr[6], read_addr[5], 17 read_addr[4], read_addr[3], read_addr[2], 18 read_addr[1], read_addr[0], read_linearfeedback }; 19 20 always @(posedge clock or posedge fifo_gsr) 21 if (fifo_gsr) write_addr <= 9'h0 22 else if (write_allow) 23 write_addr <= { write_addr[7], write_addr[6], write_addr[5], 24 write_addr[4], write_addr[3], write_addr[2], 25 write_addr[1], write_addr[0], write_linearfeedback };