卷积编解码的FPGA实现(3)

实现基于BPSK调制解调的卷积编解码的FPGA实现。

1、BPSK调制解调方式的FPGA实现

根据描述,BPSK调制即是将“0”、“1”分别映射成“+1”、“-1”,在FPGA开发软件Vivado中,BPSK调制模块接收到“0”时,就原值保持不变,接收到“1”时,就对编码后的数据取反。如此即实现了BPSK调制。接收系统接收到信号后,首先进行信号下变频与去除信号频偏,得到数字基带信号。信号的下变频在FPGA中的实现即是用一个乘法器和一个滤波器,都是用Vivado软件自带的IP核(知识产权核或知识产权模块)实现,余弦信号采用DDS(直接数字频率合成器) IP核实现,方便快捷。对经过滤波器之后的信号进行判决,如果大于“0”,就判决为数字信号“0”,相反就判定为“1”,即逆映射,从而实现BPSK的解调。

2、卷积码编码的FPGA实现

卷积码的编码根据卷积码的生成多项式产生,本文选择(2,1,7)卷积编码方式,其中(2,1,7)编码方式的卷积编码多项式为:f1=1+x3+x4+x5+x6,f2=1+x+x3+x4+x6;(2,1,7)卷积编码方式的约束长度不长,不会耗费太多时间,同时理论上也证明其性能比较好,所以在性能与长度时间之间是一个很好的选择,在大部分的应用中都是选择的(2,1,7)卷积编码方式。无线通信系统的发射端的信号处理流程如图所示:

卷积编码实现框图

从图中可以看出,对输入的数字信号首先进行卷积编码,再进行调制上变频输出。对于BPSK调制解调方式来说,因BPSK只能处理一路信息,而卷积码编码结果同时输出两路,所以需要先将卷积码编码输出进行并串转换后变成一路进行BPSK调制。

编码器的初始化值为1000000,卷积编码模块根据编码方式(2,1,7),卷积编码多项式f1=1+x3+x4+x5+x6,f2=1+x+x3+x4+x6;对输入的数字信号进行编码,编码器输入信号为1bit,输出信号为并行2bit。对于BPSK调制解调方式,需要先经过并串转换模块将卷积编码模块输出的并行2bit数字信号转换成1bit数字信号串行输出。

BPSK调制模块根据并串转换模块的输出进行“0”-“1”,“1”-“-1”的BPSK调制映射。上变频模块是将BPSK调制模块的输出变频到系统设计的中频或者射频便于信号传输。在FPGA实现时,我们可以通过提高时钟速率达到减少耗时的目的,加快卷积编码实现。

3、​​​​​​​卷积码解码的FPGA实现

无线通信系统接收端实现框图如图所示,主要包含数字下变频、BPSK、串并转换、维特比译码、原始数据恢复等。

卷积解码实现框图

其中,当采用的BPSK调制解调方式时,BPSK解调后需要将一路的bit流数据转换成2bit的并行数据流,即串并转换,再进行维特比译码;维特比译码采用IP核实现即可。下变频模块完成中频或射频信号到基带信号的转换,去掉载波的影响。原始数据恢复模块就是从维特比译码结果中提取出原始信息码元。

4、FPGA实现仿真图

Verilog HDL代码实现中,发射端包含卷积编码模块(convenc.v)、并串转换模块(par_ser_con.v)、调制及上变频模块(bpsk.v);接收端包含下变频及解调模块(de_modul.v)、串并转换模块(ser_par_con.v)、维特比译码及原始数据恢复模块(De_convenc.v)。其中convenc.v模块实现对输入原始数据的卷积编码,输入信号的位宽为1bit数据流,因为是(2,1,7)卷积编码方式,所以输出为并行2bit信号。par_ser_con.v实现并串转换功能,因为卷积编码模块的输出为2bit信号,所以对于BPSK调制来说需要进行并串转换,变成1bit数据流信号后再进行BPSK调制。bpsk.v为BPSK调制以及上变频模块,除了实现BPSK调制映射功能外,根据系统功能所需的上变频频率进行必要的设计。de_modul.v为下变频以及BPSK解调模块,是bpsk.v的逆过程。ser_par_con.v为串并转换模块,为输入译码模块作准备。De_convenc.v为维特比译码及原始数据恢复模块,输入并行2bit数据流信号,解码后的输出为1bit数据流信号,最后从维特比译码结果中提取出原始信息。每个模块的仿真图如下:

 convenc.v模块仿真图

其中clk为采样时钟信号,rst_n为全局复位信号,data_in为外部输入原始信息(卷积编码前数据),data_out为卷积编码输出信号,也就是送入并串转换模块的数据。从图中可以看出,convenc.v模块完成了对输入信号的卷积编码操作。

 

par_ser_con.v并串转换模块仿真图

其中clk为采样时钟信号,rst_n为全局复位信号,datain为卷积编码输出信号,即convenc.v模块的输出;dout为并串转换的输出信号,从图中可以看出,该模块完成了2bit到1bit信号转换的功能。

 

