通信原理–信道编码–卷积码编码
本文介绍(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表示经历的状态