Verilog整理筆記之FIFO篇


  我想大家都知道,隊列是計算機系統中一種比較基本的數據結構。作為隊列中的一種,先進先出的FIFO是一種比較常用的存儲器單元。FIFO通常有讀允許端口、寫允許端口、數據輸入端口、數據輸出端口、FIFO狀態端口等信號端口。其中,FIFO狀態端口輸出當前FIFO的狀態——滿、未滿或空。

  16*16位FIFO的功能框圖如下。其中,clock為系統時鍾信號輸入,reset為系統復位信號,read為讀數據信號允許信號,write為寫入FIFO允許信號,fifo_in[15:0]為數據輸入,fifo_out[15:0]為數據輸出,fifo_empty為指示FIFO當前是空的,這種情況下,只能對FIFO進行寫入數據操作;fifo_full指示當前FIFO是滿的,這種情況下,當然只能對FIFO進行讀數據操作,是不能寫入數據的;fifo_half指示當前FIFO隊列中沒空也沒滿,這種情況下,既可以對FIFO進行寫入數據操作,也能進行讀數據操作。

16*16位FIFO讀寫數據操作的Verilog HDL的代碼整理如下。

module FIFO_16_16(
      clock,reset,
      read,write,fifo_in,fifo_out,
      fifo_empty,fifo_full,fifo_half);
input clock,reset,read,write;
input [15:0] fifo_in;
output [15:0] fifo_out;
output fifo_empty,fifo_full,fifo_half;

reg [15:0] fifo_out;
reg [3:0] read_ptr,write_ptr,counter;
reg [15:0] ram [15:0];
wire fifo_empty,fifo_full,fifo_half;

always @(posedge clock)
 if(reset)
  begin
  read_ptr=0;
  write_ptr=0;
  counter=0;
  fifo_out=0;
  end
 else
 case({read,write})
  2'b00: counter=counter;
  2'b01: begin
     ram[write_ptr]=fifo_in;
     counter=counter+1;
     write_ptr=(write_ptr==15)?0:write_ptr+1;
     end
  2'b10: begin
     fifo_out=ram[read_ptr];
     counter=counter-1;
     read_ptr=(read_ptr==15)?0:read_ptr+1;
     end
  2'b11: begin
     if(counter==0)
      fifo_out=fifo_in;
     else
      begin
       ram[write_ptr]=fifo_in;
       fifo_out=ram[read_ptr];
       write_ptr=(write_ptr==15)?0:write_ptr+1;
       read_ptr=(read_ptr==15)?0:read_ptr+1;
      end
     end
 endcase
assign fifo_empty=(counter==0);
assign fifo_full=(counter==15);
assign fifo_half=(counter==8);
endmodule

  至此,我整理了Verilog HDL語言在基本邏輯電路設計中關於存儲器設計的ROM、SRAM和FIFO的設計實例,其中的代碼都是筆者親自測試過的,希望朋友們能指出不足之處,以便筆者在FPGA和Verilog的學習中取得進步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM