当前位置: 首页 > news >正文

临沂科技网站建设b站网站推广

临沂科技网站建设,b站网站推广,网站优化公司有哪些,房地产利好消息2023FPGA Xilinx维特比译码器实现卷积码译码 文章目录 FPGA Xilinx维特比译码器实现卷积码译码1 Xilinx维特比译码器实现2 完整代码3 仿真结果 MATLAB (n,k,m)卷积码原理及仿真代码(你值得拥有)_matlab仿真后代码-CSDN博客 MATLAB 仿真…

FPGA Xilinx维特比译码器实现卷积码译码

文章目录

  • FPGA Xilinx维特比译码器实现卷积码译码
    • 1 Xilinx维特比译码器实现
    • 2 完整代码
    • 3 仿真结果

MATLAB (n,k,m)卷积码原理及仿真代码(你值得拥有)_matlab仿真后代码-CSDN博客

MATLAB 仿真实现任意(n,k,m)卷积码译码_维特比译码matlab-CSDN博客

前面已经使用MATLAB实现了卷积码和译码,前段时间也在项目中实现了Xilinx中维特比译码器,这次就简单介绍一下这个译码器,从项目中把关于卷积码编译码的部分抽取出来 修改了一下,匆促实现了一下,还行。

1 Xilinx维特比译码器实现

在这里插入图片描述

首先找到Viterbi译码器 随便选一个

在这里插入图片描述

第一页 别管兄弟们 我也很多不懂什么意思,反正第一个就标准 Standard,第二个就回溯长度 ,兄弟们自己设置。

在这里插入图片描述

第二页 的第一个Best State 也不懂,用了之后会多几个看不懂的引脚 第二个Puncturing 好像那个是打孔的意思,我也没用到。第三个Coding是软硬编码的,我选择最简单的硬编码,直接输入0 1 就行了

在这里插入图片描述

第三页就是CC编码时的选项了,我编码使用的是1/2CC 然后对应的表达式分别为7 5,所以这里第一个就是2 代表两个输出码元,然后下面的代表的是表达式7 5

在这里插入图片描述

第四页第一个BER Options也没用到,用到了也会多几个引脚,没敢用

在这里插入图片描述

最后一页就是总结,大家注意上图中 左侧信息 “Implementation Details”

其中第一个DATA_IN_1(8:8) DATA_IN_1(0:0)意思是输入的比特第8位和第0位有效,到时候你只需要把输入的两比特放进这个变量里的第0位和第8位就行了。

DATA(0:0) 就代表每一次输出只有第0位是有效的,也就是一次输入一位 这一位就是第0位

2 完整代码

仿真文件

///
`timescale 1ns/1ps
module testbench_top();//参数定义`define CLK_PERIORD		10		//时钟周期设置为10ns(100MHz)	//接口申明reg 		clk;
reg 		rst_n;
reg         input_bit;
reg         input_valid;wire [1:0]  output_bits;
wire        output_valid;reg	enable;wire out_data;
wire outdata_valid;
wire over;reg o_data_end;// 对被测试的设计进行例化// 实例化待测试的卷积编码模块CC2 u_CC2(		//二分之一码率	多项式 = 7,5.clk		(clk),	.rst		(rst_n),.enable		(enable),		//使能信号 .sink_data	(input_bit),	//输入数据.sink_valid	(input_valid),	//数据有效信号.out_valid	(output_valid),	//输出数据有效信号.out_data	(output_bits)	//输出数据
);CC2_Decoding u_CC2_Decoding(.clk			(clk),.rst			(rst_n),.in_data_valid	(output_valid),	//进来的全是有效数据  直接全部放进译码器中.in_data		(output_bits),.o_data_end		(o_data_end),.over			(over),	//结束解码.out_data		(out_data),.outdata_valid  (outdata_valid)
);//复位和时钟产生//时钟和复位初始化、复位产生
initial beginclk <= 0;rst_n <= 0;#1000;rst_n <= 1;
end//时钟产生
always #(`CLK_PERIORD/2) clk = ~clk;	integer file; // 文件句柄//测试激励产生
initial begin// 打开文件,写入模式file = $fopen("D:\\out_data.txt", "w");// 确保文件成功打开if (file == 0) begin$display("Error opening file!");$finish;endendalways @(posedge clk) beginif (outdata_valid) begin // 仅在数据有效时写入$fdisplay(file, "%d", out_data); // 将Ik写入文件end
endinitial begin@(posedge rst_n);	//等待复位完成enable <= 1'b0;@(posedge clk);input_bit <= 1'b0;enable <= 1'b1;o_data_end <= 1'b0;@(posedge clk);repeat(8*16) begin		//连续输入8 * 16 *4个bit@(posedge clk);		input_bit <= 1'b1;input_valid <= 1'b1;	//输入数据有效信号@(posedge clk);	input_bit <= 1'b1;@(posedge clk);	input_bit <= 1'b0;@(posedge clk);	input_bit <= 1'b0;endinput_valid <= 1'b0;	//输入数据有效信号repeat(3) begin@(posedge clk);endo_data_end <= 1'b1;  enable <= 1'b0;@(posedge clk);o_data_end <= 1'b0;#1000000;$fclose(file); // 关闭文件$stop;
endendmodule

