BRAMFIFO.bsv
上传用户:aoptech
上传日期:2014-09-22
资源大小:784k
文件大小:3k
源码类别:

3G开发

开发平台:

Others

  1. //----------------------------------------------------------------------//
  2. // The MIT License 
  3. // 
  4. // Copyright (c) 2007 Alfred Man Cheuk Ng, mcn02@mit.edu 
  5. // 
  6. // Permission is hereby granted, free of charge, to any person 
  7. // obtaining a copy of this software and associated documentation 
  8. // files (the "Software"), to deal in the Software without 
  9. // restriction, including without limitation the rights to use,
  10. // copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. // copies of the Software, and to permit persons to whom the
  12. // Software is furnished to do so, subject to the following conditions:
  13. // 
  14. // The above copyright notice and this permission notice shall be
  15. // included in all copies or substantial portions of the Software.
  16. // 
  17. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  19. // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  20. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  21. // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  22. // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  23. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  24. // OTHER DEALINGS IN THE SOFTWARE.
  25. //----------------------------------------------------------------------//
  26. import BRAM::*;
  27. import EHRReg::*;
  28. import FIFO::*;
  29. module mkBRAMFIFO#(index_t lo_index, index_t hi_index) 
  30.    (FIFO#(data_t))
  31.    provisos (Bits#(index_t,size_index),
  32.      Bits#(data_t,size_data),
  33.      Arith#(index_t),
  34.      Eq#(index_t),
  35.      Literal#(index_t));
  36.    // state elements
  37.    BRAM#(index_t,data_t) bram <- mkRegFileBRAM(lo_index, hi_index);
  38.    Reg#(index_t)         tail <- mkReg(0);
  39.    EHRReg#(2,index_t)    head <- mkEHRReg(0);
  40.    EHRReg#(3,Bool)       over <- mkEHRReg(False);
  41.    
  42.    // constants
  43.    let notEmpty = head[0] != tail || over[0];
  44.    let notFull  = head[1] != tail || !over[1]; 
  45.    
  46.    // rules
  47.    rule putReadRequest (True);
  48.       bram.readRequest(head[1]);
  49.    endrule
  50.    
  51.    // methods (first < deq < enq < clear)
  52.    method data_t first() if (notEmpty);
  53.       return bram.readResponse();
  54.    endmethod
  55.       
  56.    method Action deq() if (notEmpty);
  57.       if (head[0] == hi_index)
  58.  begin
  59.     head[0] <= 0;
  60.     over[0] <= !over[0];
  61.  end
  62.       else
  63.  begin
  64.     head[0] <= head[0] + 1;
  65.  end
  66.    endmethod
  67.    method Action enq(data_t data) if (notFull);
  68.       if (tail == hi_index)
  69.  begin
  70.     tail <= 0;
  71.     over[1] <= !over[1]; 
  72.  end
  73.       else
  74.  begin
  75.     tail <= tail + 1;
  76.  end
  77.       bram.writeRequest(tail,data);
  78.    endmethod
  79.    
  80.    method Action clear();
  81.       tail <= head[1];
  82.       over[2] <= False;
  83.    endmethod
  84. endmodule