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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
UART(即Universal Asynchronous Receiver Transmitter通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。# [  ]( y3 F, C( \& S8 k
---串行外设用到RS232-C异步串行接口,一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术,基于FPGA/cpld器件设计与实现UART。
! s; ?0 h& X2 v  C! X( s. s
5 ?& \6 v) _% c  O: c! L- t一、UART 简介- G2 C5 u! L6 x! `$ j0 |0 Z- T) n
1 UART 结构
/ j( I- v! {7 h% n! I" h--- UART 主要有由数据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。% D! e- d" @& \
--- 功能包括微处理器接口,发送缓冲器(tbr)、发送移位寄存器(tsr)、帧产生、奇偶校验、并转串、数据接收缓冲器(rbr)、接收移位寄存器(rsr)、帧产生、奇偶校验、串转并。( {3 j% s9 g  n# k, x5 h
--- 图 1 是 UART 的典型应用。
' V, K3 \1 d; L0 h% q( y! ^- I& U $ q  u5 v! s7 l7 Y/ b# Z* V
* e( _8 s; u6 z7 F! F9 _0 n- M& h
2、UART 的帧格式) Z& {' }# j2 U# n- \
--- UART 的帧格式如图 2 所示。
9 x1 ~0 w$ L8 |* C+ v
, q2 \8 P1 F2 }" h8 p# Z--- 包括线路空闲状态(idle,高电平)、起始位(start bit,低电平)、5~8 位数据位(data bits)、校验位(parity bit,可选)和停止位(stop bit,位数可为 1、1.5、2 位)。
* E6 l+ X6 M9 I0 \+ L+ |--- 这种格式是由起始位和停止位来实现字符的同步。: B* e* r- Q& g0 m2 ^. n
--- UART 内部一般有配置寄存器,可以配置数据位数(5~8 位)、是否有校验位和校验的类型、停止位的位数(1,1.5,2)等设置。
) ?/ z+ H4 [7 h6 P) \  X7 [* \8 I* o3 @: b& [. b, @
二、UART 的设计与实现. b, j2 x! w$ {( j5 J  v5 K3 i
1、UART 发送器
( a, e5 H2 _0 ?+ H1 g$ r% s--- 发送器每隔 16 个 CLK16 时钟周期输出 1 位,次序遵循 1 位起始位、8 位数据位(假定数据位为 8 位)、1 位校验位(可选)、1 位停止位。
1 L7 N+ T. E6 ~& [" T5 P# `--- CPU 何时可以往发送缓冲器 tbr 写入数据,也就是说 CPU 要写数据到 tbr 时必须判断当前是否可写,如果不判这个条件,发送的数据会出错。; T$ Y7 D7 y' k4 |0 S  h
--- 数据的发送是由微处理器控制,微处理器给出 wen 信号,发送器根据此信号将并行数据din[7..0]锁存进发送缓冲器 tbr[7..0],并通过发送移位寄存器 tsr[7..0]发送串行数据至0 k1 q6 C& a6 a, e# t
串行数据输出端 dout。在数据发送过程中用输出信号 tre 作为标志信号,当一帧数据发送完毕时,tre 信号为 1,通知 CPU 在下个时钟装入新数据。2 n. y) h% K7 V6 J/ C4 q
--- 发送器端口信号如图 3 所示。
# p2 P4 }: B* _- T- Y& ^$ |- l - T0 c% g" {4 J1 S) `6 {$ o8 f6 s
--- 引入发送字符长度和发送次序计数器 length_no,实现的部分 VHDL 程序如下。' x* h) i& ]! M$ s, Y5 `* T
--- if std_logic_vector(length_no) = “0001” then : m* B  D2 a0 G4 M" t6 ^% Q4 F4 f
--- tsr <= tbr ; --发送缓冲器 tbr 数据进入发送移位寄存器 tsr
, X) {& ^0 Y3 C9 [4 w--- tre <= '0' ; --发送移位寄存器空标志置“0”
4 \, F. ]- W3 ^4 X--- elsif std_logic_vector(length_no) = “0010” then
; [1 L; C, v/ S+ J3 v: [--- dout <= '0' ; --发送起始位信号“0”
9 P" b: A/ K' L6 F7 E--- elsif std_logic_vector(length_no) >= “0011” and std_logic_vector(length_no) * \7 j8 B& M$ y3 T  c8 p
<= “1010” then
$ t7 j( u, Y$ f4 q6 p6 P1 `7 I--- tsr <= '0' & tsr(7 downto 1); --从低位到高位进行移位输出至串行输出端 dout
4 n6 c7 A$ P7 |--- dout <= tsr(0) ; 6 s5 Z* L" b! G. _5 L( j/ p/ U
--- parity <= parity xor tsr(0) ; --奇偶校验* ?1 p5 T' y8 D+ Q- u
--- elsif std_logic_vector(length_no) = “1011” then 5 p3 j* f( s* S8 I
--- dout <= parity ; 校验位输出
$ c/ x2 t- p4 I) K4 `9 `2 R0 h+ h9 i--- elsif std_logic_vector(length_no) = “1100” then 8 T6 [) R, Y" o- B5 v$ @8 c
--- dout <= '1' ; --停止位输出
9 l9 `, X/ {7 |; |; v--- tre <= '1' ; --发送完毕标志置“1”
% L$ ^. h+ x$ V" X--- end if ;
& m' `, r. T( R/ k: e--- 发送器仿真波形如图 4 所示。
' S( i' p6 z: q1 n& ?' ~
" y% e1 ]+ q3 l, z8 u* p. L
, W! q( g7 a, T+ u2、UART 接收器
, G( E: d5 j+ |" @--- 串行数据帧和接收时钟是异步的,发送来的数据由逻辑 1 变为逻辑 0 可以视为一个数据帧的开始。接收器先要捕捉起始位,确定 rxd 输入由 1 到 0,逻辑 0 要 8 个 CLK16 时钟周期,才是正常的起始位,然后在每隔 16 个 CLK16 时钟周期采样接收数据,移位输入接收移位寄存器 rsr,最后输出数据 dout。还要输出一个数据接收标志信号标志数据接收完。; l& \/ A, L  _" y: X
--- 接收器的端口信号如图 5 所示。
# ~0 ~2 c- ^5 A/ k) Y 2 E4 a; Z  |1 C$ C' e( n
--- 实现的部分 VHDL 程序如下。
& |' Q- R( u) ]! F  L; V% u. A( ^--- elsif clk1x'event and clk1x = '1' then ( Q( l: I& t! Q/ E
--- if std_logic_vector(length_no) >= “0001” and std_logic_vector(length_no) <= “1001” then - ]3 ]" m* T# ^' [" o* j  e
--- --数据帧数据由接收串行数据端移位入接收移位寄存器
! @7 ]" D) l/ E! X2 X' q  m, B) T' R--- rsr(0) <= rxda ;
" l, A: Z6 i6 @; P' e--- rsr(7 downto 1) <= rsr(6 downto 0) ;
/ ~. y4 H, D' L' G0 U: k! s--- parity <= parity xor rsr(7) ; . k. ?# C* d5 Q* O5 N5 s' k. c  u) Z
--- elsif std_logic_vector(length_no) = “1010” then
' ], q, S! Y. d- Z2 C--- rbr <= rsr ; --接收移位寄存器数据进入接收缓冲器
5 q. l8 f6 E7 Z, H5 f/ S--- ......
: ^+ L/ e+ D8 _8 E2 {--- end if ;
$ o1 J0 X9 ~0 V+ t& S
* V6 X" h) u: |0 C* s9 }$ i; {

用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 编辑 ) m4 H$ k" x) P2 f: N

% M8 }5 E* k! R+ q- LUART允许在串行链路上进行全双工的通信。扩充了知识面了,感觉很好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-21 05:56 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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