news 2026/4/23 7:50:38

基于FPGA的帧同步设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于FPGA的帧同步设计

帧同步

检测数据流,来代表检测数据是否开始发送了,他的头在哪里(几次失锁自己设计)在数字通信中,同步码用于指示数据帧的起始位置。由于信道噪声,接收到的同步码可能会出现比特错误。


###第一步: 计算汉明距离(dis-distance)
代码如下:

module distance #(parameter LENCODE=7, parameter FRAMECODE=7'b1011000) ( input rst, //复位信号,高电平有效 input clk_bitsync, //位同步时钟 input data_din, //输入比特流 output reg [9:0] dis); //汉明距离 wire [LENCODE-1:0] data; //将输入数据送入移位寄存器regdin中 reg [LENCODE-1:0] regdin; integer i=0; always @(posedge clk_bitsync or posedge rst) if (rst) regdin <= 0; else begin regdin<={data_din,regdin[LENCODE-1:1]}; end assign data = regdin^FRAMECODE; integer j=0; always @(posedge rst or posedge clk_bitsync) if (rst) dis<=LENCODE; else //这里要根据LENCODE的值修改代码,完成寄存器数据相加运算 dis <= data[0]+data[1]+data[2]+data[3]+data[4]+data[5]+data[6];

说明:
汉明距离:将一列字符串和帧序列异或,剩下几个1,就代表他的汉明距离是多少(也就是有多少个不同,与0异或,得他本身)。

1101100 ^ 0000000 = 11011001(1+1+1+1 = 4) //汉明距离为:4

位同步时钟:来一个码字则计入一次,位同步由gardner算法可得。

###第二步:帧同步的搜索Search
代码如下:

module search #(parameter LENCODE=7, parameter ERRORNUM=0, parameter FRAMECODE=7'b1011000) ( input rst, //复位信号,高电平有效 input clk_bitsync, //位同步时钟 input data_din, //输入比特流 input [9:0] dis, //汉明距离 input research_check, //校核状态送来的信号,校核未通过时为高电平脉冲 input research_sync, //同步状态送来的信号,未同步时为高电平脉冲 output reg search_over); //搜索同步脉冲输出,搜索到同步码时为高电平脉冲 reg start =0; //驱动搜索过程的信号有复位信号rst,校核状态送来的信号research_check //以及同步状态送来的信号research_sync。搜索到帧同步码时,输出一个高 //电平脉冲search_over,并终止搜索过程,等待下一个驱动信号。 always @(posedge clk_bitsync or posedge rst or posedge research_check or posedge research_sync) if (rst| research_check | research_sync ) begin start <= 1;search_over<=0;end else if (start && (!search_over)) begin if (dis<=ERRORNUM) begin search_over <= 1'b1; start <=0; end end else search_over <= 1'b0;

参数 (配置常量):
LENCODE=7: 帧同步码的长度(7比特)。
ERRORNUM=0: 最大允许的汉明距离(即允许的比特错误数)。0 表示需要完美匹配。
FRAMECODE=7’b1011000: 预期的 7 比特帧同步码图案。
核心模块:
start变量为1,代表重启动搜索。并清除 search_over 为 0。

工作逻辑:

  • 当系统复位或丢失同步时,处于此模块控制的状态。
  • 它时刻监视dis信号。一旦发现dis == 0(即找到一个疑似帧头),它会拉高search_over信号,通知系统进入“校核”阶段。

输入控制:research_checkresearch_sync是来自后级模块的反馈,如果后级发现之前的判决是错的,会通知search模块重新开始全网搜索。

###第三步:帧同步的安检Check
作用:防止数据载荷中偶然出现与帧头相同的数据(假同步)
代码如下:

always @(posedge clk_bitsync or posedge rst) if (rst) begin cn_code <= 0; cn_frame <= 0; end else begin if ((cn_code==0) && search_over | continue) begin cn_code <= 1; checkce<=1;end else if ((cn_code>0) && (cn_code<LENFRAME-1)) cn_code <=cn_code + 1; else if (cn_code==LENFRAME-1) begin cn_code <= 0; if (cn_frame<CHECKNUM-1) begin continue<=1;cn_frame<=cn_frame+1; end else begin continue<=0;cn_frame<=0;checkce<=0;end end end reg recheck=0; always @(posedge clk_bitsync or posedge rst) if (rst) recheck<=0; else if (checkce) begin if ((cn_code==(LENFRAME-1)) && (dis>ERRORNUM)) recheck<=1; end else if (recheck) recheck<=0; reg ced=0; always @(posedge clk_bitsync or posedge rst) if (rst) begin research_check<=0; check_over<=0; end else begin ced <= checkce; if (ced && !checkce && recheck) research_check<=1; else research_check<=0; if (ced && !checkce && !recheck) check_over<=1; else check_over<=0; end

