news 2026/3/25 19:52:23

基于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/3/16 3:25:29

AgentScope Java 1.0 发布:赋能企业级智能体应用开发与生产落地

作者&#xff1a;亦盏 AgentScope 简介 AgentScope 是阿里巴巴推出的一款以开发者为核心&#xff0c;专注于智能体开发的开源框架&#xff0c;是继 ModelScope&#xff08;魔搭社区&#xff09;后在 Agent 层的战略产品。它的核心目标是解决智能体在构建、运行和管理中的难题…

作者头像 李华
网站建设 2026/3/15 21:20:22

【纤维协程并发测试实战】:掌握高并发场景下的性能优化秘诀

第一章&#xff1a;纤维协程并发测试概述在现代高并发系统开发中&#xff0c;纤维&#xff08;Fiber&#xff09;作为一种轻量级的用户态线程&#xff0c;正逐渐成为提升程序并发性能的重要手段。与操作系统级线程相比&#xff0c;纤维具备更低的上下文切换开销和更高的调度灵活…

作者头像 李华
网站建设 2026/3/17 9:11:07

【R Shiny多模态交互实战】:掌握5种高阶图表控件设计技巧

第一章&#xff1a;R Shiny多模态交互概述R Shiny 是一个强大的 R 语言框架&#xff0c;用于构建交互式 Web 应用程序&#xff0c;尤其适用于数据可视化和统计分析场景。它允许用户通过浏览器与 R 代码进行实时交互&#xff0c;而无需深入掌握前端开发技术。Shiny 的核心优势在…

作者头像 李华
网站建设 2026/3/16 2:57:31

基于单片机的智能热水器的设计与实现

第一章 系统整体架构设计 基于单片机的智能热水器&#xff0c;核心目标是实现水温精准控制、能耗优化与安全防护&#xff0c;整体架构分为温度采集模块、核心控制模块、加热执行模块、人机交互模块及安全保护模块五大单元。温度采集模块实时监测水箱水温与进水温度&#xff0c;…

作者头像 李华
网站建设 2026/3/16 1:10:32

揭秘低代码环境下PHP组件权限漏洞:90%开发者忽略的3个致命陷阱

第一章&#xff1a;低代码环境下PHP组件权限校验的现状与挑战 在当前快速迭代的Web开发场景中&#xff0c;低代码平台凭借其可视化构建、拖拽式开发和自动化代码生成能力&#xff0c;显著提升了PHP应用的开发效率。然而&#xff0c;这种高效性背后也带来了权限校验机制弱化的风…

作者头像 李华