微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > FPGA和CPLD > 基于VHDL的异步串行通信电路设计

基于VHDL的异步串行通信电路设计

时间:06-30 来源:互联网 点击:


4 串行接收电路的设计

接收电路比发送电路要复杂,接收电路要时实检测起始位的到来,一旦检测到起始位到,就要将这一帧数据接收下来。为提高接收的准确性,减少误码率,每一位数据都用3倍频的波特率对数据进行采样(如图3所示),然后对3次采样结果进行判决:如果3次采样中至少有2次为高电平,则接收这一位数据被判决为高电平,否者,为低电平。


4.1 波特率发生器和采样时钟的设计

为完成3次采样,除了频率为9600Hz的接收时钟外,还要有一个3倍频的采样时钟。下面是实现上述功能的VHDL源程序:

library ieee;
use ieee.std_logic_1164.all;
entity count625 is
port(clk,en:in std_logic; Clock1,Clock3ut std_logic);
end count625;
architecture count625_arc of count625 is
begin
process(clk,en)
variable count:integer range 0 to 625 :=0;
begin
if en='0' then
NUll;
elsif (rising_edge(clk)) then
count:=count+1;
if count=625 then
Clock1<='1'; count:=0;
else
Clock1<='0';
end if;
if (count=100 or count=300 or count=500 ) then
Clock3<='1';
else
Clock3<='0';
end if;
end if;
end process;
end count625_arc;

其中clk为6MHz的时钟;en控制波形的产生; Clock1为9600Hz的接收时钟; Clock3为3倍频的采样时钟。

4.2 接收电路的设计

串行接收电路首先要能判断接收数据的到来,即每一帧的开始,然后对数据进行3次采样,最后判决输出。为简化设计,帧格式仍然采用1位开始位+8位数据位+1位停止位。下面是设计的接收电路VHDL程序:

library ieee;
use ieee.std_logic_1164.all;
entity com_receive10 is

port(com,clr,clk1,clk3:in std_logic;Qut std_logic_vector(0 to 9);Validut std_logic); end com_receive10;
architecture com_receive10_arc of com_receive10 is
Signal Enable:std_logic :='1';
Signal Hold:std_logic :='0';
Signal N:std_logic_vector(0 to 2) :="000";
begin
Valid<=Enable and Hold;
process(clk1,clr)
variable Num:integer range 0 to 9 :=0;
begin
if clr='0' then
Enable<='1' ; Num:=0; Q<="0000000000";
elsif (rising_edge(clk1)) then
Q(Num)<=(N(0) and N(1)) or (N(1) and N(2)) or (N(0) and N(2));
if Num=9 then
Enable<='0'; Num:=0;
else
Num:=Num+1;
end if;
end if;
end process;
process(clk3,clr)
variable m:integer range 0 to 2 :=0;
begin
if clr='0' then
m:=0;
elsif(rising_edge(clk3)) then
N(m)<=com;
if m=2 then
m:=0;
else
m:=m+1;
end if;
end if;
end process;
process(clr,com)
begin

if clr='0' then Hold<='0';
elsif falling_edge(com) then
Hold<='1';
end if;
end process;
end com_receive10_arc;

其中,N(m)<=com 用来对波形采样;Q(Num)<=(N(0) and N(1)) or (N(1) and N(2)) or (N(0) and N(2))是对其中1位数据的3次采样结果判决;Num用来记录接收的数据位数;falling_edge(com)是用来时实检测每一帧的起始位(即下降沿)的到来;Valid<=Enable and Hold用来输出到波特率发生器电路单元控制时钟的产生,最后将一帧的10位数据输出。

用MAX+plus II 9.3 Baseline将上面两个VHDL文件制成库器件,然后在电路图上调出来,最后做成的串行接收电路图如图4所示。


4.3 时序仿真

时序仿真如图5所示,Receive为接收到的序


列波形,最后结果:接收到的数据位为6D,起始位为0,停止位为1。

5 结束语

VHDL语言设计的出现从根本上改变了以往数字电路的设计模式,使电路设计由硬件设计转变为软件设计,这样提高了设计的灵活性,降低了电路的复杂程度,修改起来也很方便。 利用VHDL设计的灵活性,根据串行通信协议的要求,可以在实验室利用先进的EDA工具,用VHDL设计出符合自己实际需求的异步串行通信电路。

本文设计出的基于VHDL异步串行通信电路,在实验室已经与计算机串口RS-232进行了通信实验(注意:TTL和RS-232逻辑电平的转换)。实验证明,0至255的所有数据都能被正确收、发。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top