UART的异步串口通信VHDL实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档