FPGA课程设计-基于EGO1实验板和树莓派4B的网络同步时钟(UART编程实现)

1 篇文章 0 订阅
1 篇文章 0 订阅

FPGA课程设计-基于EGO1实验板和树莓派4B的网络同步时钟(UART编程实现)

数电的课程设计,要求采用FPGA设计一个电子日历,于是突发奇想设计了有一个网络同步时间的功能,大体上就是在树莓派端用python编写程序(serial库调用串口ttyAMA1),然后在FPGA端设计一个UART的RX模块即可。

设计代码

https://gitee.com/yangtao2019yt/FPGA_design/tree/master

设计方案

时间同步模块

由于在FPGA直接进行网络编程比较繁琐,并且RGO1实验本身并不附带以太网接口,本方案则退而求其次,采用网络+串口(UART)的形式,配合外设(树莓派4B),在树莓派端联网获取数据,通过GPIO口连接FPGA,使用串口传输的形式将时间信息下发给FPGA实验板,以实现实时同步数据的功能。

物理连接

我们首先通过连接线将在树莓派端ttyAMA1,即串口2的发送脚(TXD)与FPGA的串口接收器(本实验约束到EGO1的H17引脚上)相连。

树莓派

其次在树莓派端,我们采用Python编程。程序流程上,如下:

  1. 首先使用time库获取时间数据;
  2. 转换成为16进制形式;
  3. 通过Serial库很方便地初始化串口;
  4. 通过Serial库将时间数据传输到TXD口上。

对于第1、2、4条,每0.5秒左右重复获取一次,保证每一秒的数据都能得到刷新,而又不会由于刷新太快导致显示产生闪烁,影响视觉效果。程序流程图如下:
树莓派端程序流程图

FPGA

在FPGA端,我们没有(除蓝牙外)现成可用的串口模块,因此我们采用并改进正点原子设计的UART串口接收器(RXD),基本配置为“8位数据位,1位停止位,波特率115200bps”(与树莓派端初始化配置相同),并添加“1位偶校验位”的功能来减少传输扰动造成时间同步错误的可能。

在此之上,由于日期+时间数据共14个数字,采用BCD码形式,需要传输14*4=56 bits的数据,而每帧仅有8个数据位(bits),所以一次日期时间数据至少分7帧才能够传输完成。对于这部分的设计,遵循同接受底层模块recv_txd一样的方法,即采用状态机来实现。

具体来讲,我们规定要想通过传输时间,需遵循如下规则:

  1. 首帧(第1帧)必须为起始位,即ASCII码的“~”,二进制表示为0111_1110,任何时候收到此帧即开启接收过程;
  2. 第2~9帧为日期数据;
  3. 第10帧为校验位,必须为1000_1000,否则判断为传输失败,将从头开始接收起始位;
  4. 第11~16帧为时间数据。

处于此4个状态之外的时刻,即持续监听起始位。状态转换图如下:
串口多帧数据接收器的状态转换图
具体每一帧的接收过程,由子模块uart_recv完成,参考《领航者ZYNQ之 FPGA开发指南V1.3》P288-P306,这里不再赘述。但是需要明确:其中数据位可配置为5、6、7、8位,停止位可配置为1、1.5、2位,在本设计中采用的配置是:数据位为 8 位,停止位为 1 位,无校验位,波特率为 115200bps。
一个典型的串口时序图
在此之上,我们增加了一位奇校验位,以排除传输过程中受到干扰产生的无效数据。实现思路非常简单,将8个数据位做异或运算,得1即表示其中有奇数个1,则校验位置0;得0则有偶数个1,需要将校验位置1。

其他模块

包括计时模块、特殊月份处理模块(能够实现判断大小月,闰年二月的天数),以及消抖、分频、显示、备注模块等,此处略,详情见具体代码。

仿真结果

仿真结果如下,按UART格式模拟发送16帧数据,都能够正常接收并计数:
收到16帧

下图为收到起始帧cnt1从0置1的过程:
收到起始帧

上板测试

实际上板(依元素EGO1实验板)效果如下:
上板测试效果图
开启同步后,同步误差在1s以内,并可长时间稳定传输。

参考资料

[1] EGO1 用户手册, 依元素科技有限公司, 2018.04 .ver2.2
[2] 领航者 ZYNQ 之 FPGA 开发指南 V1.3 正点原子, 第十四章 UART 串口通信实验
[3] Raspberry Pi – Configuration - UART configuration,
https://www.raspberrypi.orgdocumentationconfigurationuart.md
[4] CSDN 博客-树莓派 4 UART 多串口配置通信, TEDxPY
[5] CSDN 博客-树莓派 4B 串口通信, dingpan119

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值