1/2CC卷积码编码

module CC2 (		//二分之一码率	多项弿 = 7,5input 	clk,	input 	rst,input	enable,		//使能信号 input 	sink_data,	//输入数据input 	sink_valid,	//数据有效信号output	reg out_valid,	//输出数据有效信号output	reg [1:0] 	out_data	//输出数据
);// sink_data  shift_reg[1]  shift_reg[0]
// out_data[1] out_data[0]  7  5
reg [1:0] shift_reg;	//移位寄存噿always @(posedge clk) beginif(!rst) beginshift_reg <= 2'b0;	//初始化为0out_valid <= 1'b0;	//数据输出无效out_data <= 2'b0;end else if(enable) beginif(sink_valid) begin	//检测到数据有效信号拉高out_data[0] <= sink_data + shift_reg[0];out_data[1] <= sink_data + shift_reg[1] + shift_reg[0];out_valid <= 1'b1;	//拉高数据输出有效信号shift_reg <= {sink_data,shift_reg[1]};	//移位end else beginout_data <= out_data;out_valid <= 1'b0;shift_reg <= shift_reg;endend else beginshift_reg <= 2'b0;	//将所有寄存器清零out_valid <= 1'b0;	//数据输出无效out_data <= 2'b0;	endendendmodule

1/2CC卷积码译码

module CC2_Decoding 
(input 	clk,input	rst,input	in_data_valid,	//进来的全是有效数据  直接全部放进译码器中input  [ 1:0] 	in_data,input 	o_data_end,output 	reg		over,	//结束解码output 			out_data,output 	        outdata_valid
);parameter out_data_hop_amount = 8 * 16 * 4;	//	输出所有的有效比特数wire [ 7:0] 	decoded_data;reg [15:0] binary_data;
reg		   data_valid;reg [ 10:0] out_data_hop_count;	//一跳的输出码元计数器reg flag;wire 	s_axis_data_tready;
wire    decoded_valid;assign out_data = decoded_data[0];Viterbi2CC_Ip u_Viterbi2CC_Ip(.aclk				   	(clk),.aresetn			   	(rst),		//低电平就是复位.binary_data			(binary_data),  // 输入的硬判决编码数据流(16比特宽度).data_valid		 		(data_valid),          // 输入数据有效信号.s_axis_data_tready		(s_axis_data_tready),.decoded_data	   		(decoded_data),  // 解码后的输出数据.decoded_valid       	(decoded_valid)	 // 解码输出有效信号
);assign  outdata_valid = (out_data_hop_count < out_data_hop_amount) ? decoded_valid : 0;always @(posedge clk) beginif(!rst) begindata_valid <= 'b0;binary_data <= 'b0;end else if(in_data_valid && !flag) begindata_valid <= 1'b1;	//调高数据有效信号binary_data[8] <= in_data[0];binary_data[0] <= in_data[1];end else if(flag && s_axis_data_tready && out_data_hop_count <= out_data_hop_amount)begindata_valid <= 1'b1;binary_data <= 'b0;end else begindata_valid <= 1'b0;binary_data <= binary_data;end
end//对输出的一跳卷积译码码元计数
always @(posedge clk) beginif(!rst) beginover <= 1'b0;out_data_hop_count <= 'b0;end else if(decoded_valid && out_data_hop_count <= out_data_hop_amount) begin//此时还在接收64个输出的有效比特数据over <= 1'b0;out_data_hop_count <= out_data_hop_count + 2'd1;end else if(out_data_hop_count <= out_data_hop_amount) beginover <= 1'b0;out_data_hop_count <= out_data_hop_count;end else beginover <= 1'b1;out_data_hop_count <= out_data_hop_count;end
endalways @(posedge clk) beginif(!rst) beginflag <= 'b0;end else if(o_data_end) begin	//数据送完了flag <= 1'b1;end else beginflag <= flag;end
endendmodule

