(2,1,2)卷积码的维特比译码Verilog实现

Verilog代码块

`timescale 1ns / 1ps
module viterbi(
  input  clk,
  input  clk_div2,
  input  rst_n,  //
  input  x,
  output y,
  output c,
  output reg rd,
  output reg ready);  
  reg[13:0]     x_t,x_t1;
  reg[3:0]      cnt;
  reg[2:0]      cnt2;
  reg[13:0]     a_out,a_out1,a1,a2,a3,a4;
  reg[3:0]      c1,c2,c3,c4; 
  reg[6:0]      c_t,c_t1,c_t2,c_t3,c_t4;
  reg[6:0]      c_t5;
   always@(posedge clk)begin
   if(!rst_n)begin
        x_t   <=  0;
    x_t1  <=  0;
    cnt   <=  0;
  end
   else begin
   if(cnt == 4'b1101)
        cnt   <= 4'b0000;        
   else
        cnt  <= cnt + 1;
    x_t1 <= {x,x_t1[13:1]};
         if(cnt == 4'b0000)begin
              x_t <= x_t1;
             end
          else
              x_t <= x_t;
   end 
  end
   always@(posedge clk_div2)begin
  if(!rst_n)begin
       cnt2 <= 0;
   a1   <= 0;
   a2   <= 0;
   a3   <= 0;
   a4   <= 0; 
   c1   <= 0;
   c2   <= 0;
   c3   <= 0;
   c4   <= 0;
   c_t1 <= 0;
   c_t2 <= 0;
   c_t3 <= 0;
   c_t4 <= 0;
  end
 else begin
   cnt2 <= cnt2  + 1;
     case(cnt2)
       3'b000: begin
         a1[1:0]  <= 2'b00;
         a2[1:0]  <= 2'b00;
         a3[1:0]  <= 2'b11;
         a4[1:0]  <= 2'b11;
         a1[13:2] <= 0;
         a2[13:2] <= 0;
         a3[13:2] <= 0;
         a4[13:2] <= 0;
         c1  <= 0;
         c2  <= 0;
         c3  <= 0;
         c4  <= 0;    
         c_t1[6]  <= 0;
         c_t2[6]  <= 0;
         c_t3[6]  <= 1;
         c_t4[6]  <= 1;
      end
     3'b001 : begin
          a1[3:2]  <= 2'b00;
          a2[3:2]  <= 2'b11;
          a3[3:2]  <= 2'b01;
          a4[3:2]  <= 2'b10;     
       c1  <= {
  3'b000,0^x_t[0]} + {
  3'b000,0^x_t[1]} +
                   {
  3'b000,0^x_t[2]} + {
  3'b000,0^x_t[3]};
       c2  <= {
  3'b000,0^x_t[0]} + {
  3'b000,0^x_t[1]} +
                   {
  3'b000,1^x_t[2]} + {
  3'b000,1^x_t[3]};
       c3  <= {
  3'b000,1^x_t[0]} + {
  3'b000,1^x_t[1]} +
                   {
  3'b000,1^x_t[2]} + {
  3'b000,0^x_t[3]};
       c4  <= {
  3'b000,1^x_t[0]} + {
  3'b000,1^x_t[1]} +
                   {
  3'b000,0^x_t[2]} + {
  3'b000,1^x_t[3]};   
       c_t1[5] <= 0;
       c_t2[5] <= 1;
       c_t3[5] <= 0;
       c_t4[5] <= 1;
    end    
     3'b010 : begin
         //  a = 2'b00
     if(c1 + {
  3'b000,0^x_t[5]} + {
  3'b000,0^x_t[4]} >
         c3 + {
  3'b000,1^x_t[5]} + {
  3'b000,1^x_t[4]})
      begin
       c1 <= c3 + {
  3'b000,1^x_t[5]} + {
  3'b000,1^x_t[4]};
       a1[3:0]    <= a3[3:0];
       a1[5:4]    <= 2'b11;
       c_t1[4]     <= 1'b0;
       c_t1[6:5]  <= c_t3[6:5];
      end
     else begin 
       c1 <= c1 + {
  3'b000,0^x_t[5]} + {
  3'b000,0^x_t[4]};
       a1[3:
  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值