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

📄 serial interface4.htm

📁 一本介绍有关uart方面的电子书籍,对从事uart设计方面的技术人员是一本很好的参考书
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0045)http://www.fpga4fun.com/SerialInterface4.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>RS-232 receiver module</H4>Here's what we are trying to 
      build:<BR><BR><IMG 
      src="Serial Interface4.files/SerialRxDmodule.gif"><BR><BR>Our 
      implementation works like that: 
      <UL>
        <LI>The module assembles data from the RxD line as it comes. 
        <LI>Once a complete byte has been received, it goes on the "data" bus, 
        and "data_ready" is asserted for one clock. 
        <LI>After that one clock, "data" should not be relied on anymore (as new 
        data may come that shuffles it). </LI></UL>
      <H4>Oversampling</H4>An asynchronous receiver has to somehow get in-sync 
      on the incoming signal (it doesn't have access to the clock used during 
      transmission). 
      <UL>
        <LI>To determine when a new data is coming ("start" bit), we oversample 
        the signal at a multiple of the baud rate frequency. 
        <LI>Once the "start" bit is detected, we sample the line at the baud 
        rate to acquire the data bits. </LI></UL>Receivers typically oversample 
      the incoming signal at 16 times the baud rate. Here we use 8 times. At 
      115200 bauds, that gives a sampling rate of 921600Hz.<BR><BR>Let's assume 
      that we have a "Baud8Tick" signal available, asserted 921600 times a 
      second. 
      <H4>The design</H4>First, the incoming "RxD" signal has no relationship 
      with our clock.<BR>We use two D-flipflops to synchronize it. 
      <TABLE cellPadding=10>
        <TBODY>
        <TR>
          <TD bgColor=#d0d0f0><B>reg</B> [1:0] RxD_sync;<BR><B>always</B> 
            @(<B>posedge</B> clk) <B>if</B>(Baud8Tick) RxD_sync &lt;= 
            {RxD_sync_inv[0], RxD}; </TD></TR></TBODY></TABLE><BR>We filter the data, 
      so that short spikes on the RxD line aren't mistaken with start bits. 
      <TABLE cellPadding=10>
        <TBODY>
        <TR>
          <TD bgColor=#d0d0f0><B>reg</B> [1:0] RxD_cnt;<BR><B>reg</B> 
            RxD_bit;<BR><BR><B>always</B> @(<B>posedge</B> 
            clk)<BR><B>if</B>(Baud8Tick)<BR><B>begin</B><BR>&nbsp; 
            <B>if</B>(RxD_sync[1] &amp;&amp; RxD_cnt!=2'b11) RxD_cnt &lt;= 
            RxD_cnt + 1;<BR>&nbsp; <B>else</B> <BR>&nbsp; <B>if</B>(~RxD_sync[1] 
            &amp;&amp; RxD_cnt!=2'b00) RxD_cnt &lt;= RxD_cnt - 1;<BR><BR>&nbsp; 
            <B>if</B>(RxD_cnt==2'b00) RxD_bit &lt;= 0;<BR>&nbsp; 
            <B>else</B><BR>&nbsp; <B>if</B>(RxD_cnt==2'b11) RxD_bit &lt;= 
            1;<BR><B>end</B> </TD></TR></TBODY></TABLE><BR>A state machine allows us 
      to go through each bit received, once a "start" is detected. 
      <TABLE cellPadding=10>
        <TBODY>
        <TR>
          <TD bgColor=#d0d0f0><B>reg</B> [3:0] state;<BR><BR><B>always</B> 
            @(<B>posedge</B> 
            clk)<BR><B>if</B>(Baud8Tick)<BR><B>case</B>(state)<BR>&nbsp; 
            4'b0000: <B>if</B>(~RxD_bit) state &lt;= 4'b1000; // start bit 
            found?<BR>&nbsp; 4'b1000: <B>if</B>(next_bit) state &lt;= 4'b1001; 
            // bit 0<BR>&nbsp; 4'b1001: <B>if</B>(next_bit) state &lt;= 4'b1010; 
            // bit 1<BR>&nbsp; 4'b1010: <B>if</B>(next_bit) state &lt;= 4'b1011; 
            // bit 2<BR>&nbsp; 4'b1011: <B>if</B>(next_bit) state &lt;= 4'b1100; 
            // bit 3<BR>&nbsp; 4'b1100: <B>if</B>(next_bit) state &lt;= 4'b1101; 
            // bit 4<BR>&nbsp; 4'b1101: <B>if</B>(next_bit) state &lt;= 4'b1110; 
            // bit 5<BR>&nbsp; 4'b1110: <B>if</B>(next_bit) state &lt;= 4'b1111; 
            // bit 6<BR>&nbsp; 4'b1111: <B>if</B>(next_bit) state &lt;= 4'b0001; 
            // bit 7<BR>&nbsp; 4'b0001: <B>if</B>(next_bit) state &lt;= 4'b0000; 
            // stop bit<BR>&nbsp; default: state &lt;= 
            4'b0000;<BR><B>endcase</B> </TD></TR></TBODY></TABLE><BR>Notice that we 
      used a "next_bit" signal, to go from bit to bit. 
      <TABLE cellPadding=10>
        <TBODY>
        <TR>
          <TD bgColor=#d0d0f0><B>reg</B> [2:0] 
            bit_spacing;<BR><BR><B>always</B> @(<B>posedge</B> 
            clk)<BR><B>if</B>(state==0)<BR>&nbsp; bit_spacing &lt;= 
            0;<BR><B>else</B><BR><B>if</B>(Baud8Tick)<BR>&nbsp; bit_spacing 
            &lt;= bit_spacing + 1;<BR><BR><B>wire</B> next_bit = 
            (bit_spacing==7); </TD></TR></TBODY></TABLE><BR>Finally a shift register 
      collects the data bits as they come. 
      <TABLE cellPadding=10>
        <TBODY>
        <TR>
          <TD bgColor=#d0d0f0><B>reg</B> [7:0] RxD_data;<BR><B>always</B> 
            @(<B>posedge</B> clk) <B>if</B>(Baud8Tick &amp;&amp; next_bit 
            &amp;&amp; state[3]) RxD_data &lt;= {RxD_bit, RxD_data[7:1]}; 
        </TD></TR></TBODY></TABLE><BR>That's it! The complete code can be found <A 
      href="http://www.fpga4fun.com/files/async.zip">here</A>.<BR>It has a few 
      improvements; follow the comments in the code. 
      <H4>Links</H4>
      <UL>
        <LI>More details on <A 
        href="http://www.erg.abdn.ac.uk/users/gorry/course/phy-pages/async.html">Asynchronous 
        Communication</A> </LI></UL><BR><BR><A 
      href="http://www.fpga4fun.com/SerialInterface5.html"><FONT color=blue 
      size=2>&gt;&gt;&gt; NEXT: How to use the Transmitter and Receiver modules 
      &gt;&gt;&gt;</FONT></A><BR><BR><BR>
      <HR>
      This page was last updated on May 10 
2004.<BR><BR></TD></TR></TBODY></TABLE></BODY></HTML>

⌨️ 快捷键说明

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