通信原理--信道编码--FPGA与Verilog实现卷积码

9 篇文章 3 订阅
4 篇文章 0 订阅

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

本文介绍(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


##卷积码编码
(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表示经历的状态
这里写图片描述


  • 6
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值