我想大家都知道,隊列是計算機系統中一種比較基本的數據結構。作為隊列中的一種,先進先出的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的學習中取得進步。