news 2026/1/20 19:37:16

基于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/1/11 9:52:56

【农业物联网PHP实战】:3步实现设备状态实时同步的终极方案

第一章&#xff1a;农业物联网中设备状态同步的挑战与PHP的优势在农业物联网&#xff08;Agri-IoT&#xff09;系统中&#xff0c;大量传感器和执行器分布在田间地头&#xff0c;实时采集土壤湿度、气温、光照强度等数据&#xff0c;并依赖稳定的状态同步机制确保设备协同工作。…

作者头像 李华
网站建设 2026/1/2 14:23:56

Hz的计数问题总结

前言 看见 mod1e9 7 就跪了&#xff0c;遂写一篇博客把所有的计数问题、组合数学问题都记录下来… 正片 E. Girl Permutation Some permutation of length nnn is guessed. You are given the indices of its prefix maximums and suffix maximums. Recall that a permu…

作者头像 李华
网站建设 2025/12/24 20:18:51

基于单片机的自动售水机的设计与实现

第一章 系统整体设计 基于单片机的自动售水机&#xff0c;核心目标是实现用户自助购水、精准计量与安全供水&#xff0c;整体架构分为支付识别模块、核心控制模块、水量计量模块、供水执行模块及状态显示模块五大单元。支付识别模块负责接收用户投币或扫码支付信号&#xff0c;…

作者头像 李华
网站建设 2026/1/14 21:40:27

【限时掌握】农业产量方差分析三步法:R语言快速建模与可视化

第一章&#xff1a;农业产量方差分析的核心意义 在现代农业科学研究中&#xff0c;理解不同因素对作物产量的影响是优化种植策略的关键。方差分析&#xff08;ANOVA&#xff09;作为一种统计方法&#xff0c;能够有效识别施肥方式、灌溉量、品种差异等处理因素是否对农业产量产…

作者头像 李华
网站建设 2026/1/18 10:50:34

临床数据的R语言生存曲线绘制(从入门到精通全流程拆解)

第一章&#xff1a;临床数据的R语言生存曲线绘制概述在临床研究中&#xff0c;生存分析是评估患者从某一时间点到发生特定事件&#xff08;如死亡、复发&#xff09;时间分布的重要统计方法。R语言凭借其强大的统计计算与图形展示能力&#xff0c;成为实现生存曲线绘制的首选工…

作者头像 李华