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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
UART(即Universal Asynchronous Receiver Transmitter通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。
: C# `2 t# o3 \3 Q! D. k9 d---串行外设用到RS232-C异步串行接口,一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术,基于FPGA/cpld器件设计与实现UART。
& U  m3 L3 Q# O; L! y0 N) k
+ b2 S* ?; e/ p2 n- r3 `一、UART 简介
. U! n9 X' p9 N9 y2 o; {* T+ M1 UART 结构
+ h& Y0 e) g/ [. h& j: f--- UART 主要有由数据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。$ K, c8 q+ w5 d  |- D) n0 ?
--- 功能包括微处理器接口,发送缓冲器(tbr)、发送移位寄存器(tsr)、帧产生、奇偶校验、并转串、数据接收缓冲器(rbr)、接收移位寄存器(rsr)、帧产生、奇偶校验、串转并。. \- s) X$ j& J, ^  ?" T: \
--- 图 1 是 UART 的典型应用。
/ B) q$ z, e  p( ]; S7 k- _1 v
- N' H3 U1 w, P
6 b& R6 f! h) v# I5 _5 @2、UART 的帧格式; O" z% b, S$ u% Q
--- UART 的帧格式如图 2 所示。6 m/ z6 y% x( D: t. \; d+ j+ ^
" Z* b/ @% a5 d; _
--- 包括线路空闲状态(idle,高电平)、起始位(start bit,低电平)、5~8 位数据位(data bits)、校验位(parity bit,可选)和停止位(stop bit,位数可为 1、1.5、2 位)。
: r! b) X) I6 N  |2 W% R  Y% Z--- 这种格式是由起始位和停止位来实现字符的同步。
- k/ y. J' Y3 w" x7 E% b) K3 ~--- UART 内部一般有配置寄存器,可以配置数据位数(5~8 位)、是否有校验位和校验的类型、停止位的位数(1,1.5,2)等设置。8 M$ e- J" x" @( I7 V  o' Z* E+ I5 L
! G2 a" n8 Q; |7 k' q' e( x( Y/ Z1 |
二、UART 的设计与实现( z/ T  I! {* A
1、UART 发送器
" w" V/ o$ h8 c--- 发送器每隔 16 个 CLK16 时钟周期输出 1 位,次序遵循 1 位起始位、8 位数据位(假定数据位为 8 位)、1 位校验位(可选)、1 位停止位。
& N# \! N1 Q6 U--- CPU 何时可以往发送缓冲器 tbr 写入数据,也就是说 CPU 要写数据到 tbr 时必须判断当前是否可写,如果不判这个条件,发送的数据会出错。( Q! y5 S( ?& Y( q: @  y7 [
--- 数据的发送是由微处理器控制,微处理器给出 wen 信号,发送器根据此信号将并行数据din[7..0]锁存进发送缓冲器 tbr[7..0],并通过发送移位寄存器 tsr[7..0]发送串行数据至
% \% e& i6 m6 ?% z. W2 h串行数据输出端 dout。在数据发送过程中用输出信号 tre 作为标志信号,当一帧数据发送完毕时,tre 信号为 1,通知 CPU 在下个时钟装入新数据。: e' ~( r) }  r8 ^
--- 发送器端口信号如图 3 所示。' Z3 K0 U! `$ X' f2 ~
) Y9 u5 b( M3 @
--- 引入发送字符长度和发送次序计数器 length_no,实现的部分 VHDL 程序如下。9 @  u3 v8 P% W4 s, Q
--- if std_logic_vector(length_no) = “0001” then
8 V  E" G$ N. o/ ^  m4 |5 n5 [% T--- tsr <= tbr ; --发送缓冲器 tbr 数据进入发送移位寄存器 tsr 7 Z7 f7 l" w' X9 r3 h! J, `% L
--- tre <= '0' ; --发送移位寄存器空标志置“0” ; g* }$ s4 M  ^7 S7 y/ [7 J
--- elsif std_logic_vector(length_no) = “0010” then ! `+ }0 |+ b% G2 Q, a' z1 y
--- dout <= '0' ; --发送起始位信号“0”
2 `* G, I  d; C( s0 I# t. F--- elsif std_logic_vector(length_no) >= “0011” and std_logic_vector(length_no)
& h$ I) {! c. x" |; @<= “1010” then . M. [) y0 o0 t* p5 A3 J0 n
--- tsr <= '0' & tsr(7 downto 1); --从低位到高位进行移位输出至串行输出端 dout
# r/ h: l) D4 L1 q; l4 L- Q: }--- dout <= tsr(0) ;
# f0 L. {4 k! s4 {. N--- parity <= parity xor tsr(0) ; --奇偶校验) v5 C# N, P* S# L' l
--- elsif std_logic_vector(length_no) = “1011” then
. e. `7 {( V  G& G--- dout <= parity ; 校验位输出* P+ k. k' F6 j7 |
--- elsif std_logic_vector(length_no) = “1100” then . b' X% M5 J; t; [) O6 w+ J
--- dout <= '1' ; --停止位输出
. a5 L  Y, H! r" c' @--- tre <= '1' ; --发送完毕标志置“1”
+ t& N2 P+ p- C# \2 G$ I3 q0 y--- end if ;3 [4 [+ l% @7 \1 _4 v7 @: ?7 ^+ Q
--- 发送器仿真波形如图 4 所示。
# V5 _, K; N- V  a+ l6 r( a- `
6 L2 |: N1 J5 V$ S- X2 W7 ?1 K: x$ R, n3 t% d! U6 L
2、UART 接收器7 G  d( `; n* P0 m# x& H
--- 串行数据帧和接收时钟是异步的,发送来的数据由逻辑 1 变为逻辑 0 可以视为一个数据帧的开始。接收器先要捕捉起始位,确定 rxd 输入由 1 到 0,逻辑 0 要 8 个 CLK16 时钟周期,才是正常的起始位,然后在每隔 16 个 CLK16 时钟周期采样接收数据,移位输入接收移位寄存器 rsr,最后输出数据 dout。还要输出一个数据接收标志信号标志数据接收完。
: Y; O& W; s" w- g' k7 F$ f--- 接收器的端口信号如图 5 所示。5 l) h. y  M1 j/ c9 Y

7 U7 H2 L+ a" \5 \1 }0 G--- 实现的部分 VHDL 程序如下。
& e7 Z+ ?) ]6 M0 L/ x--- elsif clk1x'event and clk1x = '1' then
% @$ x5 X' j9 t, M* u9 ]# O* U--- if std_logic_vector(length_no) >= “0001” and std_logic_vector(length_no) <= “1001” then
: b& m; @2 @. S3 Z$ m) U--- --数据帧数据由接收串行数据端移位入接收移位寄存器
* t. f  w0 L0 Z5 B- h! X--- rsr(0) <= rxda ;
& L! f7 V3 T1 B: I! n- \+ @/ Y3 j5 v--- rsr(7 downto 1) <= rsr(6 downto 0) ;
8 T- c" x; C  r. |--- parity <= parity xor rsr(7) ;
. g3 y5 }- d) R' a' f2 N* E--- elsif std_logic_vector(length_no) = “1010” then
& {5 g" u+ o, r--- rbr <= rsr ; --接收移位寄存器数据进入接收缓冲器
, ~8 ^/ Z. c2 ~% D* Q" C. J--- ...... - i$ v7 [+ p$ D& x
--- end if ;1 c4 A6 ?* T2 N& F( I( D" [4 P; e6 }

) F. T$ E5 b7 R. y6 {

用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 编辑 " q% l  q. i1 V

+ N9 Q& ~" a- U, T; pUART允许在串行链路上进行全双工的通信。扩充了知识面了,感觉很好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-23 12:51 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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