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

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 Complex::*;
  27. import Controls::*;
  28. import DataTypes::*;
  29. import GetPut::*;
  30. import Interfaces::*;
  31. import LibraryFunctions::*;
  32. import PilotInsert::*;
  33. import Vector::*;
  34. import ChannelEstimator::*;
  35. function t idFunc (t in);
  36.    return in;
  37. endfunction
  38. function Symbol#(64,2,14) pilotAdder(Symbol#(48,2,14) x, 
  39.      Bit#(1) ppv);
  40.    
  41.    Integer i =0, j = 0;
  42.    // assume all guards initially
  43.    Symbol#(64,2,14) syms = replicate(cmplx(0,0));
  44.    
  45.    // data subcarriers
  46.    for(i = 6; i < 11; i = i + 1, j = j + 1)
  47.       syms[i] = x[j];
  48.    for(i = 12; i < 25; i = i + 1, j = j + 1)
  49.       syms[i] = x[j]; 
  50.    for(i = 26; i < 32 ; i = i + 1, j = j + 1)
  51.       syms[i] = x[j];  
  52.    for(i = 33; i < 39 ; i = i + 1, j = j + 1)
  53.       syms[i] = x[j];   
  54.    for(i = 40; i < 53 ; i = i + 1, j = j + 1)
  55.       syms[i] = x[j];
  56.    for(i = 54; i < 59 ; i = i + 1, j = j + 1)
  57.       syms[i] = x[j];
  58.    //pilot subcarriers
  59.    syms[11] = mapBPSK(False, ppv); // map 1 to -1, 0 to 1
  60.    syms[25] = mapBPSK(False, ppv); // map 1 to -1, 0 to 1
  61.    syms[39] = mapBPSK(False, ppv); // map 1 to -1, 0 to 1
  62.    syms[53] = mapBPSK(True,  ppv); // map 0 to -1, 1 to 1
  63.    
  64.    return syms;
  65. endfunction
  66. function Symbol#(48,2,14) pilotRemover(Symbol#(64,2,14) x);   
  67.    Integer i =0, j = 0;
  68.    // assume all guards initially
  69.    Symbol#(48,2,14) syms = newVector;
  70.    
  71.    // data subcarriers
  72.    for(i = 6; i < 11; i = i + 1, j = j + 1)
  73.       syms[j] = x[i];
  74.    for(i = 12; i < 25; i = i + 1, j = j + 1)
  75.       syms[j] = x[i]; 
  76.    for(i = 26; i < 32 ; i = i + 1, j = j + 1)
  77.       syms[j] = x[i];  
  78.    for(i = 33; i < 39 ; i = i + 1, j = j + 1)
  79.       syms[j] = x[i];   
  80.    for(i = 40; i < 53 ; i = i + 1, j = j + 1)
  81.       syms[j] = x[i];
  82.    for(i = 54; i < 59 ; i = i + 1, j = j + 1)
  83.       syms[j] = x[i];
  84.    
  85.    return syms;
  86. endfunction
  87. (* synthesize *)
  88. module mkChannelEstimatorTest(Empty);
  89.    
  90.    PilotInsert#(PilotInsertCtrl,48,64,2,14) pilotInsert;
  91.    pilotInsert <- mkPilotInsert(idFunc,
  92. pilotAdder,
  93. 7'b1001000,
  94. 7'b1111111);
  95.    ChannelEstimator#(PilotInsertCtrl,64,48,2,14) channelEstimator;
  96.    channelEstimator <- mkChannelEstimator(pilotRemover);
  97.    Reg#(Bit#(32)) cycle <- mkReg(0);
  98.    
  99.    rule putIntput(True);
  100.       PilotInsertMesg#(PilotInsertCtrl,48,2,14) iMesg;
  101.       iMesg = Mesg{ control: (cycle[2:0] == 0) ? 
  102.               PilotRst : 
  103.               PilotNorm,
  104.    data: replicate(cmplx(1,1))};
  105.       pilotInsert.in.put(iMesg);
  106.       $display("Pilot Insert Input: %h",iMesg.data);
  107.    endrule
  108.   
  109.    rule putChannel(True);
  110.       let oMesg <- pilotInsert.out.get;
  111.       channelEstimator.in.put(oMesg);
  112.       $display("Pilot Insert Output: %h",oMesg.data);
  113.    endrule
  114.    
  115.    rule getOutput(True);
  116.       let oMesg <- channelEstimator.out.get;
  117.       $display("Channel Estimator Output: %h",oMesg.data);
  118.    endrule
  119.    
  120.    rule tick(True);
  121.       cycle <= cycle + 1;
  122.       if (cycle == 100000)
  123.  $finish;
  124.       $display("Cycle: %d",cycle);
  125.    endrule
  126.    
  127. endmodule