《EDA技术与CPLD FPGA开发应用简明教程 教学课件 ppt 作者 978--302-15639-07.4 FPGA通用异步收发器》由会员分享,可在线阅读,更多相关《EDA技术与CPLD FPGA开发应用简明教程 教学课件 ppt 作者 978--302-15639-07.4 FPGA通用异步收发器(11页珍藏版)》请在金锄头文库上搜索。
1、UART简介,UART(Universal Asynchronous Receiver Transmitter通用异步收发器)是一种应用广泛的短距离串行传输接口。常常用于短距离、低速、低成本的通讯中。 基本的UART通信只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收与发送是全双工形式。TXD是UART发送端,为输出;RXD是UART接收端,为输入。,7.4 FPGA通用异步收发器设计,接下页,UART在信号线上共有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。 它的数据帧格式为:,UART系统FPGA接口电路,接下
2、页,由于RS-232 接口采用+3V-+15V 表示逻辑“0”,-3V-15V 表示逻辑“1”,因此必须利用MAX232 电平转换电路将其转换为数字逻辑电平。 具体线路连接如图7-19所示,其中MAX232 的7脚和8脚接标准的9针RS-232接口,9脚和10脚接FPGA的I/O引脚。,library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity TOP is Port ( CLK : in std_logic; uartin :
3、in std_logic; DIVCLK: out std_logic; DIVCLK2: out std_logic; RxAv:out std_logic); end TOP; architecture Behavioral of TOP is,UART系统VHDL描述,接下页,signal tempclk:std_logic; signal tempdivclk: std_logic; signal counter: std_logic_vector(3 downto 0); signal tempdivclk2: std_logic; signal counter2: std_logi
4、c_vector(11 downto 0); signal tempdata: std_logic_vector(7 downto 0); type state is (idle,work,tobuf); signal present_state:state; signal rxdbuf:std_logic; signal rxdin:std_logic; signal recclk:std_logic; signal data_buf:std_logic_vector(7 downto 0); signal cnt:std_logic_vector(3 downto 0);,接下页,sign
5、al divcnt:integer range 0 to 86; signal bitpos:integer range 0 to 7; component BUFG port (I: in std_logic; O: out std_logic); end component; component IBUF port (I: in std_logic; O: out std_logic); end component; begin u0:IBUF port map(I =uartin,O =rxdbuf); u1:BUFG port map(I =rxdbuf,O =rxdin); u3:B
6、UFG port map(I =clk,O =tempclk);,接下页,-产生16倍波特率的时钟T=542.5ns(波特率为115200) process(tempclk) begin if tempclkevent and tempclk=1 then if(counter=“1101“) then counter=“0000“; tempdivclk=not tempdivclk; else counter=counter+1; end if; end if; end process;,接下页,divclk RxAv=1; if rxdin=1 then cnt=“0000“; pres
7、ent_state=idle; else cnt=cnt+1; if cnt=“0111“ then,接下页,present_state if cnt=“1111“ then cnt=“0000“; data_buf(bitpos)=rxdin; bitpos=bitpos+1; if bitpos=7 then bitpos=0; present_state=tobuf; end if; else,接下页,cnt tempdata=data_buf; RxAv=0; present_state=idle; end case; end if; end process; end Behavioral;,