完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。---串行外设用到RS232-C 异步串行接口,一般采用专用的集成电路即UART 实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术,基于FPGA/CPLD器件设计与实现UART。
一、 UART 简介 1 、UART 结构 UART主要有由数据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。---功能包括微处理器接口,发送缓冲器(tbr)、发送移位寄存器(tsr)、帧产生、奇偶校验、并转串、数据接收缓冲器(rbr)、接收移位寄存器(rsr)、帧产生、奇偶校验、串转并。 图1 是UART 的典型应用。 图 1 2、 UART 的帧格式 UART 的帧格式如图2 所示。 图 2 ---包括线路空闲状态(idle,高电平)、起始位(start bit,低电平)、5~8位数据位(data bits)、校验位(parity bit,可选)和停止位(stop bit,位数可为1、1.5、2 位)。 ---这种格式是由起始位和停止位来实现字符的同步。 --- UART 内部一般有配置寄存器,可以配置数据位数(5~8 位)、是否有校验位和校验的类型、停止位的位数(1,1.5,2)等设置。 二、 UART 的设计与实现 1、 UART 发送器 发送器每隔16个CLK16时钟周期输出1位,次序遵循1位起始位、8位数据位(假定数据位为8位)、1位校验位(可选)、1位停止位。--- CPU何时可以往发送缓冲器tbr写入数据,也就是说CPU要写数据到tbr时必须判断当前是否可写,如果不判这个条件,发送的数据会出错。---数据的发送是由微处理器控制,微处理器给出wen 信号,发送器根据此信号将并行数据din[70]锁存进发送缓冲器tbr[70],并通过发送移位寄存器tsr[70]发送串行数据至串行数据输出端dout。在数据发送过程中用输出信号tre作为标志信号,当一帧数据发送完毕时,tre信号为1,通知CPU在下 个时钟装入新数据。---发送器端口信号如图3 所示。 图 3 ---引入发送字符长度和发送次序计数器length_no,实现的部分VHDL 程序如下。 --- if std_logic_vector(length_no) = “0001” then --- tsr 《= tbr ; --- 发送缓冲器tbr 数据进入发送移位寄存器tsr--- tre 《= ‘0’ ; --- 发送移位寄存器空标志置“0” --- elsif std_logic_vector(length_no) = “0010” then --- dout 《= ‘0’ ; --- 发送起始位信号“0” --- elsif std_logic_vector(length_no) 》= “0011” and std_logic_vector(length_no) 《= “1010” then --- tsr 《= ‘0’ & tsr(7 downto 1); --- 从低位到高位进行移位输出至串行输出端dout --- dout 《= tsr(0) ; --- parity 《= parity xor tsr(0) ; --- 奇偶校验--- elsif std_logic_vector(length_no) = “1011” then --- dout 《= parity ; 校验位输出--- elsif std_logic_vector(length_no) = “1100” then --- dout 《= ‘1’ ; --- 停止位输出--- tre 《= ‘1’ ; ---发送完毕标志置“1” --- end if ; ---发送器仿真波形如图4 所示。 图 4 2、 UART 接收器 串行数据帧和接收时钟是异步的,发送来的数据由逻辑1 变为逻辑0 可以视为一个数据帧的开始。接收器先要捕捉起始位,确定rxd输入由1到0,逻辑0要8个CLK16时钟周期,才是正常的起始位,然后在每隔16个CLK16时钟周期采样接收数据,移位输入接收移位寄存器rsr,最后输出数据dout。还要输出一个数据接收标志信号标志数据接收完。 ---接收器的端口信号如图5 所示。 图 5 ---实现的部分VHDL 程序如下。 --- elsif clk1x‘event and clk1x = ’1‘ then ---if std_logic_vector(length_no) 》= “0001” and std_logic_vector(length_no) 《= “1001” then ---数据帧数据由接收串行数据端移位入接收移位寄存器 ---rsr(0) 《= rxda ; --- rsr(7 downto 1) 《= rsr(6 downto 0) ; --- parity 《= parity xor rsr(7) ; --- elsif std_logic_vector(length_no) = “1010” then --- rbr 《= rsr ; --- 接收移位寄存器数据进入接收缓冲器 --- --- end if ; ---接收器仿真波形如图6 所示。 图 6 3、 波特率发生器 --- UART 的接收和发送是按照相同的波特率进行收发的。波特率发生器产生的时钟频率不是波特率时钟频率,而是波特率时钟频率的16倍,目的是为在接收时进行精确地采样,以提出异步的串行数据。 ---根据给定的晶振时钟和要求的波特率算出波特率分频数。 ---波特率发生器仿真波形如图7 所示。 图 7 三、小 结 通过波特率发生器、发送器和接收器模块的设计与仿真,能较容易地实现通用异步收发器总模块,对于收发的数据帧和发生的波特率时钟频率能较灵活地改变,而且硬件实现不需要很多资源,尤其能较灵活地嵌入到FPGA/CPLD的开发中。在EDA技术平台上进行设计、仿真与实现具有较好的优越性。 |
|
|
|
只有小组成员才能发言,加入小组>>
778 浏览 0 评论
1149 浏览 1 评论
2527 浏览 5 评论
2859 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2709 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1066浏览 3评论
190浏览 2评论
453浏览 2评论
368浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 14:13 , Processed in 1.138116 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号