通信原理--信道编码--卷积码

版权声明:转载请注明出处 https://blog.csdn.net/DengFengLai123/article/details/79835108

通信原理–信道编码–卷积码编码

本文介绍(2,1,2)卷积编码的FPGA实现,采用有限状态机,参考资料如下:
- 无线通信FPGA设计.田耘,徐文波,张延伟.电子工业出版社.2007
- 通信原理(第7版).樊昌信,曹丽娜.国防工业出版社.
- https://blog.csdn.net/zhouxuanyuye/article/details/73729754
- https://blog.csdn.net/u011639609/article/details/51476278
-https://wenku.baidu.com/view/2abaf7a9d5d8d15abe23482fb4daa58da0111cb0.htmlrec_flag=default&mark_pay_doc=2&mark_recpage=1&mark_rec_position=3&mark_rec=view_r_1&clear_uda_param=1
- https://blog.csdn.net/qq_33832591/article/details/53106502?locationNum=12&fps=1
-https://blog.csdn.net/qq_33832591/article/details/53106502?locationNum=12&fps=1


卷积码编码

(2,1,2)卷积码的生成多项式为:
g1,i = mi ⊕ mi−1 ⊕ mi−2
g2,i = mi ⊕ mi−2
假设初始时寄存器内的值为0,即初始状态在S0(00)状态,此时若输入1,则g1,0=1⊕0⊕0=1,g2,0=1⊕0=1,故输出(g1,0,g2,0)=(11),移位寄存器组内的数据右移一位,刚输入的1移入,最右边的0移出,状态的值变为10

短约束长度的最佳卷积码(编码效率为1/2时):

编码效率 约束长度 自由距离 编码矢量1 编码矢量2
1/2 3 5 111 101
1/2 4 6 1111 1011
1/2 5 7 10111 11001
1/2 6 8 101111 110101
1/2 7 10 1001111 1101101

编码较为简单,既可根据状态图采用有限状态机FSM实现,也可根据生成多项式使用移位寄存器模2相加实现,此处使用FSM。

状态图

闭合式状态图 
S0状态上的箭头0/00表示在S0状态下,若当前输入为0,则输出为00,下一状态为S0;

输入测试
假设输入序列M=11011,长度L=5,对输入序列进行“收尾”处理,即在输入序列M后再输入m(此处m=2)个0,将2个移位寄存器中的数据送出,即输入 1 1 0 1 1 0 0,对应的栅格图路径如下图红色箭头所示,其中实线表示输入0,虚线表示输入1,线上的2位数据表示输出,最后的黄色框图内表示“收尾”处理”,输出为11 01 01 00 01 01 11,经历的状态依次为
S0(起始状态)->S2->S3->S1->S2->S3->S1->S0(回到S0)。
这里写图片描述

代码

Verilog代码如下(闭合式状态图法):

parameter s0 = 2'b00, s1 = 2'b01, s2 = 2'b10, s3 = 2'b11;
reg [1:0] state;
reg [1:0] enc_out;

always @(posedge clk) begin
    if(!reset) begin
        state <= s0;
        enc_out <= 2'b00;
    end
    else begin
        case(state)
            s0: if(x==0) begin
                    state <= s0;
                    enc_out <= 2'b00;
                 end
                 else begin
                    state <= s2;   
                    enc_out <= 2'b11;
                 end
            s1: if(x==0) begin
                    state <= s0;
                    enc_out <= 2'b11;
                 end
                 else begin
                   state <= s2;    
                    enc_out <= 2'b00;
                 end
            s2: if(x==0) begin
                    state <= s1;
                    enc_out <= 2'b10;
                 end
                 else begin
                   state <= s3;    
                    enc_out <= 2'b01;
                 end
            s3: if(x==0) begin
                    state <= s1;
                    enc_out <= 2'b01;
                 end
                 else begin
                   state <= s3;    
                    enc_out <= 2'b10;
                end
            default : if(x==0) begin
                            state <= s0;
                            enc_out <= 2'b00;
                         end
                         else begin
                            state <= s2;   
                            enc_out <= 2'b11;
                         end
        endcase
    end
end

Verilog代码如下(生成多项式法):

data_out_v[0] <= shift_reg[2] + shift_reg[1] + data_in;
data_out_v[1] <= shift_reg[2] + data_in;
shift_reg <= { shift_reg [5:1], data_in };

仿真结果

yx为2bit输出,y1为1bit的高低电平输出,可以看出正好为yx在的高低位相间输出,sta表示经历的状态
这里写图片描述


猜你喜欢

转载自blog.csdn.net/DengFengLai123/article/details/79835108