FPGA:RS编码仿真过程
FPGA:RS编码仿真过程
RS码是一种纠错性能很强的线性纠错码,能够纠正随机错误和突发错误。RS码是一种多进制BCH码,能够同时纠正多个码元错误。
之前已经记录了在MATLAB中进行rs编解码的过程,现在利用FPGA的IP核实现RS编码的过程,方便使用RS编码。
这个过程分成两部分来记录,这篇主要记录rs编码过程。
1. 开始准备
在FPGA设计通信系统的过程中进行rs编译码,需要用到rs编译码的IP核,这个IP核已经分享,可以直接下载。也已经通过程序自己编写编译码的过程,但是完全没有必要,现成的IP核用好就可以了。
同时为了更好的理解FPGA中rs编码的过程,这个仿真程序的参数是可以与记录的MATLAB教程相对应的。
同时在使用IP核的重要的一步,需要下载对应的pdf文档,这个能够帮助更好的使用IP核,编写自己的程序。
2. RS编码IP核
RS编码IP核全名 Reed-Solomon Encoder,首先看这个rs编码IP核的需要设置的参数。
这里面和MATLAB仿真对应的参数设置是Symbol Width
,这个对应MATLAB中的参数m,也就是符号的位宽,Data Symbols(k)
和Symbols Per Block(n)
分别对应k
和n
。这里的设置注意,k
的限制是和n
相差正偶数。简单来说就是每一次k
个数据被编码,然后生成n
个数据,每个数据的位宽是m
,然后参数Field Polynomial
是多项式,这个所对应的和MATLAB中的也是一样的,这在文档中有。
然后注意剩下的参数,其中第一个Code Specification
参数选择第一个选项Custom
,其他的选项可以对应不同的协议的,这个详细的可以查看文档,这个直接选择Custom
,然后参数Scaling Factor(h)
这个参数可以设置成默认的1,然后注意Generator Start
参数设置为1.
这两个参数的解释参照技术文档中的说法是h
是生成器多项式根索引的比例因子,第二个参数是生成多项式第一个根的伽罗瓦域对数,这两个参数直接都设置成1就可以了。
然后再Implementation
参数设置页面中,需要设置的参数相对较少。
可以参考如上设置,选择一个通道,然后把m_axis_output_tready
信号勾选上。同时注意Latency
的数值是多少,这个可以与生成的编码数据对应上,这里main设置完为5,相当于编码后的输出延时5个clk
。
3. 代码编写
接下来进行代码编写,直接上代码rs_encoder.v
。在这里是利用自然数进行编码,0-15。大体思路是用有效信号控制输入的数据,使得在有效的时候依次输入0-15。这里面的ready
信号和valid
信号相关控制可以直接看程序,和最后的仿真时序。编码的参数如上面的设置m=4
,n=15
,k=3
,ploy=19
。
`timescale 1ns / 1psmodule rs_encoder(input clk, //时钟input rst_n // 复位 高电平复位
// input [7:0] data_in, // 输入的待编码数据
// output [7:0] dataout // 输出的解码数据);wire rs_encode_input_tready; // 编码输入准备信号
reg rs_encode_input_tvalid_reg; // 编码输入有效信号
reg rs_encode_input_tready_reg;
wire rs_encode_input_tlast;
reg rs_encode_input_tlast_reg;
wire[7:0] rs_encode_data;
wire rs_encode_output_tvalid;
wire rs_encode_output_tlast;
wire rs_enocde_output_tready;
reg rs_enocde_output_tready_reg;parameter K = 3; // 对应MATLAB仿真中的k和n的值,这个在IP核设置中已经有体现
parameter N = 4; //
parameter L = 15; // 编码之后的数据长度reg [3:0] datain_num; // 每一组编码的原始数据个数
reg [5:0] dataout_num; //输出编码数据的个数// 设计输入数据
reg [3:0] datain;
always@(posedge clk)beginif(~rst_n)begindatain <= 4'b0;rs_encode_input_tready_reg <= 1'b0;rs_encode_input_tvalid_reg <= 1'b0;rs_encode_input_tlast_reg <= 1'b0;rs_enocde_output_tready_reg <= 1'b0;datain_num <= 4'b0;endelse beginrs_encode_input_tready_reg <= rs_encode_input_tready;rs_encode_input_tvalid_reg <= 1'b1;if(rs_encode_input_tready == 1'b1 && rs_encode_input_tvalid_reg == 1'b1)begin // 在ready 和valid信号都有效的时候才开始编码数据,可以在这里计数编码的个数。datain <= datain + 4'b1;datain_num <= 4'b1 + datain_num;rs_enocde_output_tready_reg <= 1'b1;endelse beginendend
end// 根据每一组编码的组数来确定数据顺序 控制最后一个tlast信号。
always@(posedge clk)beginif(~rst_n)beginrs_encode_input_tlast_reg <= 1'b0; // 这个信号是需要在一组中的最后一个数据时候信号处于高电平 和k的大小对应endelse beginif(datain_num >= K)beginrs_encode_input_tlast_reg <= 1'b1;endelse beginrs_encode_input_tlast_reg <= 1'b0; //然后重新置零endend
endwire [3:0] data_in;
assign data_in = datain;rs_encoder_0 rs_encoder_0_ins ( //latency 5clk.aclk(clk), // input wire aclk.aresetn(rst_n), // input wire aresetn.s_axis_input_tdata(data_in), // input wire [7 : 0] s_axis_input_tdata.s_axis_input_tvalid(rs_encode_input_tvalid_reg), // input wire s_axis_input_tvalid.s_axis_input_tready(rs_encode_input_tready), // output wire s_axis_input_tready.s_axis_input_tlast(rs_encode_input_tlast_reg), // input wire s_axis_input_tlast.m_axis_output_tdata(rs_encode_data), // output wire [7 : 0] m_axis_output_tdata.m_axis_output_tvalid(rs_encode_output_tvalid), // output wire m_axis_output_tvalid.m_axis_output_tready(rs_enocde_output_tready_reg), // input wire m_axis_output_tready.m_axis_output_tlast(rs_encode_output_tlast) // output wire m_axis_output_tlast
);// 通过编码模块输出的valid信号和ready信号来记录输出数据的个数
always@(posedge clk)beginif(~rst_n)begindataout_num <= 6'b0;endelse beginif(rs_encode_output_tvalid==1'b1 && rs_enocde_output_tready_reg==1'b1)begindataout_num <= dataout_num + 6'b1;if(dataout_num >= 6'd15)begindataout_num <= 6'b0;endendelse beginendend
endendmodule
首先利用MATLAB
仿真看一下[0,1,2,3,4,5,6,7,8]
这几个编码后的数据是多少,在MATLAB
仿真中用的是矩阵,所以结果得到的也是矩阵,三个数据一组,所以相当于进行了三次编码
4. 仿真测试
然后添加一个testbench
文件然后程序运行起来。rs_tb.v
,这个程序比较简单,就是进行初始化,设置时钟和复位信号。
`timescale 1ns / 1psmodule rs_tb();reg l_clk;
reg rst_n;rs_encoder rs_test_ins(.clk(l_clk), //时钟.rst_n(rst_n) // 复位 高电平复位
// input [7:0] data_in, // 输入的待编码数据
// output [7:0] dataout // 输出的解码数据);initial l_clk = 1;
always #5 l_clk= !l_clk; //15.625 initial beginrst_n <= 0;#40;rst_n <= 1;#320;//#50000000;#320;
// $stop;
end
endmodule
然后运行仿真,可以得到.
首先看第一个蓝色标线,ready
信号和valid
信号同时为高,此时输入的编码数据有三个,分别为0,1,2
,然后经过5个clk
延迟,第2个蓝色标线处,编码输出的ready
信号和valid
信号同时为高,表示编码输出有效,得到的编码结果为0,1,2,1,15,0,12,3,2,12,14,3,15,13,13
,然后是第二组编码数据的结果3,4,5
与MATLAB
仿真的结果是能够对应的上的。
这个仿真中的s_tlast
信号可以调整一下,每输入三个数据拉高一次,防止出错。
等下一部分进行rs解码的仿真。
相关文章:

FPGA:RS编码仿真过程
FPGA:RS编码仿真过程 RS码是一种纠错性能很强的线性纠错码,能够纠正随机错误和突发错误。RS码是一种多进制BCH码,能够同时纠正多个码元错误。 之前已经记录了在MATLAB中进行rs编解码的过程,现在利用FPGA的IP核实现RS编码的过程&…...

RocketMQ 5.0 架构解析:如何基于云原生架构支撑多元化场景
作者:隆基 本文将从技术角度了解 RocketMQ 的云原生架构,了解 RocketMQ 如何基于一套统一的架构支撑多元化的场景。 文章主要包含三部分内容。首先介绍 RocketMQ 5.0 的核心概念和架构概览;然后从集群角度出发,从宏观视角学习 R…...
Android su
1. userdebug和user版本 2. 关闭selinux system/core diff --git a/init/selinux.cpp b/init/selinux.cpp index 5a0255acd..787917274 100644--- a/init/selinux.cpp b/init/selinux.cpp -104,6 104,8 EnforcingStatus StatusFromCmdline() { } bool IsEnforcing() { …...

微信小程序真机调试异常cmdId 1006, errCode-50011-已解决
cmdId 1006, errCode-50011 起因 小程序在模拟器上预览没问题,真机调试和体验版首页打不开,点展开显示cmdId 1006, errCode-50011 解决 查了下1006, 说是广告, 我没接广告,这个也不是错误码 1006广告组件被驳回你的广告正在被审核,无法展现广告后来找到几个类似的帖子…...
36.SpringMVC视图
SpringMVC视图 SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户 SpringMVC视图的种类很多,默认有转发视图(InternalResourceView)和重定向视图(RedirectView) 配置视图: 当工程引入jstl的依赖&a…...

LeetCode 热题 100(四):48. 旋转图像、240. 搜索二维矩阵 II、234. 回文链表
一.48. 旋转图像 题目要求:就是一个顺时针的旋转过程。 思路:观察矩阵,得出翻转前第i行的第J个元素 等于 翻转后倒数第i列的第J个元素,举例说明,第1行第2个元素为“2”,翻转后到了 倒数第1列的第2个元素…...
Qt 编译使用Bit7z库接口调用7z.dll、7-Zip.dll解压压缩常用Zip、ISO9660、Wim、Esd、7z等格式文件(二)
修改qt5 7zip源码编译及使用(含展示进度)一文中的封装类ZlibHelper代码类,继承多线程,使解压,压缩时进度条不影响界面,同时添加压缩文件中的文件预览功能,建议直接看源码 导读 相关代码内容扩展预览内容时获取文件修改…...

224、仿真-基于51单片机音乐播放器流水灯控制Proteus仿真设计(程序+Proteus仿真+原理图+程序流程图+元器件清单+配套资料等)
毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…...

虹科展会 | 自动驾驶展品:上海汽车测试展精彩回顾
2023年8月9日-8月11日,上海国际汽车测试及质量监控博览会在上海圆满落幕。本次展会提供了一个了解最新汽车测试及质量监控技术、产品和趋势的机会,同时也是汽车测试及质量监控领域的专业人士和业内人士的重要交流平台。 雅名特是虹科旗下子公司ÿ…...

Unity自定义脚本的 初始模版
参考博主:Unity修改创建的脚本模板,Unity脚本模板路径_unity hub 怎么改脚本模板_先生沉默先的博客-CSDN博客 【100个 Unity实用技能】 ☀️ | Unity自定义脚本的初始模版_unity 模板脚本_呆呆敲代码的小Y的博客-CSDN博客 一,将脚本放到Ed…...

vue3中使用第三方插件mitt实现任意组件通讯
vue3中使用第三方插件mitt实现任意组件通讯 组件通讯是vue3组合式开发的核心之一,现在我在写代码时,一个组件的代码超过了200行,基本都会拆分组件。组件拆分后,组件之间的通讯就很重要,总结了一下,目前有这…...

(五)、深度学习框架源码编译
1、源码构建与预构建: 源码构建: 源码构建是通过获取软件的源代码,然后在本地编译生成可执行程序或库文件的过程。这种方法允许根据特定需求进行配置和优化,但可能需要较长的时间和较大的资源来编译源代码。 预构建: 预…...

迈向通用听觉人工智能!清华电子系、火山语音携手推出认知导向的听觉大语言模型SALMONN
日前,清华大学电子工程系与火山语音团队携手合作,推出认知导向的开源听觉大语言模型SALMONN (Speech Audio Language Music Open Neural Network)。 大语言模型 SALMONN LOGO 相较于仅仅支持语音输入或非语音音频输入的其他大模型,SALMONN对…...
NOIP 2015 扫雷(mine)
扫雷(mine) 说明 扫雷游戏是一款十分经典的单机小游戏。在 n行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会…...
elaticsearch(3)
整合springboot 1.整合依赖 注意依赖版本和安装的版本一致 <properties> <java.version>1.8</java.version> <!-- 统一版本 --> <elasticsearch.version>7.6.1</elasticsearch.version> </properties> 导入elastics…...

DevOps系列文章 之 Gitlab+Docker自动部署SpringBoot
1.环境要求 以下服务器的操作系统均为Centos7 服务器A:Gitlab服务器B:GitlabRunner、Docker、docker-compose、Java1.8、maven3.6.3、git ps:这里可以把服务器B的GitlabRunner、Java1.8、maven3.6.3、git单独提出来,独立部署&a…...

React Native 列表组件基础知识
ScrollView 组件 ScrollView组件是一个容器滚动组件,当容器超出指定宽高时就可以进行滚动交互。 ScrollView组件是一次性渲染所有的 React 子组件,这在性能上是比较差的,所以不建议当列表特别长的时候使用此组件。 接下来列举几个常用的一…...

操作系统的体系结构、内核、虚拟机
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 操作系统结构 一、操作系统体系结构1.1操作系统的内核1.1.…...
【C++】vector的基本用法
vector是动态数组的同义词 一、vector对象带参数构造 1.vector<int>a(a,a5);//左闭右开 2.vector<int>b(n,z);n个z 3.vector<int>c(a);//拷贝 二、动态数组可以整体赋值 vector<int>vec; vector&l…...

SSM——用户、角色、权限操作
1. 数据库与表结构 1.1 用户表 1.1.1 用户表信息描述 users 1.1.2 sql语句 CREATE TABLE users( id varchar2(32) default SYS_GUID() PRIMARY KEY, email VARCHAR2(50) UNIQUE NOT NULL, username VARCHAR2(50), PASSWORD VARCHAR2(50), phoneNum VARCHAR2(20), STATUS INT…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...