5、以UART为例,来理解下何为接口协议,何为模块化设计(下)



内容简介

2024-02-02

    这是19年3月份写的一篇文章,老存货了,翻出来看看感觉还有些价值,希望能为需要的朋友提供些参考。


   UART是很简单的协议,也可以说是入门级的协议,它本身不值得我们花费多大的精力探讨,但是我们可以把它看作我们刚学C语言时候写下的”hello world”,刚学习单片机时候点亮的一个led灯,这样,它就有意义了,而且它的意义已经不再是实现一个功能了。我们要好好利用这个简单的协议去理解“协议”这个概念以及如何进行模块化设计,这对FPGA来说,是尤为重要的两个方面。

| /


主要内容为:

1、何为接口协议

2、认识UART协议

3、如何进行模块化设计


代码、资料可在公众号的【资料下载】菜单获取


02

来瞧瞧Uart协议


2.1 协议特点

    现在就来看看UART协议。我是用USB转串口线连接上位机与FPGA板卡,FPGA板卡用MAX232做电平转换之后与FPGA芯片相连。


    UART串口通讯的工作原理是将传输数据的每个字符一位接一位地传输。UART是用两根线进行通信的,从一端看,一个用来收别人说的,一个是发自己说的,一根线它就有两种情况,要不是高电平,要不就是低电平,一根线咱们传数据呢?这就是事先说好的规定,也就是协议。大家可以想想,如果你来设计,咱们通过两根线来进行通讯,你会怎么设计呢?咱们先看看咱们的前辈是怎么设计的。他的格式就是“起始位(0)+八位数据+奇偶校验+停止位”,他的速度是由波特率来设定,空闲状态为高电平,这就是协议。下面咱们来理解一下。



2.2 协议介绍


起始位


       什么是起始位,就是要说话了,咱们人说话得先出个声,叫个“嗨,小张”器件它不能发声,所以就要模拟一个与不出话时候不一样的情景,这就是起始位,因为空闲时候是高电平,所以当出现低电平时候表示可以说话了。


数据位


      数据位,就是和小张说话的内容,就是吃饭了没,比如说,我发个5就表示问小张吃饭了没,那一根线怎么发了,人家说了,每个字符一位接一位地传输,也就是把5转为为二进制00000101,接下来就好像敲电报似得发出去。发0吧数据线拉低了,发1把数据线拉高了,这样就发完了。


奇偶校验


       奇偶校验,什么是校验,就是判断对不对。比如,我问小张吃饭了没,同时做一个吃饭的动作,这小张听到我说吃饭了没,又看到我做吃饭的动作,就明白了我是在问他吃饭了没?如果我问他吃饭了没,又做个蹲坑的动作,小张就该迷茫了,这是在干啥呢,这时候校验不通过。对于uart就一根线,怎么校验,就数数你发的数里面有几个1,如果1的个数是计数就把停止位,话说完了,数据线拉高,我不说了。


2.3 对波特率的理解

    为啥要设定波特率呢,例如我说,小张吃饭了没?如果说快了,他反应不过来,以为我问他去厕所了?说慢了,他还不耐烦。所以说,接收者和发送者速率要匹配。对于机器,你不告诉说多块,更迷茫了,所以就引出了波特率这个概念。但这只是我们一种粗浅的理解,其实波特率是一个很有历史的名词,它是为了纪念电报码的发明者法国人波特(Baudot)故单位为baud,波特率表示串口通信的速率,可以通俗的理解为一个设备在一秒钟内发送(或接收)了多少码元符号。


    它是对符号传输速率的一种度量,1波特即指每秒传输1个码元。在数字通信中常常用时间间隔相同的符号来表示一个二进制数字,这样的时间间隔内的信号称为(二进制)码元。大家有兴趣可以看百度百科的介绍波特率_百度百科


    如果波特率为9600,也就是每秒发送9600个数据(这里的数据包括起始、停止、校验位等,这也就是和比特率的区别,比特率说的是有效数据),这样的话发送一个数据的时间就是1÷9600=0.0001041667s=104166ns,我们晶振是50MHZ,时钟周期是20ns,所以计数个数为104166÷20=5208。所以,当我们在计数5208过程中要完成一位数据的传输,但为了保险起见,我们在这个数的中间进行传输,也就是2604时一位发送数据。


03

如何进行模块化设计


    模块化设计,模块化设计对FPGA工程师来说是非常重要的,合理的模块划分和封装不仅会使代码更友好,而且也非常利于维护,以下是我对模块划分的想法。


 就uart协议的模块划分,我是这样做的


把这个封装一下,就是这样的


·END·






快来扫描下方二维码关注公众号,领取站内所有相关资料,所有哦~

有建议、有需求、有疑问、联系我

<