閱讀295 返回首頁    go 阿裏雲 go 技術社區[雲棲]


FIFO存儲器代碼




module fifo(clock,reset,read,write,fifo_in,fifo_out,fifo_empty,fifo_half,fifo_full);
input clock,reset,read,write;
input [7:0] fifo_in;
output [7:0] fifo_out;
output fifo_empty,fifo_half,fifo_full;  //表示存儲單元使用情況的標誌位

reg [7:0] fifo_out;
reg [2:0] read_ptr,write_ptr,counter;  //讀,寫指針及計數器
reg [7:0] ram [7:0];  //8個8位的存儲單元
wire fifo_empty,fifo_half,fifo_full;

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:    //寫指令,數據輸入FIFO
        begin
          ram[write_ptr]=fifo_in;   //將輸入數據寫入存儲單元
          counter=counter+1;   //每寫入一個數就讓計數器加1
          write_ptr=(write_ptr==7)?0:write_ptr+1;
          
         /*寫指針加1,若指針指向最後一個存儲單元(write_ptr==7),則把指針指向第一個存儲單元*/
        end   
        
      2'b10:  //讀指令,數據從FIFO輸出
         begin
           fifo_out=ram[read_ptr];  //將存儲單元的數據輸出
           counter=counter-1;     //每讀出一個數就讓計數器減1
           read_ptr=(read_ptr==7)?0:read_ptr+1; 
           /*讀指針加1,若指針指向最後一個存儲單元(read _ptr ==7),則把指針指向第一個存儲單元*/
           
         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==7)?0:write_ptr+1;
                   read_ptr=(read_ptr==7)?0:read_ptr+1;
                end
           end     
       endcase

assign fifo_empty=(counter==0);  //存儲單元都是空的時候將標誌位fifo_empty置1
   assign fifo_full=(counter==7);   //存儲單元都滿了的情況下將標誌位fifo_full置1
   assign fifo_half=(counter==4);    //存儲單元占用了一半的時候將標誌位fifo_half置1

endmodule



最後更新:2017-04-03 12:55:39

  上一篇:go 算法訓練-動態規劃基礎
  下一篇:go OLE DB provider "SQLNCLI11" for linked server "dbLink01" was unable to begin a distributed t