<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0043)http://www.fpga.com.cn/application/a112.htm -->
<HTML><HEAD><TITLE>用VHDL语言在CPLD上实现串行通信</TITLE><!-- #BeginTemplate "/Templates/main.dwt" --><!-- DW6 -->
<META http-equiv=Content-Type content="text/html; charset=gb2312"><!-- #BeginEditable "doctitle" -->
<STYLE type=text/css>BODY {
FONT-SIZE: 10px
}
TD {
FONT-SIZE: 10px
}
TH {
FONT-SIZE: 10px
}
</STYLE>
<STYLE type=text/css>BODY {
FONT-SIZE: 10pt
}
TD {
FONT-SIZE: 10pt
}
TH {
FONT-SIZE: 10pt
}
</STYLE>
<!-- #EndEditable --><LINK href="用VHDL语言在CPLD上实现串行通信.files/Style.css"
type=text/css rel=stylesheet>
<META content="tb, default" name="Microsoft Border">
<META content="MSHTML 6.00.2800.1458" name=GENERATOR></HEAD>
<BODY text=#000000 vLink=#000066 aLink=#fe818d link=#0000ff bgColor=#ffffff
leftMargin=2 topMargin=2 rightMargin=2 MARGINWIDTH="2" MARGINHEIGHT="2">
<TABLE height=36 cellSpacing=0 cellPadding=0 width=778 align=center border=0>
<TBODY>
<TR>
<TD class=tbgc width=116 background=用VHDL语言在CPLD上实现串行通信.files/mast_logo.gif
rowSpan=2> </TD>
<TD width=37 bgColor=#504a8a height=20> </TD>
<TD width=303 bgColor=#504a8a height=20>
<DIV align=right><FONT class=font10 color=#ffffff><SPAN class=font10><B
class=font10_white>可编程逻辑器件 中文网站</B></SPAN></FONT></DIV></TD>
<TD width=304 bgColor=#504a8a height=20>
<DIV align=right><FONT color=#6699cc><FONT class=index2
color=#fafafa><SPAN class=index2>推荐使用1024x768分辨率</SPAN></FONT><SPAN
class=index2><FONT class=index2 color=#cccccc>
</FONT></SPAN></FONT></DIV></TD></TR>
<TR>
<TD class=font10 vAlign=center bgColor=#000066 colSpan=3>
<DIV align=left><FONT class=verysmall color=#000066 size=1><SPAN
class=verysmall2>xilinx,lattice,altera,actel,Quicklogic,EDA软件,PLD,CPLD,FPGA,VHDL,verilog,IP
core,ABEL,单片机,8051,数字信号处理,DSP,MCU,PCI接口,数字逻辑电路,设计技巧,参考设计,电子元器件销售,解密,license,crack,synplify,modlesim,开发板,学习资料,学习套件</SPAN></FONT></DIV></TD></TR></TBODY></TABLE>
<TABLE class=font10 cellSpacing=0 cellPadding=0 width=778 align=center
border=0><TBODY>
<TR vAlign=center align=middle bgColor=#000066>
<TD class=font9 width=119 height=17>
<DIV align=center><B><A class=index
href="http://www.fpga.com.cn/index.htm">主 页</A></B></DIV></TD>
<TD class=font9 width=80 height=17><B><FONT color=#cccccc><A class=index
href="http://www.fpga.com.cn/introduction1.htm">新手入门</A></FONT></B></TD>
<TD class=font9 width=80 height=17><B><FONT color=#cccccc><A class=index
href="http://www.fpga.com.cn/advance.htm">设计进阶</A></FONT></B></TD>
<TD class=font9 width=80 height=17><B><FONT color=#cccccc><A class=index
href="http://www.fpga.com.cn/hdl.htm">HDL语言</A></FONT></B></TD>
<TD class=font9 width=80 height=17><B><FONT color=#cccccc><A class=index
href="http://www.fpga.com.cn/manufacturer.htm">PLD厂商</A></FONT></B></TD>
<TD class=font9 width=80 height=17><B><FONT color=#cccccc><A class=index
href="http://www.fpga.com.cn/freeip.htm">参考设计</A></FONT></B></TD>
<TD class=font9 width=80 height=17><B class=index><A class=index
href="http://www.fpga.com.cn/software.htm">开发软件</A></B></TD>
<TD class=font9 width=80 height=17><B><FONT color=#cccccc><A class=index
href="http://www.fpga.com.cn/application.htm">应用文章</A></FONT></B></TD>
<TD class=font9 width=80 height=17><B><FONT color=#cccccc><A class=index
href="http://www.pld.com.cn/BBS/index.asp">PLD论坛</A></FONT></B></TD></TR><!--msnavigation--></TBODY></TABLE>
<TABLE class=font10 cellSpacing=0 cellPadding=0 width=778 align=center
border=0><TBODY>
<TR>
<TD width=119 bgColor=#e8e8e8> </TD>
<TD colSpan=8>
<MARQUEE class=font9 scrollAmount=5 scrollDelay=100 width="100%"
bgColor=#ffffff border="0" align="middle"><FONT
color=#000066>欢迎来到可编程逻辑器件中文网站! www.PLD.com.cn </FONT></MARQUEE></TD></TR><!--msnavigation--></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=778 align=center border=0>
<TBODY>
<TR>
<TD vAlign=top width=119 bgColor=#e8e8e8>
<DIV align=left><!-- #BeginEditable "column" --><!-- #EndEditable -->
<P> </P>
<P> </P>
<P> </P></DIV></TD><!--msnavigation-->
<TD vAlign=top height=52>
<DIV align=center>
<CENTER><!-- #BeginEditable "Content" -->
<BLOCKQUOTE>
<P align=left>作者: 中国矿业大学信息与电气工程学院 张鑫 出处:今日电子</P></BLOCKQUOTE>
<P align=left> </P>
<P class=font12B><STRONG><STRONG>用VHDL语言在CPLD上实现串行通信
</STRONG></STRONG></P>
<P> </P>
<BLOCKQUOTE>
<P class=font10 align=left><STRONG>摘 要</STRONG>:
串行通信是实现远程测控的重要手段。采用VHDL语言在CPLD上实现了串行通信,完全可以脱离单片机使用。</P>
<P class=font10 align=left><BR><STRONG>关键词</STRONG>:
CPLD;VHDL;串行通信<BR></P>
<P class=font10 align=left><STRONG>引言 </STRONG></P>
<P class=font10 align=left><SPAN
class=font10>随着EDA技术得发展,CPLD已经在许多方面得到了广泛应用,而串行通信是实现远程测控的重要手段。本文利用VHDL语言在CPLD上实现了串行通信,完全可以脱离单片机使用,克服了单片机的许多缺点。
</SPAN></P>
<P class=font10 align=left> </P>
<P class=font10 align=left><STRONG>串口结构及内容 </STRONG></P>
<P class=font10
align=left><BR>本设计所采用的是异步通信方式,可以规定传输的一个数据是10位,其中最低位为启动位(逻辑0低电平),最高位为停止位(逻辑1高电平),中间8位是数据位。为了方便对数据进行正确控制,选取发送(接受)每位数据用4个时钟周期。为了能够达到串行通信的波特率,例如4800B/s,则需把时钟频率设为19.2kHz。系统结构如图1所示:
</P>
<DIV class=font10 align=left>
<DIV align=center>
<P><BR><IMG height=438 src="用VHDL语言在CPLD上实现串行通信.files/1.jpg"
width=392></P>
<P>图1<BR></P></DIV></DIV>
<P class=font10 align=left><STRONG>系统原理 </STRONG></P>
<P class=font10
align=left><BR>首先介绍串行通信发送器的工作原理。6位计数器用于判断发送的数据是否发送完毕及在发送完毕后装入新的数据,其VHDL语言程序如下:</P>
<P class=font10 align=left><BR>process(carry) <BR>begin <BR>if
carry'event and carry='1'then <BR>if counter40="100111"then
<BR>load<='1'; <BR>counter40<="000000"; <BR>else
counter40<=counter40+1; <BR>load<='0'; <BR>end if; <BR>end if;
<BR>end process; </P>
<P class=font10
align=left><BR>由于本设计中选取一位数据4个时钟周期,因此当计数到“100111”时,表示10位数据发送完毕;此时将加载信号“load”置1,则向移位寄存器加载10位数据。此计数器的时钟信号由3位计数器的进位信号提供,3位计数器程序为如下:</P>
<P class=font10 align=left><BR>process(clk) <BR>begin <BR>if clk'event
and clk='1'then <BR>if counter4="0011"then <BR>counter4<="0000";
<BR>carry<='1'; <BR>else counter4<=counter4+1; <BR>carry<='0';
<BR>end if; <BR>end if; <BR>end process; </P>
<P class=font10
align=left><BR>当计数脉冲为3时,计数器清零并发出进位信号“carry”,“carry”既是6位计数器的时钟信号,又是移位寄存器的移位脉冲,移位寄存器实际上在发送器中是一个并串转换器,其程序为如下:</P>
<P class=font10 align=left><BR>process(load,carry) <BR>begin <BR>if
load='1'then <BR>reg10(9 downto 0)<=regin(9 downto 0); <BR>else
<BR>if carry'event and carry='1' then <BR>din<=reg10(0); <BR>reg10(8
downto 0)<=reg10(9 downto 1); <BR>end if; <BR>end if; <BR>end
process; </P>
<P class=font10
align=left><BR>当加载信号高有效时,10位数据从外部寄存器中并行载入REG10,载入