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

基于FPGA/CPLD器件设计与实现UART

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-9-15 10:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

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

: H! e% i9 H+ R' I3 Z, c7 g7 x一、UART 简介% w# U1 P  s: X' s; X0 m8 S0 e2 l
1 UART 结构5 T8 d; p# S  r# J" A; v& `9 a
--- UART 主要有由数据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。
0 o+ ~" E7 l0 C$ V$ h8 ~. X--- 功能包括微处理器接口,发送缓冲器(tbr)、发送移位寄存器(tsr)、帧产生、奇偶校验、并转串、数据接收缓冲器(rbr)、接收移位寄存器(rsr)、帧产生、奇偶校验、串转并。# m  b0 x0 y* B
--- 图 1 是 UART 的典型应用。
- v0 O. l* {2 a- k6 Z/ l9 D: [
8 K0 G9 Q' y* ~; ?- j/ J  ?4 y) Z6 x
2、UART 的帧格式; g, M7 e6 W' ^# y) Q
--- UART 的帧格式如图 2 所示。
; R( d9 x/ g8 J8 f # x  j/ p; [0 T+ D, Y( @
--- 包括线路空闲状态(idle,高电平)、起始位(start bit,低电平)、5~8 位数据位(data bits)、校验位(parity bit,可选)和停止位(stop bit,位数可为 1、1.5、2 位)。
6 w  X/ K% J0 M4 g8 @& d, W2 k; r--- 这种格式是由起始位和停止位来实现字符的同步。5 N0 Z! s7 p5 _
--- UART 内部一般有配置寄存器,可以配置数据位数(5~8 位)、是否有校验位和校验的类型、停止位的位数(1,1.5,2)等设置。
0 O2 b0 @% P0 {: {+ ~4 D$ }& W# Z
二、UART 的设计与实现
8 J; e0 Q1 }# a' [0 k5 ?$ H1、UART 发送器
$ M) p9 `: g" M+ I$ f" x9 ?, s--- 发送器每隔 16 个 CLK16 时钟周期输出 1 位,次序遵循 1 位起始位、8 位数据位(假定数据位为 8 位)、1 位校验位(可选)、1 位停止位。
/ Q8 B6 r# J4 d--- CPU 何时可以往发送缓冲器 tbr 写入数据,也就是说 CPU 要写数据到 tbr 时必须判断当前是否可写,如果不判这个条件,发送的数据会出错。/ B4 P$ Q- ]4 }, o$ Q  ?0 @+ n
--- 数据的发送是由微处理器控制,微处理器给出 wen 信号,发送器根据此信号将并行数据din[7..0]锁存进发送缓冲器 tbr[7..0],并通过发送移位寄存器 tsr[7..0]发送串行数据至# J& O! O( j/ x( D
串行数据输出端 dout。在数据发送过程中用输出信号 tre 作为标志信号,当一帧数据发送完毕时,tre 信号为 1,通知 CPU 在下个时钟装入新数据。9 y* q- P$ q5 @4 y3 {6 o7 H5 x1 z
--- 发送器端口信号如图 3 所示。6 A# Y/ B) B+ J. C, z1 }: b

2 [; h* u& z7 M3 w0 }) k--- 引入发送字符长度和发送次序计数器 length_no,实现的部分 VHDL 程序如下。7 _- |7 l$ T* P
--- if std_logic_vector(length_no) = “0001” then
# t8 G9 e" g- f: o5 J--- tsr <= tbr ; --发送缓冲器 tbr 数据进入发送移位寄存器 tsr . ]" m, K% {. u2 i! [; E
--- tre <= '0' ; --发送移位寄存器空标志置“0”
' ^5 m/ H8 I3 x. N--- elsif std_logic_vector(length_no) = “0010” then
6 ~$ B& w7 K" g% d) x' Z--- dout <= '0' ; --发送起始位信号“0” 4 \1 R: O! \% E; z# r1 {
--- elsif std_logic_vector(length_no) >= “0011” and std_logic_vector(length_no)
0 F3 _/ f5 r8 ~9 H$ d<= “1010” then ; Q. s5 r) \0 Y5 ?' f
--- tsr <= '0' & tsr(7 downto 1); --从低位到高位进行移位输出至串行输出端 dout 4 S/ r# q2 ]+ f  j4 o' z
--- dout <= tsr(0) ;   n! X5 S0 _4 O0 ?( s
--- parity <= parity xor tsr(0) ; --奇偶校验
8 K5 [7 x7 ]& L! d: R" ]7 F( c* M+ {--- elsif std_logic_vector(length_no) = “1011” then
# o1 E+ r2 u2 A$ X2 n5 ^--- dout <= parity ; 校验位输出' l+ H' Q2 W  k: S
--- elsif std_logic_vector(length_no) = “1100” then
9 T7 O. m, V! {--- dout <= '1' ; --停止位输出
/ K9 G# ]) R. W* O2 b& `--- tre <= '1' ; --发送完毕标志置“1”
8 A9 i% s1 W# Q% V* i4 i" M4 D--- end if ;
1 M& {; I6 v0 K--- 发送器仿真波形如图 4 所示。
/ [2 k! V7 L) h% o( e* S+ G8 u
, x3 b+ [4 @* Y
6 i$ x% P; G0 G2 A2 l" v2、UART 接收器
% t; j- Q* y$ H9 P9 _3 I2 ^, ~3 Q--- 串行数据帧和接收时钟是异步的,发送来的数据由逻辑 1 变为逻辑 0 可以视为一个数据帧的开始。接收器先要捕捉起始位,确定 rxd 输入由 1 到 0,逻辑 0 要 8 个 CLK16 时钟周期,才是正常的起始位,然后在每隔 16 个 CLK16 时钟周期采样接收数据,移位输入接收移位寄存器 rsr,最后输出数据 dout。还要输出一个数据接收标志信号标志数据接收完。' H# ?- M; c% c) ~9 {# d
--- 接收器的端口信号如图 5 所示。2 S/ o: Z$ [1 j5 v& q

$ W# d+ B0 p4 \# k--- 实现的部分 VHDL 程序如下。
) W1 O' X+ m$ P9 F3 S# {--- elsif clk1x'event and clk1x = '1' then   n# R# @$ V5 r9 n
--- if std_logic_vector(length_no) >= “0001” and std_logic_vector(length_no) <= “1001” then
6 e0 H! W/ Y: B5 J--- --数据帧数据由接收串行数据端移位入接收移位寄存器
6 t) x  K# W( {2 N: B/ z+ T: T. ?# h--- rsr(0) <= rxda ; 2 L$ b  z# ?' e
--- rsr(7 downto 1) <= rsr(6 downto 0) ;
( Z( ~3 O3 O$ y6 ?: e--- parity <= parity xor rsr(7) ;
% }% j# T; ?0 \( c& p--- elsif std_logic_vector(length_no) = “1010” then
5 _- u1 F% f: D5 b1 |8 R--- rbr <= rsr ; --接收移位寄存器数据进入接收缓冲器% q  a6 v! Y! s5 \$ U! @7 {5 Z
--- ...... ; d$ l. Q' H% o+ g. G, R
--- end if ;: ]. v+ K) X3 F# F1 m3 L* a

9 U9 ?+ z6 x7 F( A$ f

用FPGA实现UART.pdf

129.18 KB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

2#
发表于 2022-9-15 10:43 | 只看该作者
多多交流技术上的知识,或实践中碰到的问题

该用户从未签到

3#
发表于 2022-9-15 15:03 | 只看该作者
本帖最后由 RGB_lamp 于 2022-9-17 11:26 编辑
4 s3 r) O  G1 w
+ F" X  Y! @; R+ H$ nUART允许在串行链路上进行全双工的通信。扩充了知识面了,感觉很好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-31 23:38 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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