EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 twel2e 于 2021-7-8 09:45 编辑 ^$ g W0 v- }; S X- _
+ M. q- k' I V* k, W
1、串口协议介绍在业界,串口又称为通用异步收发器(Universal Asynchronous Receiver/Transmitter,简称UART),它的通信方式遵循一套串口协议:UART通信首先将接收到的并行数据换成串行数据来传输。数据帧从起始位开始,后面是7个或8个数据位,一个可用的奇偶校验位和一个或几个高位停止位。在接收过程中,UART从数据帧中去掉起始位和结束位,并对收到的有效数据字节进行奇偶校验,最后将数据字节从串行转换成并行。另外,需要注意的是奇偶校验位可以不需要,有些实现为了简单起见,在协议实现时就没有设置奇偶校验位。UART传输时序如下图所示:
9 @0 N" b" p/ t: V
1、串口实现介绍下面介绍串口的verilog实现技巧:首先是需要产生串行数据发送和接收时钟,为了避免异步通信时发生滑码,确保串行数据被准确接收,一般我们采取的办法是串行时钟频率为波特率的16倍。以我调试的这款测距仪为例,它工作的波特率为115200,而我FPGA板上的系统时钟为100MHz,所以我需要对100MHz进行分频,分频系数N可以计算如下:
5 A3 I0 W' C# H1 D# e ~& t, o9 `9 {% W- F% o: m( T: s6 T: S
" K! n7 p% y/ h6 p5 a
0 c9 T* [6 r8 D R8 J7 `8 L
' u% T3 p' Q# s2 h用verilog实现起来也很简单,如下图所示:
9 o' D5 `: F& ^6 Y' u
# r0 g/ X7 H q; K' ]
* X. n; ?7 n, F 其次是串口发送模块:由于测距仪的串口协议没有奇偶校验位,因此我在FPGA实现端也没有加此功能,也就是说我只需要发送1位起始位、8位数据位以及1位停止位,共10位,而前面提到了发送1位帧数据需要16个时钟周期,所以我们可以知道:只需160个时钟周期我们就可以把10位帧数据发送完毕。所以就有了如下代码:
9 I( J# M1 b0 }% Q0 g1 R, f! V. p4 c* C0 i
& }, @7 \2 [1 X* H' {
% {7 y# [. ?+ g! [6 N+ Z F
, w! [. d" \: c7 |1 Q5 c其中,wrsigrise为数据使能信号,每当需要发送新数据时,该信号就拉高一个时钟周期。idle为发送模块空闲标志,idle为低电平时表示发送线路为空闲,允许新数据发送,idle为高电平时表示目前的数据还没有发送结束,线路正忙。当发送进程启动160个时钟周期后,10位帧数据就已经发送完毕。
0 F+ e% a$ ~% z: R @9 B我们再看看发送模块进程,其实也很简单:就是每16个周期发送一位数据,从低到高发送。如下图所示限于篇幅仅给出了一头一尾,中间部分是一样的:' b5 ^3 K, Q2 y) w4 Q9 X
( w% P# J. O- L% R4 Z! c3 D q7 G7 M9 p% D7 V& j
7 ^! {2 T6 Z* n x6 t8 J, z
* d7 ~$ N) U7 Y# g: S/ y1 m! v+ @8 i; ~3 n
这样10位帧数据就发送完成了,idle拉低表明线路开始空闲了。4 m7 `( v, n6 N( ]3 X. @
然后是串口接收模块了,其实和发送模块差不多,唯一需要注意的地方就是:如何判断数据的到来。我们看协议知道,接收线路上没有数据时会一直保持高电平,当有数据时线路会出现一个由高到低的电平跳变,我们检测到这个跳变就知道数据要来了,咱们就准备接收。如下图所示为接收控制进程:
/ U: P3 E6 I, X& t* O& H d
; u9 X: Z4 w/ \9 n" ^+ a7 Y
3 r8 y: u) K7 Y% [: ?
2 r; N5 s: G# mrxfall即为接收下降沿标志,只有当该信号出现且接收线路为空闲时,接收模块才开始接收线路上的串行数据,并且160个时钟周期之后,10位的帧数据肯定已经接收完毕。4 |; O: r& G) v& _
具体的接收模块和发送模块类似,但需要注意一点,我们在数据的中间点取值,这样接收到的数据最稳定,也就是说,第一个起始位是第0~第15时钟周期,我们在第8个时钟周期取数,第一个数据在第16~第31时钟周期出现,我们则在第24个时钟周期取数,以此类推~,如下图所示: k5 P _- O1 |/ S
" s+ C' v3 f3 |" N: q3 D( N; s
* O3 {3 \+ K& H7 f* a: z
/ i7 W; \& D9 m M& h8 x; R9 i5 V
2、测试结果我们看看激光测距仪的数据手册,其正常工作时发送5个字节的数据:第0个字节是数据帧头,固定的0x81;第1个字节是测距的低八位数据;第2个字节是测距的高八位数据;第3个字节是测距仪曝光等级低八位;第4个字节是测距仪曝光等级低八位。如下图所示:: f/ L0 {) n2 t6 G8 h
; e# x8 H6 k. D9 H. Z
如果FPGA的串口代码没问题,就应该是按这个格式收到数据。启动chipscope,我们观察数据,发现数据完全正确,就此完成调试~
6 g% }, D' \; z8 T
}3 f. w; K I T. G& O* e) e C/ N3 n# U3 q H% c: }0 f
|