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

基于FPGA/CPLD设计与实现UART

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-3-26 15:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
* b* m# f5 H0 X' c# p# z# `7 u
1 ^- x9 E7 d( H9 T0 _
* E, _# }" \9 H& X- ^
摘 要:UART是广泛使用的串行数据通讯电路。本设计包含UART发送器、接收器和波特率发生器。设计应用EDA技术,基于FPGA/cpld器件设计与实现UART。
) d- }# u+ F. u1 T关键词:FPGA/CPLD;UART;VHDL

---UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。
! e! Z8 x0 N; j3 U---串行外设用到RS232-C异步串行接口,一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术,基于FPGA/CPLD器件设计与实现UART。

一 UART简介6 o! B8 k) \4 \# p8 Y
1 UART结构9 h( Z. D0 z. l) i
---UART主要有由数据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。
& l0 o0 [$ b5 m6 z& B---功能包括微处理器接口,发送缓冲器(tbr)、发送移位寄存器(tsr)、帧产生、奇偶校验、并转串、数据接收缓冲器(rbr)、接收移位寄存器(rsr)、帧产生、奇偶校验、串转并。' C4 m) h& k# x' i
---图1是UART的典型应用。
' G4 C$ w% E  r0 p1 r: s! o2 t2 UART的帧格式
. D% u% R# n# G& V---UART的帧格式如图2所示。

---包括线路空闲状态(idle,高电平)、起始位(start bit,低电平)、5~8位数据位(data bits)、校验位(parity bit,可选)和停止位(stop bit,位数可为1、1.5、2位)。
$ A5 v( r; c# s, k---这种格式是由起始位和停止位来实现字符的同步。
, |  v# ]) M2 p---UART内部一般有配置寄存器,可以配置数据位数(5~8位)、是否有校验位和校验的类型、停止位的位数(1,1.5,2)等设置。
# r$ h3 X  X& I5 z- K6 z

二 UART的设计与实现$ i+ j% K  X: M6 a' Q
1 UART发送器
9 m" X/ Y! }* k) x- }* U: c& K9 x& _---发送器每隔16个CLK16时钟周期输出1位,次序遵循1位起始位、8位数据位(假定数据位为8位)、1位校验位(可选)、1位停止位。
# m7 x3 z5 E: b5 ~+ ?% Q---CPU何时可以往发送缓冲器tbr写入数据,也就是说CPU要写数据到tbr时必须判断当前是否可写,如果不判这个条件,发送的数据会出错。+ ^8 N! r8 O# G, b( m4 S" m' F
---数据的发送是由微处理器控制,微处理器给出wen信号,发送器根据此信号将并行数据din[7..0]锁存进发送缓冲器tbr[7..0],并通过发送移位寄存器tsr[7..0]发送串行数据至串行数据输出端dout。在数据发送过程中用输出信号tre作为标志信号,当一帧数据发送完毕时,tre信号为1,通知CPU在下个时钟装入新数据。0 G! J, w, U7 m2 o
---发送器端口信号如图3所示。- f' d# f5 l% J; P/ a6 I3 D# y
---引入发送字符长度和发送次序计数器length_no,实现的部分VHDL程序如下。1 I8 n( x' R! T% z/ q! h$ ]( S
---
if std_logic_vector(length_no) = “0001” then
; y9 U/ b, {8 y---tsr <= tbr ; --发送缓冲器tbr数据进入发送移位寄存器tsr( Z5 F  E$ ?0 l8 x1 T
---tre <= '0' ; --发送移位寄存器空标志置“0”! B' \! Y* C6 E! b8 }# {% d
---elsif std_logic_vector(length_no) = “0010” then: ~+ C; Z9 P$ ?, D8 R5 ]' I
---dout <= '0' ; --发送起始位信号“0”' b2 B; {+ K. P& i) }: L
---elsif std_logic_vector(length_no) >= “0011” and std_logic_vector(length_no) <= “1010” then  L; m. t% ]* ]) G% |" K, i
---tsr <= '0' & tsr(7 downto 1); --从低位到高位进行移位输出至串行输出端dout
+ y6 f3 o& [% U& B; x) F2 ^; W---dout <= tsr(0) ;1 {% G' ~9 t2 G3 M
---parity <= parity xor tsr(0) ; --奇偶校验; x# K; ?1 S6 T) D: j
---elsif std_logic_vector(length_no) = “1011” then; i! i  R: a# O2 a4 n# @- s1 O( }# z
---dout <= parity ; 校验位输出
5 h- J; t; ]7 t' }, p+ y! m# ^---elsif std_logic_vector(length_no) = “1100” then  |* p' z: i) i& E
---dout <= '1' ; --停止位输出
8 G$ g- o2 \- G4 O' s' j5 c" c" O---tre <= '1' ; --发送完毕标志置“1”$ b4 v: x' |( L; a* U' [
---end if ;
7 O( y, W0 L) c; n! [! M---发送器仿真波形如图4所示。

2 UART接收器
( D; G0 W: D8 a; q7 f: w. o. A---串行数据帧和接收时钟是异步的,发送来的数据由逻辑1变为逻辑0可以视为一个数据帧的开始。接收器先要捕捉起始位,确定rxd输入由1到0,逻辑0要8个CLK16时钟周期,才是正常的起始位,然后在每隔16个CLK16时钟周期采样接收数据,移位输入接收移位寄存器rsr,最后输出数据dout。还要输出一个数据接收标志信号标志数据接收完。
% W3 L1 j6 n1 R* J5 f% H+ e---接收器的端口信号如图5所示。
& \) T% B' p, j, C( I& p5 h# ~: m; W+ f7 Q- n: V7 D! \$ |
---实现的部分VHDL程序如下。5 c/ J# j/ y$ J/ }% V
---elsif clk1x'event and clk1x = '1' then
  U! o) E) h- g. m---if std_logic_vector(length_no) >= “0001” and std_logic_vector(length_no) <= “1001” then3 A2 e- Y. [- |: X
-----数据帧数据由接收串行数据端移位入接收移位寄存器
( t" y8 L/ {# m  ^. N! r6 R---rsr(0) <= rxda ;
/ E* r5 w; V0 }; k! \; P---rsr(7 downto 1) <= rsr(6 downto 0) ;
5 a; q$ U$ e: a! {5 j2 W; B---parity <= parity xor rsr(7) ;
: f( d4 u7 Y) L  ?! e---elsif std_logic_vector(length_no) = “1010” then! P& L4 W  o' S- ~0 S7 e& x
---rbr <= rsr ; --接收移位寄存器数据进入接收缓冲器/ s  i( J; l/ j
---......( A0 G- o- q1 ?0 r0 D
---end if ;
$ E) G4 u9 ^+ a+ I---接收器仿真波形如图6所示。
! o7 P9 _8 |1 G. x5 C" m# E4 G3 波特率发生器
+ y3 {- D& ^# _---UART的接收和发送是按照相同的波特率进行收发的。波特率发生器产生的时钟频率不是波特率时钟频率,而是波特率时钟频率的16倍,目的是为在接收时进行精确地采样,以提出异步的串行数据。
( i- H& W3 K/ {: o---根据给定的晶振时钟和要求的波特率算出波特率分频数。
+ O7 ?  S% e2 X5 N---波特率发生器仿真波形如图7所示。

三 小结5 K* Q* N) P+ g2 V
---通过波特率发生器、发送器和接收器模块的设计与仿真,能较容易地实现通用异步收发器总模块,对于收发的数据帧和发生的波特率时钟频率能较灵活地改变,而且硬件实现不需要很多资源,尤其能较灵活地嵌入到FPGA/CPLD的开发中。在EDA技术平台上进行设计、仿真与实现具有较好的优越性。


8 @* S& f8 M* a  h; P6 t' t# o% O6 A8 \

该用户从未签到

2#
发表于 2020-3-26 17:11 | 只看该作者
使用VHDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-20 11:35 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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