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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
UART(即Universal Asynchronous Receiver Transmitter通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。
5 A. F$ C! X# _3 E, j# O---串行外设用到RS232-C异步串行接口,一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术,基于FPGA/cpld器件设计与实现UART。( Q+ [& t3 |! r4 G! b  f
$ C7 h- k2 r& W
一、UART 简介6 B$ I8 P! v/ ?+ X
1 UART 结构
0 c! r( @( s% ]# c+ D$ g% U--- UART 主要有由数据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。
$ ]: V. _5 ?* f' ^8 v7 I6 l: c. g--- 功能包括微处理器接口,发送缓冲器(tbr)、发送移位寄存器(tsr)、帧产生、奇偶校验、并转串、数据接收缓冲器(rbr)、接收移位寄存器(rsr)、帧产生、奇偶校验、串转并。
6 v: z; D6 ^0 p) e8 u2 d- e$ L1 _--- 图 1 是 UART 的典型应用。( C* p! D8 C& w( ~0 d
5 \% E7 y; E3 L+ M# P
# u  W7 |2 t1 U+ H! }
2、UART 的帧格式, ~' v$ F6 a  w$ V
--- UART 的帧格式如图 2 所示。- P8 W: I; c6 h1 `

( d9 v5 K# h; Z, F/ j--- 包括线路空闲状态(idle,高电平)、起始位(start bit,低电平)、5~8 位数据位(data bits)、校验位(parity bit,可选)和停止位(stop bit,位数可为 1、1.5、2 位)。
7 v5 T0 A- V3 B' [  ^$ j- U0 L--- 这种格式是由起始位和停止位来实现字符的同步。
4 f1 W+ c' ~, A  H* K! I* j2 a--- UART 内部一般有配置寄存器,可以配置数据位数(5~8 位)、是否有校验位和校验的类型、停止位的位数(1,1.5,2)等设置。2 x4 i- S6 A) x( U1 n

  ^" a! x& S: z2 e8 ]3 J二、UART 的设计与实现& C) D+ Z. S/ u! o0 o9 N, }8 ]7 ^
1、UART 发送器
1 n5 P1 f& d/ {3 _" J. M--- 发送器每隔 16 个 CLK16 时钟周期输出 1 位,次序遵循 1 位起始位、8 位数据位(假定数据位为 8 位)、1 位校验位(可选)、1 位停止位。
8 p' A& M2 t+ ]! L8 Z( W$ L--- CPU 何时可以往发送缓冲器 tbr 写入数据,也就是说 CPU 要写数据到 tbr 时必须判断当前是否可写,如果不判这个条件,发送的数据会出错。
/ W+ v9 q* t1 \( w. g3 q$ l--- 数据的发送是由微处理器控制,微处理器给出 wen 信号,发送器根据此信号将并行数据din[7..0]锁存进发送缓冲器 tbr[7..0],并通过发送移位寄存器 tsr[7..0]发送串行数据至+ a, L6 [. n  Q6 ?; @
串行数据输出端 dout。在数据发送过程中用输出信号 tre 作为标志信号,当一帧数据发送完毕时,tre 信号为 1,通知 CPU 在下个时钟装入新数据。
  e( p( m5 v( S! a+ r7 e( d" h9 _/ z--- 发送器端口信号如图 3 所示。
( ]1 r7 D5 r$ O: }/ J* m# S
; v% [" ]/ v8 Z$ i( X--- 引入发送字符长度和发送次序计数器 length_no,实现的部分 VHDL 程序如下。
% e7 j* u& Q, J# G4 l--- if std_logic_vector(length_no) = “0001” then / g! H3 R# q, k9 j! m' }
--- tsr <= tbr ; --发送缓冲器 tbr 数据进入发送移位寄存器 tsr
, Q0 @: O8 Z, v/ F3 O--- tre <= '0' ; --发送移位寄存器空标志置“0” , Q( g7 T* T# g1 m9 M
--- elsif std_logic_vector(length_no) = “0010” then   L3 @! q( q9 Q3 l/ Q
--- dout <= '0' ; --发送起始位信号“0”
: B- V& W: W: l& I2 y--- elsif std_logic_vector(length_no) >= “0011” and std_logic_vector(length_no) ! o* T/ Q6 T  L
<= “1010” then
2 u' `! ^% d' P. T& m/ Q--- tsr <= '0' & tsr(7 downto 1); --从低位到高位进行移位输出至串行输出端 dout
, K, L+ R6 C3 [( j--- dout <= tsr(0) ;
( g: e5 E: Z3 Q5 P/ |--- parity <= parity xor tsr(0) ; --奇偶校验
& b5 S1 Y: i8 s( P6 ?  b--- elsif std_logic_vector(length_no) = “1011” then
0 v0 A# a) e) k--- dout <= parity ; 校验位输出. I9 Y% U6 B) c7 k1 n# p! g, U/ U
--- elsif std_logic_vector(length_no) = “1100” then ) R' `' d9 Z) ?& c  A  ~
--- dout <= '1' ; --停止位输出" O2 X  E. ~, r0 a, l
--- tre <= '1' ; --发送完毕标志置“1” - F5 M$ k8 I  l
--- end if ;7 g9 K; a' a( B2 e) c% v$ B
--- 发送器仿真波形如图 4 所示。/ N, |4 t3 y8 n5 W- y! b9 h8 h% E
' U4 k, m) G$ t( u* G) f4 I2 F

$ j7 m: r8 Y5 Z) F4 q+ P* t! L2、UART 接收器0 K/ {4 p( {+ ?
--- 串行数据帧和接收时钟是异步的,发送来的数据由逻辑 1 变为逻辑 0 可以视为一个数据帧的开始。接收器先要捕捉起始位,确定 rxd 输入由 1 到 0,逻辑 0 要 8 个 CLK16 时钟周期,才是正常的起始位,然后在每隔 16 个 CLK16 时钟周期采样接收数据,移位输入接收移位寄存器 rsr,最后输出数据 dout。还要输出一个数据接收标志信号标志数据接收完。
3 }; f/ ^1 I' @, Y6 k7 S( U--- 接收器的端口信号如图 5 所示。$ I+ K3 E# A$ M+ p
, r5 }/ _- x- ~7 i4 j- j
--- 实现的部分 VHDL 程序如下。
( ]- N+ d7 ?) k( o  P- B$ Z# R6 S--- elsif clk1x'event and clk1x = '1' then ) x7 R3 x9 ?% Q+ h' ?$ Z6 a# N
--- if std_logic_vector(length_no) >= “0001” and std_logic_vector(length_no) <= “1001” then + s' }% R; g5 ^6 o( r& c
--- --数据帧数据由接收串行数据端移位入接收移位寄存器% E% N- E/ ?6 I8 g& T; J
--- rsr(0) <= rxda ;
# M8 z+ ^; O: G" M; {--- rsr(7 downto 1) <= rsr(6 downto 0) ;
' ?: P+ \1 ^+ V- A% O: d, h--- parity <= parity xor rsr(7) ; 1 @  w! t* K' X# F1 P: {0 S  c
--- elsif std_logic_vector(length_no) = “1010” then 6 X/ }: Y% M% c/ u" ]7 Z
--- rbr <= rsr ; --接收移位寄存器数据进入接收缓冲器" V, k5 T  D8 V" W. f6 c
--- ......
1 C8 k' c" R4 j, ^5 a' t; e3 D--- end if ;
) Y0 F( b6 w2 M$ Y8 W
4 C2 G- K- W3 E& G

用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 编辑 ! Z- K2 s- G+ ]5 |0 ~* \9 `& V. f
6 A$ \5 q* W$ J& z; o) y" P  m
UART允许在串行链路上进行全双工的通信。扩充了知识面了,感觉很好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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