UART的异步串口通信VHDL实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
UART 的异步串口通信协议的VHDL 语言实现
异步串行通信的采用的波特率为9600b/s,外配晶体振荡器的频率为3.6864MHZ ,故采用分频电路
package width is
constant N:integer:=8;
end width;
use work.width.all;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity fredivn is
GENERIC (N:integer:=6);
port(clkin: in std_logic;
clkout: out std_logic);
end fredivn;
architecture behav of fredivn is
signal count : integer;
begin
process(clkin)
begin
if (clkin'event and clkin=1)then
if(count count<=count+1; else count<=0; end if; if (count clkout<='1'; else clkout<='0'; end if; end if; end process; end behav; 异步接收模块 RXD 的端口clk 为输入时钟,rx 为串行数据接收,sig1为接收中断标志,q 为并行数据输出 程序流程如下:sig1是接收中断标志位,当是低电平时,说明接收过程并未启动,于是检测电平,当rx 电平为低 时,sig2开始计数,若连续8次采样rx 都是低电平,则说明是起始位,启动接收过程,每隔16个接收时钟接收1位数据 直至11位接收完毕,并行输出口是一个串并转换。 本例中的数据位8位 E C N C RXD data 8bit library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity rxd3 is port(clk,rx: in std_logic; sig1:buffer std_logic; --接收中断标志 q:out std_logic_vector(7 downto 0)); --并行数据输出 end rxd3; architecture behav of rxd3 is signal tmpreg8: std_logic_vector(8 downto 0); signal sig2: integer range 0 to 16 ; --接收时钟计数 signal sig3: integer range 0 to 9 ; --接收数据位数 signal sig4: std_logic; --串并转换时钟,接收是为1 ,空挡为0 begin process(clk) begin if (clk'event and clk='1') then if (sig1='0') then --ri 状态 if (rx='0') then --此句判断是否是起始位,是则 sig1<='1' if (sig2=7) then --对应起始位的处理 sig2<='0'; sig1<='1'; sig4<='1'; else sig2<=sig2+1; sig4<='0'; end if; else sig2<='0'; end if; else --ri 为1,对应的数据接收 if (sig2=15) then sig2<='0'; if (sig3=8) then --接收完一帧否?若接收完则sig1置0,表示空闲 sig3<='0' ; sig1<='0'; sig4<='0'; else sig3<=sig3+1; sig4<='1'; end if; else sig2<=sig2+1; sig4<='0'; end if; end if; end if; end process; E C N C process(sig4) --此进程完成接收数据的串并转换 begin if (sig4'event and sig4='1') then for i in tempreg8'high downto tempreg8'low+1 loop tempreg8(i)<=tempreg8(i-1); end loop; tempreg8( tempreg8'low)<=rx; end if; end process; process begin for i in 7 downto 0 loop q(i)<=tempreg8(i); end loop; end process; end behav; 异步发送模块 TXD5的端口中,indata 为8位数据输入端口。cs 为片选信号,低电平有效。wr 是输出允许,高电平 有效。clk 为输入时钟信号,为发送提供时钟,txd 是串行发送端,ti 是发送中断标志,高电平表示正在发送 低电平表示空闲 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity txd5 is port(indata: in std_logic_vector(7 downto 0); --8位数据输入端口 cs,wr,clk:in std_logic; txd,ti: out std_logic); --txd 串行发送,ti 发送中断信号 end txd5; architecture behav of txd5 is signal sig_count: std_logic_vector (3 downto 0); signal sig_ti,sig_ti1,sig_txd,sig_buffer: std_logic; signal sig_data: std_logic_vector (7 downto 0); signal sig_txddata: std_logic_vector (9 downto 0); begin process(clk) begin E C N C