1导言
跟着电子技术的开展,现场可编程门阵列FPGA和杂乱可编程逻辑器材CPLD的呈现,使得电子体系的规划者运用与器材相应的电子CAD软件,在试验室里就能够规划自己的专用集成电路ASIC器材。这种可编程ASIC不只使规划的产品到达小型化、集成化和高可靠性,并且器材具有用户可编程特性,大大缩短了规划周期,削减了规划费用,降低了规划危险。现在数字体系的规划能够直接面向用户需求,依据体系的行为和功用要求,自上至下地逐层完结相应的描绘﹑归纳﹑优化﹑仿真与验证,直到生成器材,完结电子规划自动化。其间电子规划自动化(EDA)的关键技术之一便是能够用硬件描绘言语(HDL)来描绘硬件电路。VHDL是用来描绘从笼统到详细等级硬件的工业规范言语,它是由美国国防部在80年代开发的HDL,现在已成为IEEE供认的规范硬件描绘言语。VHDL支撑硬件的规划、验证、归纳和测验,以及硬件规划数据的交流、保护、修正和硬件的完结,具有描绘能力强、生命周期长、支撑大规模规划的分化和已有规划的再运用等长处。运用VHDL这些长处和先进的EDA东西,依据详细的实践要求,咱们能够自己来规划串口异步通讯电路。
2串口异步通讯的帧格局和波特率
2.1串行异步通讯的帧格局
在串行异步通讯中,数据位是以字符为传送单位,数据位的前、后要有开端位、中止位,别的能够在中止位的前面加上一个比特位(bit)的校验位。其帧格局如图1所示。
开端位是一个逻辑0,总是加在每一帧的开端,为的是提示数据接纳设备接纳数据,在接纳数据位过程中又被别离出去。数据位依据串行通讯协议,答应传输的字符长度能够为5、6、7或8位。一般数据位为7位或8位,假设要传输非ASCII数据(假设运用扩展字符设置的文本或许二进制数据),数据位格局就需求选用8位。数据位被传输时从一个字符的最低位数据开端,最高位数据在最终。例如字母C在ASCII表中是十进制67,二进制的01000011,那么传输的将是11000010。校验位是为了验证传输的数据是否被正确接纳,常见的校验办法是奇、偶校验。别的校验位也能够为0校验或许1校验,即不论数据位中1的个数是多少,校验位一向为0或许1,假设在传输的过程中校验位发生了改变,这就提示呈现了某类过错。不过,在传输数据的时分,也能够不必校验位。中止位,为逻辑1,总在每一帧的结尾,能够是1位、1.5位或许2位。最常用的是1位,超越1位的中止位一般呈现在这样的场合:在处理下一个行将发送来的字符之前接纳设备要求附加时刻。
2.2串行异步通讯的波特率
串行口每秒发送或接纳数据的位数为波特率。若发送或接纳一位数据需求时刻为t,则波特率为1/t,相应的发送或接纳时钟为1/tHz。发送和接纳设备的波特率应该设置成共同,假设两者的波特率不共同,将会呈现校验错或许帧错。
3串行发送电路的规划
为简化电路规划的杂乱性,选用的帧格局为:1位开端位+8位数据位+1位中止位,没有校验位,波特率为9600。
3.1波特率发生器的规划
要发生9600波特率,要有一个不低于9600Hz的时钟才能够。为发生高精度的时钟,我选了6MHz(6M能整除9600)的晶振来供给外部时钟。当然,你也能够选其它频率的时钟来发生9600Hz的时钟。关于6MHz时钟,需求规划一个625进制的分频器来发生9600波特率的时钟信号。用VHDL规划分频器较简略,在这里就不再给出源程序了。
3.2发送电路的规划
依据选用的帧格局,需求发送的数据为10位(1位开端位、8位数据位、1位中止位),在发送完这10位后,就应该中止发送,并使发送端电平处于逻辑1,然后等候下次的发送。下面是完结上述功用的VHDL源程序:
libraryieee;
useieee.std_logic_1164.all;
enTItyComis
port(clk,en:instd_logic;
Send_data:instd_logic_vector(9downto0);
serial:outstd_logic);
endcom;
architecturecom_arcofcomis
begin
process(clk)
variablecount:integerrange0to9:=0;
begin
ifen=‘0‘then
count:=0;
serial=‘1‘;
elsifrising_edge(clk)then
ifcount=9then
serial=Send_data(9);
else
serial=Send_data(count);
count:=count+1;
endif;
endif;
endprocess;
endcom_arc;
其间,Send_data(0to9)表明需求发送的数据帧,发送时,开端位Send_data(0)有必要为逻辑0,中止位Send_data(9)有必要为逻辑1,否者与硬件电路衔接的设备接纳到的数据会呈现过错。在发送每一帧之前,首要给输入端en一个低电平脉冲,让电路复位(count置0),然后开端发送。变量count在进程中用来记载发送的数据数目,当数据帧发送完后,发送端就一向发送中止位(逻辑1)。
3.3时序仿真
选EDA东西,对VHDL源程序编译。用的是Altera公司的MAX+plusII9.3Baseline,这个东西支撑VHDL的编译、仿真。图2是编译后的仿真成果,其间,Clk为频率9600Hz的时钟,Send_data0为开端位,Send_data[8..0]为数据位,Send_data9为中止位。成果显现,输出完全是按数据帧格局发送的。
4串行接纳电路的规划
接纳电路比发送电路要杂乱,接纳电路要时实检测开端位的到来,一旦检测到开端位到,就要将这一帧数据接纳下来。为进步接纳的准确性,削减误码率,每一位数据都用3倍频的波特率对数据进行采样(如图3所示),然后对3次采样成果进行判定:假设3次采样中至少有2次为高电平,则接纳这一位数据被判定为高电平,否者,为低电平。
4.1波特率发生器和采样时钟的规划
为完结3次采样,除了频率为9600Hz的接纳时钟外,还要有一个3倍频的采样时钟。下面是完结上述功用的VHDL源程序:
libraryieee;
useieee.std_logic_1164.all;
enTItycount625is
port(clk,en:instd_logic;Clock1,Clock3:outstd_logic);
endcount625;
architecturecount625_arcofcount625is
begin
process(clk,en)
variablecount:integerrange0to625:=0;
begin
ifen=‘0‘then
NUll;
elsif(rising_edge(clk))then
count:=count+1;
ifcount=625then
Clock1=‘1‘;count:=0;
else
Clock1=‘0‘;
endif;
if(count=100orcount=300orcount=500)then
Clock3=‘1‘;
else
Clock3=‘0‘;
endif;
endif;
endprocess;
endcount625_arc;
其间clk为6MHz的时钟;en操控波形的发生;Clock1为9600Hz的接纳时钟;Clock3为3倍频的采样时钟。
4.2接纳电路的规划
串行接纳电路首要要能判别接纳数据的到来,即每一帧的开端,然后对数据进行3次采样,最终判定输出。为简化规划,帧格局依然选用1位开端位+8位数据位+1位中止位。下面是规划的接纳电路VHDL程序:
libraryieee;
useieee.std_logic_1164.all;
enTItycom_receive10is
port(com,clr,clk1,clk3:instd_logic;Q:outstd_logic_vector(0to9);Valid:outstd_logic);
endcom_receive10;
architecturecom_receive10_arcofcom_receive10is
SignalEnable:std_logic:=‘1‘;
SignalHold:std_logic:=‘0‘;
SignalN:std_logic_vector(0to2):=“000”;
begin
Valid=EnableandHold;
process(clk1,clr)
variableNum:integerrange0to9:=0;
begin
ifclr=‘0‘then
Enable=‘1‘Num:=0;Q=“0000000000”;
elsif(rising_edge(clk1))then
Q(Num)=(N(0)andN(1))or(N(1)andN(2))or(N(0)andN(2));
ifNum=9then
Enable=‘0‘;Num:=0;
else
Num:=Num+1;
endif;
endif;
endprocess;
process(clk3,clr)
variablem:integerrange0to2:=0;
begin
ifclr=‘0‘then
m:=0;
elsif(rising_edge(clk3))then
N(m)=com;
ifm=2then
m:=0;
else
m:=m+1;
endif;
endif;
endprocess;
process(clr,com)
begin
ifclr=‘0‘then
Hold=‘0‘;
elsiffalling_edge(com)then
Hold=‘1‘;
endif;
endprocess;
endcom_receive10_arc;
其间,N(m)=com用来对波形采样;Q(Num)=(N(0)andN(1))or(N(1)andN(2))or(N(0)andN(2))是对其间1位数据的3次采样成果判定;Num用来记载接纳的数据位数;falling_edge(com)是用来时实检测每一帧的开端位(即下降沿)的到来;Valid=EnableandHold用来输出到波特率发生器电路单元操控时钟的发生,最终将一帧的10位数据输出。
用MAX+plusII9.3Baseline将上面两个VHDL文件制成库器材,然后在电路图上调出来,最终做成的串行接纳电路图如图4所示。
4.3时序仿真
时序仿真如图5所示,Receive为接纳到的序
列波形,最终成果:接纳到的数据位为6D,开端位为0,中止位为1。
5结束语
VHDL言语规划的呈现从根本上改变了以往数字电路的规划形式,使电路规划由硬件规划转变为软件规划,这样进步了规划的灵活性,降低了电路的杂乱程度,修正起来也很便利。运用VHDL规划的灵活性,依据串行通讯协议的要求,能够在试验室运用先进的EDA东西,用VHDL规划出契合自己实践需求的异步串行通讯电路。
本文规划出的依据VHDL异步串行通讯电路,在试验室现已与计算机串口RS-232进行了通讯试验(留意:TTL和RS-232逻辑电平的转化)。试验证明,0至255的一切数据都能被正确收、发。