Advertisement
tariq786

Untitled

Oct 17th, 2014
276
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns/1ps
  2.  
  3. module lcbbc
  4.   #(parameter N = 16
  5.     )
  6.   (input clk,
  7.    input          rst, //positive reset
  8.    input [N-1:0]  n,
  9.    input [N-1:0]  min_hd,
  10.    input          start,
  11.    output reg [N-1:0] codes
  12.    );
  13.  
  14.  
  15.   localparam [2:0]
  16.     IDLE = 0,
  17.     CALC_HD = 1,
  18.     CLOCK_CALC_HD = 2,
  19.     FIND_CODE = 3,
  20.     CLOCK_FIND_CODE = 4,
  21.     OUTPUT_CODE = 5,
  22.     CLOCK_OUTPUT_CODE = 6;
  23.  
  24.  
  25.  
  26.   reg [2:0]           state, nxt_state;
  27.   reg [N-1:0]         counterl, nxt_counterl;
  28.   reg [N-1:0]         counterh, nxt_counterh;
  29.   reg [N-1:0]         cand_counter, nxt_cand_counter;
  30.   reg [N-1:0]         new_cand_counter, nxt_new_cand_counter;        
  31.   reg [N-1:0]         pivot_counter, nxt_pivot_counter;        
  32.   reg [N-1:0]         chain_counter, nxt_chain_counter;        
  33.   reg                 lock, nxt_lock;
  34.   reg [N-1:0]         nxt_codes;        
  35.  
  36.   //sequential block
  37.   always @(posedge clk)
  38.     if(rst)
  39.       begin
  40.         state         <= #1 IDLE;
  41.         counterl      <= #1 2**N-1;
  42.         counterh      <= #1 0;
  43.         cand_counter  <= #1 0;
  44.         pivot_counter <= #1 0;
  45.         chain_counter <= #1 0;
  46.         lock          <= #1 0;
  47.         new_cand_counter <= #1 0;
  48.         codes            <= #1 0;
  49.       end
  50.     else
  51.       begin
  52.         state         <= #1 nxt_state;
  53.         counterl      <= #1 nxt_counterl;
  54.         counterh      <= #1 nxt_counterh;
  55.         cand_counter  <= #1 nxt_cand_counter;
  56.         pivot_counter <= #1 nxt_pivot_counter;
  57.         chain_counter <= #1 nxt_chain_counter;
  58.         lock          <= #1 nxt_lock;
  59.         new_cand_counter <= #1 nxt_new_cand_counter;
  60.         codes            <= #1 nxt_codes;
  61.       end
  62.  
  63.  
  64.  
  65.   reg [N-1:0]         HD [0:2**N-1];
  66.   reg [N-1:0]         summation;
  67.   reg [N-1:0]         candidates[0:2**N-1];
  68.   reg [N-1:0]         new_candidates[0:2**N-1]; //equivalent of next_candidates
  69.   reg [N-1:0]         candidate;
  70.   reg [N-1:0]         chain[0:2**N-1];        
  71.   reg [N-1:0]         i;
  72.          
  73.   //assign  codes = results[0] ;
  74.      
  75.   //Finite STATE MACHINE
  76.   always@*
  77.     begin
  78.       //defaults
  79.       nxt_state         = state;
  80.       nxt_counterl      = counterl;
  81.       nxt_counterh      = counterh;
  82.       nxt_cand_counter  = cand_counter;
  83.       nxt_pivot_counter = pivot_counter;
  84.       nxt_chain_counter = chain_counter;
  85.       nxt_lock          = lock;
  86.       nxt_new_cand_counter = new_cand_counter;
  87.       nxt_codes         = codes;
  88.      
  89.       case(state)
  90.         IDLE:
  91.           begin
  92.             if(start)
  93.               nxt_state = CALC_HD;
  94.           end
  95.        
  96.         CALC_HD:
  97.           begin
  98.             summation = sum(counterl ^ counterh); //function call
  99.             if( summation >= min_hd )
  100.                 begin
  101.                   HD[counterl] = 1;
  102.                   candidates[cand_counter] = counterl;
  103.                   nxt_cand_counter = cand_counter + 1;
  104.                   nxt_pivot_counter = nxt_cand_counter;
  105.                 end
  106.             else
  107.               HD[counterl] = 0;
  108.            
  109.             nxt_counterl = counterl - 1;
  110.             if(counterl == 0)
  111.               begin
  112.                 nxt_counterh = counterh + 1;
  113.                 //$display($time,": In CALC_HD: chain_counter=%2d, counterh=%2d\n",chain_counter,counterh);
  114.                 chain[chain_counter] = counterh;
  115.                 nxt_chain_counter = chain_counter + 1;
  116.                 nxt_state = FIND_CODE;
  117.               end
  118.             else
  119.               nxt_state = CLOCK_CALC_HD;
  120.           end // case: CALC_HD
  121.  
  122.         CLOCK_CALC_HD:
  123.           begin
  124.             nxt_state = CALC_HD;
  125.           end
  126.  
  127.         FIND_CODE:
  128.           begin
  129.             if( pivot_counter > 1)
  130.               begin
  131.                 if(! lock )
  132.                   begin
  133.                     candidate = candidates[pivot_counter-1];  //since pivot counter exceeds by 1
  134.                     nxt_lock = 1;
  135.                   end
  136.                
  137.                 if( cand_counter > 1 )
  138.                   begin
  139.                     summation = sum(candidate ^ candidates[cand_counter - 2]); // e.g 3 ^ 5
  140.                     if (summation >= min_hd)
  141.                       begin
  142.                         new_candidates[new_cand_counter] = candidates[cand_counter -2];
  143.                         nxt_new_cand_counter = new_cand_counter + 1;
  144.                       end
  145.                                      
  146.                     nxt_cand_counter = cand_counter - 1;
  147.                   end // if ( cand_counter > 1 )
  148.                
  149.                
  150.                 else
  151.                   begin
  152.                     for(i=0; i < new_cand_counter; i=i+1)
  153.                       candidates[i] = new_candidates[i];
  154.                     nxt_cand_counter = new_cand_counter;
  155.                     chain[chain_counter] = candidate;
  156.                     //$display($time,": chain[%2d]=%2d\n",chain_counter,chain[chain_counter]);
  157.                     nxt_chain_counter = chain_counter + 1;
  158.                     nxt_pivot_counter = new_cand_counter;
  159.                     nxt_new_cand_counter = 0;
  160.                     nxt_lock = 0;
  161.                   end // else: !if(! cand_counter )
  162.                
  163.                 nxt_state = CLOCK_FIND_CODE;
  164.                
  165.               end // if ( pivot_counter > 1)
  166.            
  167.            
  168.             else
  169.               begin
  170.                 //$display($time,": chain_counter=%2d,candidates[0]=%2d\n",chain_counter,candidates[0]);
  171.                 chain[chain_counter] = candidates[0]; //put the last one
  172.                 nxt_pivot_counter = 0;
  173.                 nxt_cand_counter = 0;
  174.                 nxt_new_cand_counter = 0;
  175.                 //$display($time,": Before going to OUTPUT_CODES, chain_counter=%2d\n",chain_counter);
  176.                 nxt_state = OUTPUT_CODE;
  177.               end // else: !if( pivot_counter > 1)
  178.        
  179.           end // case: FIND_CODE
  180.  
  181.         CLOCK_FIND_CODE:
  182.           begin
  183.             nxt_state = FIND_CODE;
  184.           end
  185.        
  186.         OUTPUT_CODE:
  187.           begin
  188.             //$display($time,": In the OUTPUT_CODES, chain_counter=%2d\n",chain_counter);
  189.             if( chain_counter != 0 )
  190.               begin
  191.                 nxt_codes = chain[chain_counter];
  192.                 //$display($time,": In output: chain_counter=%2d, chain[%2d]=%2d\n",chain_counter, chain_counter,chain[chain_counter]);
  193.                 nxt_chain_counter = chain_counter - 1;
  194.                 nxt_state = CLOCK_OUTPUT_CODE;
  195.               end
  196.             else
  197.               begin
  198.                 //$display($time,": going  to CALC_HD\n");
  199.                 nxt_codes = chain[chain_counter];
  200.                 nxt_counterl = 2**N-1;
  201.                 nxt_state = CALC_HD;
  202.               end
  203.           end // case: OUTPUT_CODE
  204.        
  205.        
  206.         CLOCK_OUTPUT_CODE:
  207.           begin
  208.             nxt_state = OUTPUT_CODE;
  209.           end
  210.  
  211.       endcase // case (state)
  212.      
  213.     end // always@ *
  214.  
  215.  
  216.  
  217.  
  218.   function [N-1:0] sum(input [N-1:0] input_vector);
  219.     integer       k;
  220.     reg [N-1:0]   temp;
  221.    
  222.     begin
  223.       temp = 0;
  224.       for(k=0; k < N; k=k+1)
  225.         begin
  226.           temp = temp + input_vector[k];
  227.         end
  228.       sum = temp;
  229.     end
  230.        
  231.   endfunction // sum
  232.  
  233.  
  234.  
  235.  
  236.  
  237. endmodule // lcbbc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement