⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial interface2.htm

📁 一本介绍有关uart方面的电子书籍,对从事uart设计方面的技术人员是一本很好的参考书
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0045)http://www.fpga4fun.com/SerialInterface2.html -->
<HTML><HEAD><TITLE>FPGAs are fun!</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<STYLE>BODY {
	FONT-FAMILY: Verdana,Tahoma,Arial; FONT-SIZE: 10px
}
A {
	FONT-FAMILY: Verdana,Tahoma,Arial; FONT-SIZE: 10px
}
P {
	FONT-FAMILY: Verdana,Tahoma,Arial; FONT-SIZE: 10px
}
DIV {
	FONT-FAMILY: Verdana,Tahoma,Arial; FONT-SIZE: 10px
}
HR {
	FONT-FAMILY: Verdana,Tahoma,Arial; FONT-SIZE: 10px
}
UL {
	FONT-FAMILY: Verdana,Tahoma,Arial; FONT-SIZE: 10px
}
TD {
	FONT-FAMILY: Verdana,Tahoma,Arial; FONT-SIZE: 10px
}
TH {
	FONT-FAMILY: Verdana,Tahoma,Arial; FONT-SIZE: 10px
}
DD {
	FONT-FAMILY: Verdana,Tahoma,Arial; FONT-SIZE: 10px
}
DT {
	FONT-FAMILY: Verdana,Tahoma,Arial; FONT-SIZE: 10px
}
PRE {
	FONT-FAMILY: Verdana,Tahoma,Arial; FONT-SIZE: 10px
}
CAPTION {
	FONT-FAMILY: Verdana,Tahoma,Arial; FONT-SIZE: 10px
}
A {
	COLOR: black; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
A:hover {
	TEXT-DECORATION: underline
}
.link {
	COLOR: #000000
}
.link:hover {
	COLOR: blue; TEXT-DECORATION: underline
}
PRE {
	BACKGROUND: #d0d0f0; MARGIN: 5px; PADDING-BOTTOM: 5px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; PADDING-TOP: 5px
}
</STYLE>

<META content="MSHTML 5.00.3315.2870" name=GENERATOR></HEAD>
<BODY leftMargin=0 rightMargin=0 topMargin=0 marginheight="0" marginwidth="0">
<TABLE border=0 cellPadding=2 cellSpacing=5 width="100%" nowrap>
  <TBODY>
  <TR>
    <TD bgColor=#9090c0 vAlign=top><FONT size=40>fpga4fun.com</FONT> - where 
      FPGAs are fun<BR><BR></TD></TR>
  <TR>
    <TD bgColor=white height=1></TD></TR>
  <TR>
    <TD bgColor=black height=1></TD></TR></TBODY></TABLE>
<TABLE cellPadding=5 cellSpacing=5 height="100%">
  <TBODY>
  <TR>
    <TD bgColor=#dddddd vAlign=top width=140><FONT color=#9090c0><B>Home<BR><A 
      class=link href="http://www.fpga4fun.com/">FPGAs are fun!</A><BR><A 
      class=link href="http://www.fpga4fun.com/WhyThisSite.html">Why this 
      site?</A><BR><BR>FPGA Boards<BR><A class=link 
      href="http://www.fpga4fun.com/board.html">Overview</A><BR><A class=link 
      href="http://www.fpga4fun.com/board_pluto.html">Pluto board</A><BR><A 
      class=link href="http://www.fpga4fun.com/board_pluto-II.html">Pluto-II 
      board</A><BR><A class=link 
      href="http://www.fpga4fun.com/board_dragon.html">Dragon board</A><BR><A 
      class=link href="http://www.fpga4fun.com/board_TXDI.html">TXDI serial 
      interface</A><BR><A class=link 
      href="http://www.fpga4fun.com/board_flashy.html">Flashy fast 
      ADC</A><BR><BR>FPGA projects<BR><A class=link 
      href="http://www.fpga4fun.com/RCServos.html">R/C servos</A><BR><A 
      class=link href="http://www.fpga4fun.com/SerialInterface.html">Serial 
      interface</A><BR><A class=link 
      href="http://www.fpga4fun.com/TextLCDmodule.html">Text LCD 
      module</A><BR><A class=link 
      href="http://www.fpga4fun.com/MusicBox.html">Music box</A><BR><A 
      class=link href="http://www.fpga4fun.com/PWM_DAC.html">PWM and one-bit 
      DAC</A><BR><A class=link 
      href="http://www.fpga4fun.com/QuadratureDecoder.html">Quadrature 
      decoder</A><BR><A class=link 
      href="http://www.fpga4fun.com/PongGame.html">Pong game</A><BR><A 
      class=link href="http://www.fpga4fun.com/GraphicLCDpanel.html">Graphic LCD 
      panel</A><BR><BR>Advanced projects<BR><A class=link 
      href="http://www.fpga4fun.com/digitalscope.html">Digital 
      oscilloscope</A><BR><A class=link 
      href="http://www.fpga4fun.com/10BASE-T.html">10BASE-T interface</A><BR><A 
      class=link href="http://www.fpga4fun.com/PCI.html">PCI 
      interface</A><BR><BR>FPGAs<BR><A class=link 
      href="http://www.fpga4fun.com/WhatAreFPGAs.html">What are FPGAs</A><BR><A 
      class=link href="http://www.fpga4fun.com/HowFPGAsWork.html">How FPGAs 
      work</A><BR><A class=link 
      href="http://www.fpga4fun.com/clocks.html">Clocks and global 
      lines</A><BR><A class=link 
      href="http://www.fpga4fun.com/DownloadCables.html">Download 
      cables</A><BR><A class=link 
      href="http://www.fpga4fun.com/configuration.html">Configuration</A><BR><A 
      class=link href="http://www.fpga4fun.com/LearnMore.html">Learn 
      more</A><BR><BR>FPGA electronic<BR><A class=link 
      href="http://www.fpga4fun.com/SMD.html">SMD technology</A><BR><A 
      class=link href="http://www.fpga4fun.com/oscillators.html">Crystals and 
      oscillators</A><BR><BR>FPGA software<BR><A class=link 
      href="http://www.fpga4fun.com/designsoftware.html">Design 
      software</A><BR><A class=link 
      href="http://www.fpga4fun.com/pinassignment.html">Pin assignment</A><BR><A 
      class=link 
      href="http://www.fpga4fun.com/designentry.html">Design-entry/HDL</A><BR><A 
      class=link 
      href="http://www.fpga4fun.com/simulation.html">Simulation/HDL</A><BR><A 
      class=link href="http://www.fpga4fun.com/synthesis&amp;pnr.html">Synthesis 
      and P&amp;R</A><BR><BR>Quick-start guides<BR><A class=link 
      href="http://www.fpga4fun.com/ISEQuickStart.html">ISE</A><BR><A class=link 
      href="http://www.fpga4fun.com/QuartusQuickStart.html">Quartus</A><BR><BR>HDL 
      Tips &amp; Tricks<BR><A class=link 
      href="http://www.fpga4fun.com/VerilogTips.html">Verilog tips</A><BR><A 
      class=link href="http://www.fpga4fun.com/VHDLTips.html">VHDL 
      tips</A><BR><BR>Site<BR><A class=link 
      href="http://www.fpga4fun.com/WhoAmI.html">Who am I?</A><BR><A class=link 
      href="http://www.fpga4fun.com/forum">Forum</A><BR><A class=link 
      href="http://www.fpga4fun.com/shop.html">Shop</A><BR><A class=link 
      href="http://www.fpga4fun.com/links.html">Links</A><BR></B></FONT><BR><BR></TD>
    <TD vAlign=top>
      <H4>Baud generator</H4>Here we want to use the serial link at maximum 
      speed, i.e. 115200 bauds. Other slower speeds would also be easy to 
      generate.<BR><BR>FPGAs usually run at speed well above 115200Hz (RS-232 is 
      pretty slow by today's standards). That means we use a high-speed clock 
      and divide it down to generate a "tick" as close as possible to 115200 
      times a second. 
      <H4>Synchronous tick from a 1.8432MHz clock</H4>Traditionally, RS-232 
      chips use a 1.8432MHz clock, because that makes generating the standard 
      baud frequencies very easy. So let's assume we have a 1.8432MHz clock 
      available.<BR><BR>1.8432MHz divided by 16 gives 115200Hz, what a 
      coincidence!<BR><BR>
      <TABLE cellPadding=10>
        <TBODY>
        <TR>
          <TD bgColor=#d0d0f0><B>reg</B> [3:0] BaudDivCnt;<BR><B>always</B> 
            @(<B>posedge</B> clk) BaudDivCnt &lt;= BaudDivCnt + 
            1;<BR><BR><B>wire</B> BaudTick = (BaudDivCnt==15); 
      </TD></TR></TBODY></TABLE><BR>So "BaudTick" is asserted once every 16 
      clocks, i.e. 115200 times a second when using a 1.8432MHz clock. 
      <H4>Synchronous tick from any frequency</H4>The earlier generator was 
      assuming the use of a 1.8432MHz clock. But what do you do if all your have 
      is, say, a 2MHz clock? To generate 115200Hz from a 2MHz clock, you divide 
      the clock by "17.361111111..." Not exactly a round number. The solution is 
      to divide sometimes by 17, sometimes by 18, making sure the ratio stays 
      "17.361111111". That's actually easy to do.<BR><BR>Look at the following 
      "C" code:<BR>
      <TABLE cellPadding=10>
        <TBODY>
        <TR>
          <TD bgColor=#d0d0f0>while(1) // repeat forever<BR>{<BR>&nbsp; acc += 
            115200;<BR>&nbsp; if(acc&gt;=2000000) printf("*"); else printf(" 
            ");<BR><BR>&nbsp; acc %= 
      2000000;<BR>}<BR></TD></TR></TBODY></TABLE><BR>That prints the "*" in the 
      exact ratio, once every "17.361111111..." loops on average.<BR><BR>To 
      obtain the same thing efficiently in an FPGA, we rely on the fact that the 
      serial interface can tolerate a few % of error in the baud frequency 
      generator. It really won't matter if we use "17.3" or "17.4". 
      <H4>FPGA baud generator</H4>It is desirable that the 2000000 be a power of 
      two. Obviously 2000000 is not a power of two. So we change the ratio. 
      Instead of the ratio "2000000/115200", let's use "1024/59" = 17.356. 
      That's very close to our ideal ratio, and makes an efficient FPGA 
      implementation.<BR><BR>
      <TABLE cellPadding=10>
        <TBODY>
        <TR>
          <TD bgColor=#d0d0f0>// 10 bits for the accumulator ([9:0]), and one 
            extra bit for the accumulator carry-out ([10])<BR><B>reg</B> [10:0] 
            acc; &nbsp; // 11 bits total!<BR><BR><B>always</B> @(<B>posedge</B> 
            clk)<BR>&nbsp; acc &lt;= acc[9:0] + 59; // use only 10 bits from the 
            previous result, but save the full 11 bits<BR><BR><B>wire</B> 
            BaudTick = acc[10]; // so that the 11th bit is the carry-out 
        </TD></TR></TBODY></TABLE><BR>Using out 2MHz clock, "BaudTick" is asserted 
      115234 times a second, a 0.03% error from the ideal 115200. 
      <H4>Parameterized FPGA baud generator</H4>The previous design was using a 
      10 bits accumulator, but as the clock frequency increases, more bits are 
      required.<BR><BR>Here's a design with a 25MHz clock and a 16 bits 
      accumulator. The design is parameterized, so easy to customize.<BR><BR>
      <TABLE cellPadding=10>
        <TBODY>
        <TR>
          <TD bgColor=#d0d0f0><B>parameter</B> ClkFrequency = 25000000; // 
            25MHz<BR><B>parameter</B> Baud = 115200;<BR><B>parameter</B> 
            BaudGeneratorAccWidth = 16;<BR><B>parameter</B> BaudGeneratorInc = 
            (Baud&lt;&lt;BaudGeneratorAccWidth)/ClkFrequency;<BR><BR><B>reg</B> 
            [BaudGeneratorAccWidth:0] BaudGeneratorAcc;<BR><B>always</B> 
            @(<B>posedge</B> clk)<BR>&nbsp; BaudGeneratorAcc &lt;= 
            BaudGeneratorAcc[BaudGeneratorAccWidth-1:0] + 
            BaudGeneratorInc;<BR><BR><B>wire</B> BaudTick = 
            BaudGeneratorAcc[BaudGeneratorAccWidth]; </TD></TR></TBODY></TABLE><BR>One 
      last implementation issue: the "BaudGeneratorInc" calculation is wrong, 
      due to the fact that Verilog uses 32 bits intermediate results, and the 
      calculation exceeds that. Change the line as follow for a 
      workaround.<BR><BR>
      <TABLE cellPadding=10>
        <TBODY>
        <TR>
          <TD bgColor=#d0d0f0><B>parameter</B> BaudGeneratorInc = 
            ((Baud&lt;&lt;(BaudGeneratorAccWidth-4))+(ClkFrequency&gt;&gt;5))/(ClkFrequency&gt;&gt;4); 
          </TD></TR></TBODY></TABLE><BR>This line has also the added advantage to 
      round the result instead of truncating.<BR><BR>That's it.<BR>Now that we 
      have a precise enough Baud generator, we can go ahead with the RS-232 
      transmitter and receiver modules. <BR><BR><A 
      href="http://www.fpga4fun.com/SerialInterface3.html"><FONT color=blue 
      size=2>&gt;&gt;&gt; NEXT: RS-232 transmitter module 
      &gt;&gt;&gt;</FONT></A><BR><BR><BR>
      <HR>
      This page was last updated on May 22 
2004.<BR><BR></TD></TR></TBODY></TABLE></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -