 
- UID
- 852722
|

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,Clock3:Out 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;Q ut Std_logic_vector(0 To 9);Valid ut 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的所有数据都能被正确收、发。 |
|