*工作逻辑:
收到 search_over 后启动。
根据 LENFRAME (16) 建立计数器。它会在第 16 个时钟周期再次检查 dis(汉明距离) 是否为 0。
Parameter CHECKNUM(2): 它需要连续 2次 在预定位置检测到帧头。
如果通过校核:拉高 check_over,进入“同步态”。
如果中途失败:拉高 research_check,把状态踢回给 search 模块重新搜索


###第四步:同步态:
功能: 在系统稳定同步后,输出对齐的数据,并持续监视连接质量。
代码如下:

//---------------------------------------------------------------- // 1. 计数器控制逻辑 // 用于产生校核过程中的时序控制信号 checkce (校核使能) // 以及两个计数器:cn_code (帧内比特计数) 和 cn_frame (连续帧计数) //---------------------------------------------------------------- reg continue; // 内部信号:用于维持连续多帧的校核状态 reg [9:0] cn_code; // 帧内计数器:从0计数到 LENFRAME-1 reg [3:0] cn_frame; // 帧数计数器:记录已经成功校核了多少帧 reg checkce; // 校核使能信号:高电平表示正在进行校核过程 always @(posedge clk_bitsync or posedge rst) if (rst) begin cn_code <= 0; cn_frame <= 0; continue <= 0; // 复位时清除连续标志 checkce <= 0; // 复位时清除使能 end else begin // 启动条件: // 1. search_over: 搜索模块通知找到了第一个疑似帧头 // 2. continue: 或者当前处于连续校核的过程中 // 并且 cn_code 为0 (确保从头开始计数) if ((cn_code==0) && (search_over | continue)) begin cn_code <= 1; checkce <= 1; // 启动校核过程 end // 帧内计数:如果没有数到一帧的末尾,继续累加 else if ((cn_code>0) && (cn_code<LENFRAME-1)) cn_code <= cn_code + 1; // 帧尾处理:当数满一帧 (达到 LENFRAME-1) else if (cn_code==LENFRAME-1) begin cn_code <= 0; // 帧内计数器清零,准备下一帧 // 判断是否达到了需要的校核次数 (CHECKNUM) if (cn_frame < CHECKNUM-1) begin continue <= 1; // 继续保持校核状态 cn_frame <= cn_frame+1; // 已校核帧数 +1 end else begin // 已完成所有帧的校核 continue <= 0; // 停止连续校核 cn_frame <= 0; // 帧数计数器清零 checkce <= 0; // 拉低使能,表示校核阶段结束 end end end //---------------------------------------------------------------- // 2. 错误检测逻辑 // 在每一帧的特定位置(帧头位置)检查误码情况 //---------------------------------------------------------------- reg recheck; // 失败标志位:如果在校核期间发现不匹配,拉高此信号 always @(posedge clk_bitsync or posedge rst) if (rst) recheck <= 0; else if (checkce) begin // 仅在校核使能期间工作 // 在每一帧的最后一个时钟周期 (cn_code == LENFRAME-1) // 此时应该是下一个帧头出现的位置。 // 检查 dis (当前输入与巴克码的距离/误码数) 是否大于容限 (ERRORNUM) if ((cn_code==(LENFRAME-1)) && (dis>ERRORNUM)) recheck <= 1; // 如果误码过大,标记为“需要重新检查/校核失败” end else if (recheck) recheck <= 0; // 如果 checkce 已经拉低,自动清除标志位,准备下一次 //---------------------------------------------------------------- // 3. 结果输出逻辑 // 在校核过程结束的下降沿,根据 recheck 标志输出最终结果 //---------------------------------------------------------------- reg ced; // checkce delay,用于检测 checkce 的下降沿 always @(posedge clk_bitsync or posedge rst) if (rst) begin research_check <= 0; check_over <= 0; ced <= 0; end else begin ced <= checkce; // 打一拍,用于边沿检测 // 检测 checkce 的下降沿 (ced为1,checkce为0),意味着校核过程刚好结束 // 情况A:校核结束,且 recheck 标志为 1 (中间发现了错误) if (ced && !checkce && recheck) research_check <= 1; // 输出:校核失败,通知 Search 模块重新搜索 else research_check <= 0; // 情况B:校核结束,且 recheck 标志为 0 (全程无误) if (ced && !checkce && !recheck) check_over <= 1; // 输出:校核成功,通知 Sync 模块进入锁定状态 else check_over <= 0; end

