找回密码
 注册
关于网站域名变更的通知
查看: 596|回复: 3
打印 上一主题 下一主题

FPGA串口实战篇

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-7-8 09:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 twel2e 于 2021-7-8 09:45 编辑
2 p5 k" M. _. x, X$ i& C3 C% o8 q: `( m& ?5 X7 h; d
1、串口协议介绍在业界,串口又称为通用异步收发器(Universal Asynchronous Receiver/Transmitter,简称UART),它的通信方式遵循一套串口协议:UART通信首先将接收到的并行数据换成串行数据来传输。数据帧从起始位开始,后面是7个或8个数据位,一个可用的奇偶校验位和一个或几个高位停止位。在接收过程中,UART从数据帧中去掉起始位和结束位,并对收到的有效数据字节进行奇偶校验,最后将数据字节从串行转换成并行。另外,需要注意的是奇偶校验位可以不需要,有些实现为了简单起见,在协议实现时就没有设置奇偶校验位。UART传输时序如下图所示:
" m' g% L9 f! a7 q% l- e: Y# Y
1、串口实现介绍下面介绍串口的verilog实现技巧:首先是需要产生串行数据发送和接收时钟,为了避免异步通信时发生滑码,确保串行数据被准确接收,一般我们采取的办法是串行时钟频率为波特率的16倍。以我调试的这款测距仪为例,它工作的波特率为115200,而我FPGA板上的系统时钟为100MHz,所以我需要对100MHz进行分频,分频系数N可以计算如下:
/ {0 U) h' M0 p5 z6 C
. a9 s3 S, R' ] # B3 y$ N+ y0 t  E0 f; {8 {
0 {; c9 d. t4 b- T+ w
5 s/ J4 `) |/ Q& W, p0 Q0 m4 G
用verilog实现起来也很简单,如下图所示:
& M: S3 y% W+ |2 S% G# e
# l! j% i- J9 `3 T, G* d- D  \# W8 T0 |

4 z9 b& I' _7 `! c. s) @; W' b. q
其次是串口发送模块:由于测距仪的串口协议没有奇偶校验位,因此我在FPGA实现端也没有加此功能,也就是说我只需要发送1位起始位、8位数据位以及1位停止位,共10位,而前面提到了发送1位帧数据需要16个时钟周期,所以我们可以知道:只需160个时钟周期我们就可以把10位帧数据发送完毕。所以就有了如下代码:
& [8 m, g/ d+ u5 A0 y. z5 g+ C4 d; ?3 S2 Z
3 d$ V5 E$ H# B* [0 M

. H' H, S& T  M/ ]- z

( r$ a. v4 q1 [) }其中,wrsigrise为数据使能信号,每当需要发送新数据时,该信号就拉高一个时钟周期。idle为发送模块空闲标志,idle为低电平时表示发送线路为空闲,允许新数据发送,idle为高电平时表示目前的数据还没有发送结束,线路正忙。当发送进程启动160个时钟周期后,10位帧数据就已经发送完毕。
% |) x( n. v# E+ C! i% I$ g
我们再看看发送模块进程,其实也很简单:就是每16个周期发送一位数据,从低到高发送。如下图所示限于篇幅仅给出了一头一尾,中间部分是一样的:
. w6 \9 o" _& a+ F7 W# v2 \

6 M6 W0 _2 Q9 o4 K% K5 k  i9 ]& n7 V- H: O$ X1 T# ~

' T0 t2 D- X0 E0 G" l, V) h- z3 T% X( U2 z

7 W4 G+ C6 Q$ r: J" N0 d* I. o这样10位帧数据就发送完成了,idle拉低表明线路开始空闲了。8 _: A3 _5 e( S; v6 `; e
然后是串口接收模块了,其实和发送模块差不多,唯一需要注意的地方就是:如何判断数据的到来。我们看协议知道,接收线路上没有数据时会一直保持高电平,当有数据时线路会出现一个由高到低的电平跳变,我们检测到这个跳变就知道数据要来了,咱们就准备接收。如下图所示为接收控制进程:
2 z7 o( w4 q! @+ E

+ h$ }/ L" n! ?2 n7 S1 r3 [! Q# N* w# E

" _) N, X8 C# ?/ p  W: }6 Lrxfall即为接收下降沿标志,只有当该信号出现且接收线路为空闲时,接收模块才开始接收线路上的串行数据,并且160个时钟周期之后,10位的帧数据肯定已经接收完毕。+ M9 o  J( i) X, t' {- M/ C
具体的接收模块和发送模块类似,但需要注意一点,我们在数据的中间点取值,这样接收到的数据最稳定,也就是说,第一个起始位是第0~第15时钟周期,我们在第8个时钟周期取数,第一个数据在第16~第31时钟周期出现,我们则在第24个时钟周期取数,以此类推~,如下图所示:. ~' h9 V, m1 u' _! H, f
1 N4 d; t/ t, e2 n: [" o% v% q
" \5 F& F  M- x9 d- Y( K0 r
5 |4 t% U! h1 q* U5 z/ c% E! d
2、测试结果我们看看激光测距仪的数据手册,其正常工作时发送5个字节的数据:第0个字节是数据帧头,固定的0x81;第1个字节是测距的低八位数据;第2个字节是测距的高八位数据;第3个字节是测距仪曝光等级低八位;第4个字节是测距仪曝光等级低八位。如下图所示:( T$ ]; k% Y) I

$ w+ o2 W: @' m( A& C. o
如果FPGA的串口代码没问题,就应该是按这个格式收到数据。启动chipscope,我们观察数据,发现数据完全正确,就此完成调试~
5 `4 I& w8 c+ H( `, ?" N' U

& H( a# a6 c. u0 r  C
% Y9 k# G% Z  k( O1 Y0 ]2 N6 o7 O

该用户从未签到

2#
发表于 2021-7-8 10:25 | 只看该作者
串口协议介绍在业界,串口又称为通用异步收发器5 m9 X8 Z! F0 f

该用户从未签到

3#
发表于 2021-7-8 13:21 | 只看该作者
串口实战           - _0 g8 d/ a$ G; _/ _

该用户从未签到

4#
发表于 2021-7-8 13:27 | 只看该作者
需要产生串行数据发送和接收时钟$ X  f3 i1 s1 Q% r
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-9 18:49 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表