您的位置 首页 IC

根据VHDL的串行发送电路设计

基于VHDL的串行发送电路设计-基于VHDL的串口RS232电路设计 随着电子技术的发展,现场可编程门阵列 FPGA和复杂可编程逻辑器件CPLD的出现,使得电子系统的设计者利用与器件相应的电子CAD软件,在实验室里就可以设计自己的专用集成电路ASIC器件。

1导言

跟着电子技术的开展,现场可编程门阵列FPGA和杂乱可编程逻辑器材CPLD的呈现,使得电子体系的规划者运用与器材相应的电子CAD软件,在试验室里就能够规划自己的专用集成电路ASIC器材。这种可编程ASIC不只使规划的产品到达小型化、集成化和高可靠性,并且器材具有用户可编程特性,大大缩短了规划周期,削减了规划费用,降低了规划危险。现在数字体系的规划能够直接面向用户需求,依据体系的行为和功用要求,自上至下地逐层完结相应的描绘﹑归纳﹑优化﹑仿真与验证,直到生成器材,完结电子规划自动化。其间电子规划自动化(EDA)的关键技术之一便是能够用硬件描绘言语(HDL)来描绘硬件电路。VHDL是用来描绘从笼统到详细等级硬件的工业规范言语,它是由美国国防部在80年代开发的HDL,现在已成为IEEE供认的规范硬件描绘言语。VHDL支撑硬件的规划、验证、归纳和测验,以及硬件规划数据的交流、保护、修正和硬件的完结,具有描绘能力强、生命周期长、支撑大规模规划的分化和已有规划的再运用等长处。运用VHDL这些长处和先进的EDA东西,依据详细的实践要求,咱们能够自己来规划串口异步通讯电路。

2串口异步通讯的帧格局和波特率

2.1串行异步通讯的帧格局

在串行异步通讯中,数据位是以字符为传送单位,数据位的前、后要有开端位、中止位,别的能够在中止位的前面加上一个比特位(bit)的校验位。其帧格局如图1所示。

依据VHDL的串行发送电路规划

开端位是一个逻辑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为中止位。成果显现,输出完全是按数据帧格局发送的。

依据VHDL的串行发送电路规划

4串行接纳电路的规划

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

依据VHDL的串行发送电路规划

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所示。

依据VHDL的串行发送电路规划

4.3时序仿真

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

依据VHDL的串行发送电路规划

列波形,最终成果:接纳到的数据位为6D,开端位为0,中止位为1。

5结束语

VHDL言语规划的呈现从根本上改变了以往数字电路的规划形式,使电路规划由硬件规划转变为软件规划,这样进步了规划的灵活性,降低了电路的杂乱程度,修正起来也很便利。运用VHDL规划的灵活性,依据串行通讯协议的要求,能够在试验室运用先进的EDA东西,用VHDL规划出契合自己实践需求的异步串行通讯电路。

本文规划出的依据VHDL异步串行通讯电路,在试验室现已与计算机串口RS-232进行了通讯试验(留意:TTL和RS-232逻辑电平的转化)。试验证明,0至255的一切数据都能被正确收、发。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/338502.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部