BPSK调制图

其中clk为采样时钟信号,rst_n为全局复位信号,data_in为bpsk.v的输入信号,即并串转换模块的输出信号,o_bpsk为BPSK调制及上变频之后的信号输出。从图中可以看出,data_in正确的实现了对载波相位的0/pi调制,也就是BPSK调制。

 

 BPSK解调图

其中clk为采样时钟信号,rst_n为全局复位信号,data_in为输入信号(接收端的接收信号,也就是BPSK调制以及上变频模块的输出信号),o_demo_dat为解调输出信号,从图中可以看出,de_modul.v模块正确的实现了BPSK信号的解调。

 

串并转换模块图

其中clk1为串并转换数据输出的时钟信号,clk2为串并转换数据输入的时钟信号(clk1,clk2为2倍关系),rst_n为全局复位信号,datain为本模块输入信号,也就是de_modul.v模块的输出信号,dout为串并转换模块的输出信号,该信号将输入解码模块进行卷积解码操作。从图中可以看出,ser_par_con.v模块正确的实现了串并转换功能。

 

维特比译码及原始数据恢复模块图

其中clk为采样时钟信号,rst_n为全局复位信号,datain与dvalid为来自ser_par_con.v串并转换模块的输出信号及数据有效信号,dvalid是为了告诉维特比解码模块数据到来了,启动解码操作。dout为维特比解码的输出信号,从图中可以看出,译码输出与最开始卷积编码输入的数据信号一致,即De_convenc.v完成了正确的解码操作。

开发工程整个Verilog源码在下载资源处,如有需要欢迎下载交流。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一个卷积编码器和解码器的FPGA实现代码,供您参考: 卷积编码器: ``` module conv_encoder(clk, rst, data_in, data_out); // 输入和输出端口 input clk, rst; input [7:0] data_in; output reg [7:0] data_out; // 状态机和寄存器 reg [2:0] state; reg [7:0] shift_reg; reg [7:0] output_reg; // 多项式系数 parameter poly1 = 8'h4F; parameter poly2 = 8'h6D; // 初始化 initial begin state = 3'b000; shift_reg = 8'b00000000; output_reg = 8'b00000000; data_out = 8'b00000000; end // 状态转移 always @(posedge clk) begin if (rst) begin state <= 3'b000; shift_reg <= 8'b00000000; output_reg <= 8'b00000000; data_out <= 8'b00000000; end else begin case (state) 3'b000: begin shift_reg <= {data_in, shift_reg[7:1]}; output_reg <= 8'b00000000; state <= 3'b001; end 3'b001: begin output_reg <= shift_reg & poly1; shift_reg <= {shift_reg[7:1], output_reg[0]}; state <= 3'b010; end 3'b010: begin output_reg <= shift_reg & poly2; shift_reg <= {shift_reg[7:1], output_reg[0]}; state <= 3'b000; end default: state <= 3'b000; endcase end end // 输出 always @(posedge clk) begin if (rst) begin data_out <= 8'b00000000; end else begin case (state) 3'b000: data_out <= output_reg; default: data_out <= 8'b00000000; endcase end end endmodule ``` 卷积解码器: ``` module conv_decoder(clk, rst, data_in, data_out); // 输入和输出端口 input clk, rst; input [7:0] data_in; output reg [7:0] data_out; // 状态机和寄存器 reg [2:0] state; reg [7:0] shift_reg; reg [7:0] output_reg; // 多项式系数 parameter poly1 = 8'h79; parameter poly2 = 8'h5B; // 初始化 initial begin state = 3'b000; shift_reg = 8'b00000000; output_reg = 8'b00000000; data_out = 8'b00000000; end // 状态转移 always @(posedge clk) begin if (rst) begin state <= 3'b000; shift_reg <= 8'b00000000; output_reg <= 8'b00000000; data_out <= 8'b00000000; end else begin case (state) 3'b000: begin shift_reg <= {data_in, shift_reg[7:1]}; output_reg <= 8'b00000000; state <= 3'b001; end 3'b001: begin output_reg <= shift_reg & poly1; shift_reg <= {shift_reg[7:1], output_reg[0]}; state <= 3'b010; end 3'b010: begin output_reg <= shift_reg & poly2; shift_reg <= {shift_reg[7:1], output_reg[0]}; state <= 3'b000; end default: state <= 3'b000; endcase end end // 输出 always @(posedge clk) begin if (rst) begin data_out <= 8'b00000000; end else begin case (state) 3'b001: data_out <= output_reg[7]; 3'b010: data_out <= {data_out[6:0], output_reg[7]}; 3'b000: data_out <= {data_out[6:0], output_reg[7]}; default: data_out <= 8'b00000000; endcase end end endmodule ``` 需要注意的是,这只是一个简单的卷积编码器和解码器的实现,实际应用中可能需要根据具体的需求进行修改和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cckkppll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值