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

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 DataTypes::*;
  27. import Interfaces::*;
  28. import Controls::*;
  29. import FIFO::*;
  30. import Vector::*;
  31. import GetPut::*;
  32. module mkReedEncoder#(function ReedSolomonCtrl#(8) mapCtrl(ctrl_t ctrl))
  33.    (ReedEncoder#(ctrl_t,sz,sz))
  34.    provisos(Mul#(num,8,sz),
  35.     Bits#(ctrl_t, ctrl_sz));
  36.     Vector#(16, Bit#(8)) gPoly = newVector();
  37.     gPoly[15] = 59;
  38.     gPoly[14] = 13;
  39.     gPoly[13] = 104;
  40.     gPoly[12] = 189;
  41.     gPoly[11] = 68;
  42.     gPoly[10] = 209;
  43.     gPoly[9]  = 30;
  44.     gPoly[8]  = 8;
  45.     gPoly[7]  = 163;
  46.     gPoly[6]  = 65;
  47.     gPoly[5]  = 41;
  48.     gPoly[4]  = 229;
  49.     gPoly[3]  = 98;
  50.     gPoly[2]  = 50;
  51.     gPoly[1]  = 36;
  52.     gPoly[0]  = 59;
  53.     FIFO#(EncoderMesg#(ctrl_t, sz))  inQ <- mkLFIFO;
  54.     FIFO#(EncoderMesg#(ctrl_t, sz)) outQ <- mkSizedFIFO(2);
  55.     Reg#(ctrl_t)                 control <- mkRegU;
  56.     Reg#(Bit#(8))  inCounter <- mkReg(0);
  57.     Reg#(Bit#(8)) outCounter <- mkReg(0);
  58.     Reg#(Vector#(16, Bit#(8))) shiftRegs <- mkReg(replicate(0));
  59.     function Bit#(8) mul(Bit#(8) a, Bit#(8) b);
  60.         Bit#(8) z = 0;
  61.         z[0] = b[0]&a[0]^b[1]&a[7]^b[2]&a[6]^b[3]&a[5]^b[4]&a[4]^b[5]&a[3]^b[5]&a[7]^b[6]&a[2]^b[6]&a[6]^b[6]&a[7]^b[7]&a[1]^b[7]&a[5]^b[7]&a[6]^b[7]&a[7];
  62.         z[1] = b[0]&a[1]^b[1]&a[0]^b[2]&a[7]^b[3]&a[6]^b[4]&a[5]^b[5]&a[4]^b[6]&a[3]^b[6]&a[7]^b[7]&a[2]^b[7]&a[6]^b[7]&a[7];
  63.         z[2] = b[0]&a[2]^b[1]&a[1]^b[1]&a[7]^b[2]&a[0]^b[2]&a[6]^b[3]&a[5]^b[3]&a[7]^b[4]&a[4]^b[4]&a[6]^b[5]&a[3]^b[5]&a[5]^b[5]&a[7]^b[6]&a[2]^b[6]&a[4]^b[6]&a[6]^b[6]&a[7]^b[7]&a[1]^b[7]&a[3]^b[7]&a[5]^b[7]&a[6];
  64.         z[3] = b[0]&a[3]^b[1]&a[2]^b[1]&a[7]^b[2]&a[1]^b[2]&a[6]^b[2]&a[7]^b[3]&a[0]^b[3]&a[5]^b[3]&a[6]^b[4]&a[4]^b[4]&a[5]^b[4]&a[7]^b[5]&a[3]^b[5]&a[4]^b[5]&a[6]^b[5]&a[7]^b[6]&a[2]^b[6]&a[3]^b[6]&a[5]^b[6]&a[6]^b[7]&a[1]^b[7]&a[2]^b[7]&a[4]^b[7]&a[5];
  65.         z[4] = b[0]&a[4]^b[1]&a[3]^b[1]&a[7]^b[2]&a[2]^b[2]&a[6]^b[2]&a[7]^b[3]&a[1]^b[3]&a[5]^b[3]&a[6]^b[3]&a[7]^b[4]&a[0]^b[4]&a[4]^b[4]&a[5]^b[4]&a[6]^b[5]&a[3]^b[5]&a[4]^b[5]&a[5]^b[6]&a[2]^b[6]&a[3]^b[6]&a[4]^b[7]&a[1]^b[7]&a[2]^b[7]&a[3]^b[7]&a[7];
  66.         z[5] = b[0]&a[5]^b[1]&a[4]^b[2]&a[3]^b[2]&a[7]^b[3]&a[2]^b[3]&a[6]^b[3]&a[7]^b[4]&a[1]^b[4]&a[5]^b[4]&a[6]^b[4]&a[7]^b[5]&a[0]^b[5]&a[4]^b[5]&a[5]^b[5]&a[6]^b[6]&a[3]^b[6]&a[4]^b[6]&a[5]^b[7]&a[2]^b[7]&a[3]^b[7]&a[4];
  67.         z[6] = b[0]&a[6]^b[1]&a[5]^b[2]&a[4]^b[3]&a[3]^b[3]&a[7]^b[4]&a[2]^b[4]&a[6]^b[4]&a[7]^b[5]&a[1]^b[5]&a[5]^b[5]&a[6]^b[5]&a[7]^b[6]&a[0]^b[6]&a[4]^b[6]&a[5]^b[6]&a[6]^b[7]&a[3]^b[7]&a[4]^b[7]&a[5];
  68.         z[7] = b[0]&a[7]^b[1]&a[6]^b[2]&a[5]^b[3]&a[4]^b[4]&a[3]^b[4]&a[7]^b[5]&a[2]^b[5]&a[6]^b[5]&a[7]^b[6]&a[1]^b[6]&a[5]^b[6]&a[6]^b[6]&a[7]^b[7]&a[0]^b[7]&a[4]^b[7]&a[5]^b[7]&a[6];
  69.         return z;
  70.     endfunction
  71.     rule outTime (outCounter != 0);
  72.        Vector#(num, Bit#(8)) vecMesg = replicate(0);
  73.        for(Integer i = 0; i < valueOf(num); i=i+1)
  74.   begin
  75.      Bit#(4) outIdx = truncate(16-outCounter+fromInteger(i));
  76.              vecMesg[i] = (shiftRegs._read())[outIdx];
  77.   end
  78.        outQ.enq(Mesg{control: control, data: pack(vecMesg)});
  79.        let newOutCounter = outCounter - fromInteger(valueOf(num));
  80.        outCounter <= newOutCounter;
  81.        if(newOutCounter == 0)
  82.           shiftRegs <= replicate(0);
  83.     endrule
  84.     rule normal (outCounter == 0);
  85.         let mesg = inQ.first();
  86.         inQ.deq();
  87.         control <= mesg.control;
  88.         let ctrl = mapCtrl(mesg.control);
  89.         if(ctrl.in == 12)
  90.             outQ.enq(mesg);
  91.         else
  92.         begin
  93.             let newInCounter  = inCounter == 0 ? ctrl.in - fromInteger(valueOf(num)) : inCounter - fromInteger(valueOf(num));
  94.             let newOutCounter = newInCounter == 0 ? ctrl.out : 0;
  95.             Vector#(16, Bit#(8)) newShiftRegs  = shiftRegs;
  96.             Vector#(num, Bit#(8)) vecMesg = unpack(mesg.data);
  97.             for(Integer b = valueOf(num) - 1; b >= 0; b=b-1)
  98.             begin
  99.                 let dataIn   = vecMesg[b];
  100.                 let feedback = newShiftRegs[15]^dataIn;
  101.                 Vector#(16, Bit#(8)) muls = newVector();
  102.                 for(Integer j = 0; j < 16; j=j+1)
  103.                     muls[j] = mul(feedback, gPoly[j]);
  104.                 Vector#(16, Bit#(8)) vals = newVector();
  105.                 for(Integer j = 1; j < 16; j=j+1)
  106.                     vals[j] = muls[j] ^ newShiftRegs[j-1];
  107.                 vals[0] = muls[0];
  108.                 newShiftRegs = vals;
  109.             end
  110.             shiftRegs <= newShiftRegs;
  111.             inCounter  <= newInCounter;
  112.             outCounter <= newOutCounter;
  113.             outQ.enq(mesg);
  114.         end
  115.     endrule
  116.     interface in  = fifoToPut(inQ);
  117.     interface out = fifoToGet(outQ);
  118. endmodule