维特比译码器

module Viterbi2CC_Ip (input 	aclk,input 	aresetn,input 	[15:0] binary_data,  // 输入的硬判决编码数据流(16比特宽度)input 	data_valid,          // 输入数据有效信号output  	s_axis_data_tready,output reg [7:0] decoded_data,  // 解码后的输出数据output reg decoded_valid        // 解码输出有效信号
);reg [15:0] 	s_axis_data_tdata;
reg 		s_axis_data_tvalid;wire [7:0] 	m_axis_data_tdata;
wire 		m_axis_data_tvalid;
reg 		m_axis_data_tready;viterbi2CC your_instance_name (.aclk(aclk),                              // input wire aclk.aresetn(aresetn),                        // input wire aresetn.s_axis_data_tdata(s_axis_data_tdata),    // input wire [15 : 0] s_axis_data_tdata.s_axis_data_tvalid(s_axis_data_tvalid),  // input wire s_axis_data_tvalid.s_axis_data_tready(s_axis_data_tready),  // output wire s_axis_data_tready.m_axis_data_tdata(m_axis_data_tdata),    // output wire [7 : 0] m_axis_data_tdata.m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid.m_axis_data_tready(m_axis_data_tready)  // input wire m_axis_data_tready
);always @(posedge aclk) beginif (!aresetn) begin// 复位信号处理s_axis_data_tvalid <= 'b0;m_axis_data_tready <= 'b0;decoded_valid <= 'b0;decoded_data <= 'b0;end else beginif (data_valid && s_axis_data_tready) begin// 输入有效时,将二进制编码数据发送给解码器s_axis_data_tdata <= binary_data;  // 输入16比特的编码数据s_axis_data_tvalid <= 1'd1;           // 表示输入数据有效end else begins_axis_data_tvalid <= 1'd0;end// 解码器输出处理if (m_axis_data_tvalid) begindecoded_data <= m_axis_data_tdata;  // 获取解码后的数据decoded_valid <= 1'd1;                 // 标记解码输出有效end else begindecoded_valid <= 1'd0;endm_axis_data_tready <= 1'd1;  // 准备接收更多解码数据end
endendmodule

3 仿真结果

在这里插入图片描述

这是multisim中的仿真结果,不好看,直接在MATTAB中看解调出来的数据

在这里插入图片描述

最后MATLAB中的数据和仿真输入的数据几乎一模一样,只有后四位不一样,这主要是因为卷积码译码回溯的问题,导致最后几位译码会出现问题。不过问题不大

http://www.ds6.com.cn/news/37313.html

相关文章:

  • dw和sql做网站推广软文营销案例
  • 东阿聊城做网站的公司百度竞价排名广告定价
  • 中航长江建设工程有限公司网站网站排名软件利搜
  • 兰州网站建设网络营销和电子商务的区别
  • win7做系统网站哪个好搜外网友情链接
  • 郑州seo管理系统运营seo顾问能赚钱吗
  • 国内外html5网站建设状况十大接单平台
  • 视频结交网站怎么做百度点击快速排名
  • 景安备案域名购买浙江seo技术培训
  • 自助手机网站建站软件云浮新增确诊病例30例
  • 网站首页风格宣传渠道有哪些
  • 为什么做营销型网站新闻头条免费下载安装
  • 长沙网站建设 个人最新热点新闻事件素材
  • 1高端网站建设武汉搜索引擎排名优化
  • 南阳网站建设公司泰安做百度推广的公司
  • 重庆网站建设公司数据分析师报考官网
  • 邢台 网站建设google关键词推广
  • 网站注册怎么做屏蔽过滤百度seo排名优化提高流量
  • 网站的友情连接怎么做百度获客平台怎么收费的
  • anker 网站谁做的互联网营销师培训多少钱
  • 网站开发公司挣钱吗数据分析师35岁以后怎么办
  • 模板建网站费用seo主要是指优化
  • 企业网站和信息化建设制度免费申请网站com域名
  • 深圳哪里网站制作又一病毒来了比新冠可怕
  • 跨境电商网站如何做推广知识营销成功案例介绍
  • 如何建立一家公司网站营销型网站建设费用
  • 如果做好招聘网站建设上海seo网络优化
  • 微信公众号可以自动导入wordpress360优化大师app
  • 百度做的网站字体侵权中央电视台一套广告价目表
  • 做网站推广每天加班福州seo博客