输入输出变量:

input rst, //复位信号,高电平有效 input clk_bitsync, //位同步时钟 input data_din, //输入比特流 input [9:0] dis, //汉明距离 input search_over, //搜索模块送来的信号,高电平启动校核过程 output reg research_check, //校核未通过,送出高电平脉冲 output reg check_over); //校核同步脉冲输出,搜索到同步码时为高电平脉冲

工作逻辑:
收到 check_over 后,拉高 state_sync,表示系统已锁定

输出:
data_out: 经过延时调整的数据流,确保与 frame_start 逻辑对齐
frame_start: 每隔 16 个周期产生一个脉冲,指示一帧的开始。
保护机制:
它继续每隔 16 个周期检查 dis。
Parameter SYNCNUM(2): 只有连续 2次 没检测到帧头(可能是信道干扰导致的误码,不判定轻易失步),它才会认为连接断开,拉高 research_sync,让系统回到 search 状态。


状态机的流向,如下:

Search (搜索): 逐位滑动,发现匹配 -> 转入 Check。
Check (校核):
等待 16 周期。
匹配成功且次数 < 2 , 继续 Check。
匹配失败 -> 回到 Search。
匹配成功且次数 = 2 -> 转入 Sync。
Sync (锁定):
输出 state_sync = 1。
等待 16 周期。
匹配成功 -> 保持 Sync,清零错误计数。
匹配失败 -> 错误计数+1。如果错误计数 = 2 -> 回到 Search。


自己学习记录一下,如果有错欢迎指出
参考:杜勇老师的数字通信与同步技术

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 7:49:51

PHP如何为GraphQL实现智能缓存?这7种方法你必须掌握

第一章&#xff1a;PHP如何为GraphQL实现智能缓存&#xff1f;这7种方法你必须掌握在构建高性能的GraphQL API时&#xff0c;缓存策略是提升响应速度和降低服务器负载的关键。PHP作为后端常用语言&#xff0c;结合GraphQL可以实现多种智能缓存机制&#xff0c;有效减少数据库查…

作者头像 李华
网站建设 2026/4/23 7:49:03

找到你的优质素材灵感库:四个实用平台真实体验

做片子找素材这事&#xff0c;我算是有点发言权了。从刚开始到处求资源包的小白&#xff0c;到现在能淡定选择合适平台的老手&#xff0c;最深的体会是&#xff1a;好素材不光是好看&#xff0c;更得用着放心。今天分享四个我工作室常用的素材站&#xff0c;各有各的脾气&#…

作者头像 李华
网站建设 2026/4/23 7:49:24

流水线作业车间:拓纳斯(TUONAS)均匀光设计,减少视觉疲劳提升效率

流水线作业视觉疲劳难题&#xff0c;光环境优化是核心解决方案流水线车间的连续作业特性&#xff0c;要求员工长时间保持视觉专注。若照明存在眩光、明暗不均等问题&#xff0c;易引发眼酸、干涩、注意力不集中等视觉疲劳&#xff0c;直接导致操作失误增加、生产效率下降&#…

作者头像 李华
网站建设 2026/4/23 7:49:34

Java毕设项目:基于springboot的大学生心理健康评估系统基于springboot高校心理健康评测与服务系统(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/18 9:51:50

从零理解R-Python变量共享机制:数据科学家必备的核心技能

第一章&#xff1a;R-Python变量共享机制概述在数据科学与统计计算领域&#xff0c;R 与 Python 的协同工作日益普遍。为了实现跨语言环境的高效协作&#xff0c;变量共享机制成为关键环节。通过特定的接口工具&#xff08;如 reticulate 和 rpy2&#xff09;&#xff0c;开发者…

作者头像 李华
网站建设 2026/4/20 14:26:51

【医疗数据安全防护指南】:基于PHP的备份加密体系构建全流程详解

第一章&#xff1a;医疗数据安全防护的背景与挑战随着电子病历系统&#xff08;EMR&#xff09;、远程医疗和健康大数据平台的广泛应用&#xff0c;医疗行业正加速向数字化转型。这一转变在提升诊疗效率的同时&#xff0c;也使得患者隐私数据面临前所未有的安全威胁。医疗数据包…

作者头像 李华