Advertisement
Shamks412

Viterbi decoder Design source code

May 30th, 2024
878
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VeriLog 5.34 KB | Source Code | 0 0
  1. module viterbi(input [3:0] a, input clk, en, output reg [1:0] s, output reg serial_out);
  2.     reg [1:0] err1, err2;
  3.     reg [1:0] cmp1, cmp2;
  4.     reg m1, m2, m3, m4, m11, m22, m33, m44;
  5.     reg [2:0] bm1, bm2, bm3, bm4, bm11, bm22, bm33, bm44;
  6.     reg [2:0] em1, em2, em3, em4, em11, em22, em33, em44;
  7.     reg [2:0] p1, p2;
  8.     reg c;
  9.  
  10.     always @(posedge clk) begin
  11.         if (en == 1) c = 0;
  12.         if (c == 0) begin
  13.             serial_out = s[0];
  14.             err1 = 2'b00 ^ a[3:2];
  15.             err2 = 2'b11 ^ a[3:2];
  16.             countones(err1, cmp1);
  17.             countones(err2, cmp2);
  18.             if (cmp2 < cmp1) begin
  19.                 em1 = cmp2;
  20.                 bm1 = 2;  
  21.                 m1 = 0;
  22.             end else begin
  23.                 em1 = cmp1;
  24.                 bm1 = 1;  
  25.                 m1 = 0;
  26.             end
  27.  
  28.             err1 = 2'b10 ^ a[3:2];
  29.             err2 = 2'b01 ^ a[3:2];
  30.             countones(err1, cmp1);
  31.             countones(err2, cmp2);
  32.             if (cmp2 < cmp1) begin
  33.                 em2 = cmp2;
  34.                 bm2 = 4;  
  35.                 m2 = 0;
  36.             end else begin
  37.                 em2 = cmp1;
  38.                 bm2 = 3;
  39.                 m2 = 0;
  40.             end
  41.  
  42.             err1 = 2'b11 ^ a[3:2];
  43.             err2 = 2'b00 ^ a[3:2];
  44.             countones(err1, cmp1);
  45.             countones(err2, cmp2);
  46.             if (cmp2 < cmp1) begin
  47.                 em3 = cmp2;
  48.                 bm3 = 2;  
  49.                 m3 = 1;
  50.             end else begin
  51.                 em3 = cmp1;
  52.                 bm3 = 1;  
  53.                 m3 = 1;
  54.             end
  55.  
  56.             err1 = 2'b01 ^ a[3:2];
  57.             err2 = 2'b10 ^ a[3:2];
  58.             countones(err1, cmp1);
  59.             countones(err2, cmp2);
  60.             if (cmp2 < cmp1) begin
  61.                 em4 = cmp2;
  62.                 bm4 = 4;  
  63.                 m4 = 1;
  64.             end else begin
  65.                 em4 = cmp1;
  66.                 bm4 = 3;  
  67.                 m4 = 1;
  68.             end
  69.             c = 1;
  70.         end else if (c == 1) begin
  71.             err1 = 2'b00 ^ a[1:0];
  72.             err2 = 2'b11 ^ a[1:0];
  73.             countones(err1, cmp1);
  74.             countones(err2, cmp2);
  75.             cmp1 = cmp1 + em1;
  76.             cmp2 = cmp2 + em2;
  77.             if (cmp2 < cmp1) begin
  78.                 em11 = cmp2;
  79.                 bm11 = 2;  
  80.                 m11 = 0;
  81.             end else begin
  82.                 em11 = cmp1;
  83.                 bm11 = 1;  
  84.                 m11 = 0;
  85.             end
  86.  
  87.             err1 = 2'b10 ^ a[1:0];
  88.             err2 = 2'b01 ^ a[1:0];
  89.             countones(err1, cmp1);
  90.             countones(err2, cmp2);
  91.             cmp1 = cmp1 + em3;
  92.             cmp2 = cmp2 + em4;
  93.             if (cmp2 < cmp1) begin
  94.                 em22 = cmp2;
  95.                 bm22 = 4;
  96.                 m22 = 0;
  97.             end else begin
  98.                 em22 = cmp1;
  99.                 bm22 = 3;  
  100.                 m22 = 0;
  101.             end
  102.  
  103.             err1 = 2'b11 ^ a[1:0];
  104.             err2 = 2'b00 ^ a[1:0];
  105.             countones(err1, cmp1);
  106.             countones(err2, cmp2);
  107.             cmp1 = cmp1 + em1;
  108.             cmp2 = cmp2 + em2;
  109.             if (cmp2 < cmp1) begin
  110.                 em33 = cmp2;
  111.                 bm33 = 2;
  112.                 m33 = 1;
  113.             end else begin
  114.                 em33 = cmp1;
  115.                 bm33 = 1;
  116.                 m33 = 1;
  117.             end
  118.  
  119.             err1 = 2'b01 ^ a[1:0];
  120.             err2 = 2'b10 ^ a[1:0];
  121.             countones(err1, cmp1);
  122.             countones(err2, cmp2);
  123.             cmp1 = cmp1 + em3;
  124.             cmp2 = cmp2 + em4;
  125.             if (cmp2 < cmp1) begin
  126.                 em44 = cmp2;
  127.                 bm44 = 4;
  128.                 m44 = 1;
  129.             end else begin
  130.                 em44 = cmp1;
  131.                 bm44 = 3;
  132.                 m44 = 1;
  133.             end
  134.  
  135.             if ((em11 <= em22) && (em11 <= em33) && (em11 <= em44)) p2 = bm11;
  136.             else if ((em22 <= em11) && (em22 <= em33) && (em22 <= em44)) p2 = bm22;
  137.             else if ((em33 <= em11) && (em33 <= em22) && (em33 <= em44)) p2 = bm33;
  138.             else p2 = bm44;
  139.            
  140.             if (p2 == bm11)
  141.                 s[0] = m11;
  142.             else if (p2 == bm22)
  143.                 s[0] = m22;
  144.             else if (p2 == bm33)
  145.                 s[0] = m33;
  146.             else
  147.                 s[0] = m44;
  148.  
  149.             case(p2)
  150.                 1: p1 = bm1;
  151.                 2: p1 = bm2;
  152.                 3: p1 = bm3;
  153.                 4: p1 = bm4;
  154.                 default: p1 = bm1;
  155.             endcase
  156.  
  157.             if (p1 == bm1)
  158.                 s[1] = m1;
  159.             else if (p1 == bm2)
  160.                 s[1] = m2;
  161.             else if (p1 == bm3)
  162.                 s[1] = m3;
  163.             else
  164.                 s[1] = m4;
  165.             c = 0;
  166.             serial_out = s[1];
  167.         end
  168.     end
  169.  
  170.     task countones;
  171.         input [1:0] in;
  172.         output reg [1:0] ones;
  173.         integer i;
  174.         begin
  175.             ones = 0;                    //initialize count variable.
  176.             for (i = 0; i < 2; i = i + 1) begin     //for all the bits.
  177.                 ones = ones + in[i];         //Add the bit to the count.
  178.             end
  179.         end
  180.     endtask
  181. endmodule
  182.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement