做的课设,相当于复习了一遍verilog。


实现了

1.接收端固定模式:8N1 BAUD:921600。

2.发送端8N1,任意波特率(不取极端值)。

3.数码管显示波特率(16进制)。

用了

1.两天一夜。

2.ego1平台+usb2uart。


整体框图

输入tx信号经过频率捕获层获得100Mhz下的计数值,送给波特率产生层得到接收层波特率。

接收层接收数据送给串口FIFO层,串口FIFO层根据发送层的反馈将数据送出FIFO。

发送层将数据按固定921600波特率发给PC机。从而实现波特率交换。


频率捕获层算法

1.uart协议

这里只考虑最常用的8N1,即8位数据,无校验,1位停止位。

在时钟线上升沿,tx线下降沿并维持到下一个上升沿即为一个开始位。然后8位数据(低位在前)。然后到第10位停止位高电平。

值得一提的是,tx线不会在某个电平完后恢复初始电平,比如说上一个数据位是低,当前位还是低,这个数据位结束后不会变回高再变低。

有什么影响?倘若tx发送0xff,那么其实只有一个低电平脉宽!即起始位那个脉宽。

2.算法

先打两拍,同步时钟以及滤除尖峰脉冲。考虑到输入的数据信号大多为ascii码。

我们从里面找一个最特殊的,U,这个字符二进制为10101010,再加上开始结束位的tx线电平变化为:

0101010101,这里有4个或者说5个低电平脉宽,这是最理想的情况。这样测出来的脉宽都是波特率。

但是如果是一般的字符,发送一个字节可能获得多个低电平脉宽,从里面找最小的有极大可能就是波特率(极小可能最小的低电平脉宽是波特率的倍数)。

所以我们的算法就是多次测频率,从里面找一个最小的,即认为是波特率。注意这里的频率,波特率都是相对于ego1的100Mhz时钟,并不需要化为实际波特率。

程序

 `timescale 1ns / 1ps

 module cap_freqence(
input clk,
input rst_n,
input freq_in,
input cap_en,
output freq_cap//27bit 0-134,217,727 对输入信号波特率测得的频率
);
reg[:] freq_cap = 'd10416; //rst ??????
reg[:] tmp_cap,sequence_cap[:]; //cap 5 times and Use the smallest one as baud
reg [:] cap_cnt;
// reg cap_finish;
reg s0_RS_232_RX,s1_RS_232_RX; //同步寄存器,消除亚稳态
reg tmp0_RS_232_RX,tmp1_RS_232_RX; //数据寄存器,移位寄存器
reg cap_state; //0:idle 1:work
wire neg_RX;//下降沿
always@(posedge clk or negedge rst_n)//同步寄存器,消除亚稳态
if(!rst_n)
begin
s0_RS_232_RX <= 'b0;
s1_RS_232_RX <= 'b0;
end
else
begin
s0_RS_232_RX <= freq_in; //次态
s1_RS_232_RX <= s0_RS_232_RX;//现态
end
always@(posedge clk or negedge rst_n)//数据寄存器
if(!rst_n)
begin
tmp0_RS_232_RX <= 'b0;
tmp1_RS_232_RX <= 'b0;
end
else
begin
tmp0_RS_232_RX <= s1_RS_232_RX;
tmp1_RS_232_RX <= tmp0_RS_232_RX;
end
//共打两拍再检测输入脚
assign neg_RX = (!tmp0_RS_232_RX) & tmp1_RS_232_RX;//下降沿检测 always@(posedge clk or negedge rst_n)//cap工作状态
if(!rst_n)begin
cap_state <= ;
end
else if(neg_RX) //下降沿开始测频
cap_state <= ;
else if (tmp0_RS_232_RX) //高电平退出测频
cap_state <= ; always@(posedge clk or negedge rst_n)//以100Mhz时钟测输入引脚低电平脉宽
if(!rst_n)
begin
tmp_cap <= 'd0; end
else if(cap_state) //串口工作状态(接受)时计数
begin
if(tmp0_RS_232_RX) //计完一次频率
begin
sequence_cap[cap_cnt] <= tmp_cap;
tmp_cap <= 'd0;
cap_cnt <= cap_cnt + ;//0 1 2 3,4测完4次后为4
end
else
tmp_cap <= tmp_cap + 'b1;
end integer i;
reg[:] min_cap; always@(cap_cnt) //测完一个序列便从测频序列里找出最小脉宽即为bps
begin
if (cap_cnt == 'd5)
begin
min_cap=sequence_cap[];//1st one as minimal cap
for (i=;i<;i=i+)
if (sequence_cap[i] < min_cap)
if (sequence_cap[i] > )
min_cap = sequence_cap[i];
if (cap_en) //手动控制更新baud
freq_cap = min_cap;
end
end endmodule

这个程序有瑕疵,用了初始化。不懂

freq_cap
这个变量放在rst里面复位后,之后都不能被下面
freq_cap = min_cap;
这句更新,暂时这么写吧!

效果

基于FPGA自适应串口通信(Auto Baud Rate)的更多相关文章

  1. 012 基于FPGA的网口通信实例设计【转载】

    一.网口通信设计分类 通过上面其他章节的介绍,网口千兆通信,可以使用TCP或者UDP协议,可以外挂PHY片或者不挂PHY片,总结下来就有下面几种方式完成通信: 图8‑17基于FPGA的网口通信实例设计 ...

  2. 【Delphi】基于状态机的串口通信

    通信协议 串行通信接口(如RS232.RS485等)作为计算机与单片机交互数据的主要接口,广泛用于各类仪器仪表.工业监测及自动控制领域中. 通信协议是需要通信的双方所达成的一种约定,它对包括数据格式. ...

  3. 基于FPGA的光口通信开发案例|基于Kintex-7 FPGA SFP+光口的10G UDP网络通信开发案例

    前言 自著名华人物理学家高锟先生提出"光传输理论",实用化的光纤传输产品始于1976年,经历了PDH→SDH→DWDM→ASON→MSTP的发展历程.本世纪初期,ASON/OADM ...

  4. 纠错:基于FPGA串口发送彩色图片数据至VGA显示

    今天这篇文章是要修改之前的一个错误,前面我写过一篇基于FPGA的串口发送图片数据至VGA显示的文章,最后是显示成功了,但是显示的效果图,看起来确实灰度图,当时我默认我使用的MATLAB代码将图片数据转 ...

  5. QT5 TK1 串口通信

    对TK1中基于QT5的串口通信过程进行总结.按照软件安装及通信实现的顺序. 1.QT5安装 较简洁方式:打开软件中心(类似A形),搜索qtcreator,点击安装即可. 2.串口通信库安装 采用上述方 ...

  6. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  7. [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)

    星期一, 20. 八月 2018 01:53上午 - beautifulzzzz 1.前言 做类似zigbee.ble mesh...无线网络节点性能测试的时候,手动操作然后看表象往往很难找出真正的原 ...

  8. PC和FPGA间的串口通信实现

    应用笔记 V1.0 2015/03/26 PC和FPGA间的串口通信实现   概述   本文将介绍PC和FPGA间的串口通信实现的基本思路和Verilog代码,对于通信而言,收发双方都要有相应的控制. ...

  9. VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程

    首先,在 vs2008 环境下创建 MFC 运用程序 设置项目名称为 ComTest(这个地方随意命名,根据个人习惯),点击确定后,点击下一步 出现如下界面 选择"基于对话框"模式 ...

随机推荐

  1. Apache Flink SQL

    本篇核心目标是让大家概要了解一个完整的 Apache Flink SQL Job 的组成部分,以及 Apache Flink SQL 所提供的核心算子的语义,最后会应用 TumbleWindow 编写 ...

  2. Oracle随笔之用拆分后的列数据关联表查询

    -----------------------建表------------------------- create table test(id int, plist varchar2(30)) ; c ...

  3. 在微服务架构中service mesh是什么?

    在微服务架构中service mesh是什么 什么是 service mesh ? 微服务架构将软件功能隔离为多个独立的服务,这些服务可独立部署,高度可维护和可测试,并围绕特定业务功能进行组织. 这些 ...

  4. Spring Cloud Alibaba学习笔记(6) - Sentinel使用总结

    使用Sentinel API Sentinel主要有三个核心Api: SphU:定义资源,让资源收到监控,保护资源 SphU 包含了 try-catch 风格的 API.用这种方式,当资源发生了限流之 ...

  5. java 禁用科学计数法

    禁用科学计数法 Double num = 80000000000.000001; System.out.println("默认计数法:num=" + num); NumberFor ...

  6. ajax实现文件上传,多文件上传,追加参数

    1.html部分实现代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  7. 解读生命密码的基本手段 ——DNA测序技术的前世今生

    解读生命密码的基本手段 ——DNA测序技术的前世今生 任鲁风  于军 (中国科学院基因组科学及信息重点实验室,北京基因组研究所) DNA(脱氧核糖核酸)和RNA(核糖核酸)是生命体的两种最基本组成物质 ...

  8. C#ModBus Tcp的学习及Master的实现

    Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式. 所以这也是我们工控领域软件开发的所必懂的通讯协议,我也是初次学习,先贴上我的学习笔记 一 ...

  9. 如何导出robotframework的工程

    不知道是不是只有我一个小白,自己折腾了很久,也百度了很久,不知道怎么导出哇.现在来扫扫盲罗.我拿自己的项目举例:找到我的RF工程目录可以看到下面有3个项目,直接拷贝你想要的项目就ok啦,是不是so e ...

  10. jQuery 基础知识

    一.序言 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后的又一个优秀的JavaScript代码库(JavaScript框架).jQuery设计的宗旨是"W ...