实现单片机与FPGA的双向并口通信

发布者:czm721002最新更新时间:2015-10-08 来源: eefocus关键字:单片机  FPGA  双向并口通信 手机看文章 扫描二维码
随时随地手机看文章
    现在一般流行的做法都是用串行通信的,那样能够节省I/O口的。但是有的时候在端口不紧缺的时候可以考虑用并行的方法来进行设置。

    这个暑假我在进行电子竞赛的培训,对于这个问题找到了一些相关的资料,可以提供一些帮助。

    如果是这方面的高手的话,其实会发现这个原理很简单,只要理解一些I/O口的设置就能完成了。但是如果对于单片机或者FPGA的I/O口的电路不理解的话可能就会走许多的歪路了。

    闲话少说,进入正题。

    首先,还是要理解所谓的推挽输出与漏极输出两者的区别。先说说漏极开路(OD),它与集电极开路(OC)是一致的,就是把下图的三极管改成CMOS管就是了。

 

  [转载][原创]实现单片机与FPGA的双向并口通信

 

    集电极开路(OC)输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做集电极开路(左边的三极管为反相之用,使输入为“0”时,输出也为“0”)。对于图1,当左端的输入为“0”时,前面的三极管截止(即集电极C跟发射极E之间相当于断开),所以5V电源通过1K电阻加到右边的三极管上,右边的三极管导通(即相当于一个开关闭合);当左端的输入为“1”时,前面的三极管导通,而后面的三极管截止(相当于开关断开)。

   为了方便理解,我们把上面的图1改写成图2的样子。

                          [转载][原创]实现单片机与FPGA的双向并口通信

图2中的开关受软件控制,“1”时断开,“0”时闭合。很明显可以看出,当开关闭合时,输出直接接地,所以输出电平为0。而当开关断开时,则输出端悬空了,即高阻态。这时电平状态未知,如果后面一个电阻负载(即使很轻的负载)到地,那么输出端的电平就被这个负载拉到低电平了,所以这个电路是不能输出高电平的。也就是说这个输出端的电平是受负载的影响的。这样是很不稳定的,要避免这种情况。最多的就是使用上拉电阻。

                         [转载][原创]实现单片机与FPGA的双向并口通信

 

  

    再看图三。图三中那个1K的电阻即是上拉电阻。如果开关闭合,则有电流从1K电阻及开关上流过,但由于开关闭和时电阻为0(方便我们的讨论,实际情况中开关电阻不为0,另外对于三极管还存在饱和压降),所以在开关上的电压为0,即输出电平为0。如果开关断开,则由于开关电阻为无穷大(同上,不考虑实际中的漏电流),所以流过的电流为0,因此在1K电阻上的压降也为0,所以输出端的电压就是5V了,这样就能输出高电平了。但是这个输出的内阻是比较大的(即1KΩ),如果接一个电阻为R的负载,通过分压计算,就可以算得最后的输出电压为5*R/(R+1000)伏,即5/(1+1000/R)伏。所以,如果要达到一定的电压的话,R就不能太小。如果R真的太小,而导致输出电压不够的话,那我们只有通过减小那个1K的上拉电阻来增加驱动能力(所谓的驱动力,往往与电流有关的)。但是,上拉电阻又不能取得太小,因为当开关闭合时,将产生电流,由于开关能流过的电流是有限的,因此限制了上拉电阻的取值,另外还需要考虑到,当输出低电平时,负载可能还会给提供一部分电流从开关流过,因此要综合这些电流考虑来选择合适的上拉电阻。

P.S:说到OC门的话,大家都能想到三态门,那么就不得不提起它的“线与”功能了,这个功能是很方便的。操作上面也很简单。如下附图:

                 [转载][原创]实现单片机与FPGA的双向并口通信

   另一种输出结构是推挽输出。推挽输出的结构就是把上面的上拉电阻也换成一个开关,当要输出高电平时,上面的开关通,下面的开关断;而要输出低电平时,则刚好相反。比起OC或者OD来说,这样的推挽结构高、低电平驱动能力都很强。如果两个输出不同电平的输出口接在一起的话,就会产生很大的电流,有可能将输出口烧坏。而上面说的OC或OD输出则不会有这样的情况,因为上拉电阻提供的电流比较小。如果是推挽输出的要设置为高阻态时,则两个开关必须同时断开(或者在输出口上使用一个传输门),这样可作为输入状态,有些单片机的一些IO口就是这种结构。

 总结:从上面也可以知道了,I/0输出有两种方式。那么现在的难点就是如何让I/0口输入数据。其实上面已经讲过了,就是只需要把输出设置为高阻状态就可以了。那么有些新人就会问了,都设成高阻状态了,数据还怎么输入啊?这其实是一个误区,其根本是没有理解I/O口的结构。

   如果我们将一个读数据用的输入端接在输出端(这就是上面疑惑的答案了),这样就是一个IO口了(51的IO口就是这样的结构,其中P0口内部不带上拉,而其它三个口带内部上拉),如图4所示。当我们要使用输入功能时,只要将输出口设置为1即可,也就是要把下面的z=1,这样就相当于那个开关断开,而对于P0口来说,就是高阻态了。

  [转载][原创]实现单片机与FPGA的双向并口通信

     到现在为止,已经把输入输出端口原理已经讲明了了。如果理解了上面所讲的,那么写程序也就是的把对应的端口进行设置就OK了,比较简单的。如果不明白,可以问我,QQ或者邮件都可以,最后我会留下联系方式的。[page]

     那么下面我们开始讲解一下相应的程序语言吧。我用的单片机芯片是加强型的51单片机C8051F020,它都外扩了一些功能,如AD、DA、温度传感器,但是核心还是没有改变的。要与FPGA进行通信,我用Quartus II的VHDL语言进行编程。也就是说,单片机与FPGA都要进行相应的端口设置。

     先讲解一下FPGA方面的编程,如图5,这是在Quartus II界面里的图形

                       [转载][原创]实现单片机与FPGA的双向并口通信

其中端口含义如下:in_num[15..0]——代表要从FPGA向单片机传输的数据总线

                  out_num[15..0]——代表要从单片机传送给FPGA的数据总线,它与in_num[15..0]在直
                                    接与其它的端口(软件界面里面)直接与其它端口连接

                  Mcu[15..0]——代表硬件上要与单片机连接的端口。

                  clk---则是时钟信号,

                  en--使能信号,当它为高的时候,则单片机向FPGA传输数据,否则传输方向相反。

   对应的VHDL放言如下:

library ieee;
use ieee.std_logic_1164.all;

entity interface2 is
 port(Mcu:inout std_logic_vector(15 downto 0);                  

      in_num:in std_logic_vector(15 downto 0);               

      out_Num:out std_logic_vector(15 downto 0);                   

      clk:in std_logic;
      en:in std_logic);
end interface2;

architecture rtl of interface2 is
    signal a,b:std_logic_vector(15 downto 0);
begin
   common: process(clk)
   begin
     if(clk'event and clk='1')then
        a<=in_num;
        out_num<=b;
      end if;
     end process;

   Wri_Read:process(en,Mcu)
    begin
      if(en='1')then                                  

           Mcu<=(others=>'Z');                          --

          b<=Mcu;                                 
       else
          Mcu<=a;                                    --当en='0'的时候,就作为输出端口
       end if;
   end process;
  end rtl;

 

这里有几个注意点:一、首先最好只用一个双向口,也就是我这里的Mcu[15..0],另外一个“双向口”则等效成一个输入口与一个输出口,也就是这里in_num[15..0]与out_num[15..0].否则会有麻烦的。 因为如果不这么做,那么在Quartus里面与这个双向口相连的端口必须都要设成双向口,这样的话,嘿嘿...       

二、与那个Mcu[15..0]相联系的端口必须是双向口的,具体图解如下。

[转载][原创]实现单片机与FPGA的双向并口通信

 

[转载][原创]实现单片机与FPGA的双向并口通信

 

   最后,进行单片机方面的设置了,其中最重要的就是端口初始化了。如下:

//这个是FPGA要求的,当从FPGA里读取数据时所要满足的条件
//众所周知,在双向口的设置中,对于端口的输入与输出的设置是最重要的
//输入时一定要记得把双向口的输出设置为高阻状态,在单片机中要记得设置为漏极开路
//当输出要记得把单片机设置为推挽输出,否则设置为漏极开路的话是达不到效果 的
void  ReadData(void)
{
     en=0;                       //这部分要与fpga联合起来设置     P1MDOUT=0x00;               //此时单片机设置为漏极开路,在对端口写1时才能呈现高阻状态
  P74OUT=0x00;                //这里我用的单片机是用P1口与P4口用来传输数据的
  P1=0xff;                    //对应端口写1,设置成高阻状态
  P4=0xff;                    //对应端口写1,设置成高阻状态
}

//这个也是FPGA要求的,当往FPGA里写入数据时所要满足的条件
void  WriteData(void)
{
     en=1;                       //当en=1时,我要向fpga里面写数据了,
     P1MDOUT=0xff;               //写数据的时候,别忘记把对应的端口改成用推挽方式
  P74OUT=0x03;                //不用的引脚设成漏极开路的状态.当输出的方式时才把它设为推挽输出
}

 

 

好了,到现在为止,我已经把我知道都写在这里了。如果认为我这篇文章对你有帮助的话,还请多多支持。回贴是一种美德。

关键字:单片机  FPGA  双向并口通信 引用地址:实现单片机与FPGA的双向并口通信

上一篇:单片机编程语言
下一篇:单片机问题思考

推荐阅读最新更新时间:2024-03-16 14:34

51单片机的边沿触发及电平触发简介及测量
51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。 这个原理很好理解。但应用时需要特别注意的几点: 1)电平触发方式时,中断标志寄存器不锁存中断请求信号。也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要使电平触发的中断被CPU响应并执行,必须保证外
[单片机]
51<font color='red'>单片机</font>的边沿触发及电平触发简介及测量
PIC单片机利用视觉暂留现象显示字符
Persistance of Vision (PoV), 即视觉暂留现象, 人眼在观察景物时,光信号传人大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称 后像 ,视觉的这一现象则被称为 视觉暂留 。其具体应用是电影的拍摄和放映。原因是由视神经的反应速度造成的.其时值是二十四分之一秒。是动画、电影等视觉媒体形成和传播的根据。 利用PoV,还可以制作电子小玩意,比如利用几个LED,就能显示图案,字符等。 下面是一个利用PoV显示时钟的例子: 下面是一段利用PoV显示字符的PIC单片机程序,利用CCS C编译器编译: 主程序文件: pov.c #fuses HS,NO
[单片机]
PIC<font color='red'>单片机</font>利用视觉暂留现象显示字符
单片机复位标志位的设置与应用研究
引言 设置复位标志位便于区分不同原因引发的复位,作为一种新技术被越来越多的新型单片机所采纳。例如Philips公司的P87LPC700和 P89LPC900系列、Freescale公司(原Motorola半导体部)的MC68HC05系列和MC68HC08系列、Sunplus公司的 SPMC65系列、Microchip公司的PIC系列等,内部都设计了专门用于记录各种复位标志的状态寄存器。 MC68HC08系列有一个复位状态寄存器,负责记录6种复位标志位:上电复位、引脚复位、看门狗复位、非法指令复位、非法地址复位和欠压复位。SPMC65系列有一个系统控制寄存器,负责记录5种复位标志位:上电复位、外部复位、看门狗复位、非法地址复位和
[单片机]
基于单片机的多功能智能机器人设计
0 引言 随着控制技术、计算机技术、信息处理技术和传感器技术的发展,智能机器人无论是在工业领域还是消费电子领域都已经扮演了非常重要的角色,已成为人工智能研究和发展的热点之一。在语音控制机器人领域,有研究表明已成功地将连续隐马尔可夫模型(CHMM,Centrifugal Pump based onContinuous Hidden Markov Model)模型应用于定点数字信号处理器(DSP, Digital Signal Processor)上,并实现了对机器人的语音控制。关于传感测距方面,使用多传感器快速测量智能机器人与障碍物之间距离的方法,使机器人不仅具备语音识别功能,而且能实现智能避障。而关于家用室内机器人的应用也有相关
[单片机]
基于<font color='red'>单片机</font>的多功能智能机器人设计
高安全性与国产化双重突破:云途引领中国车规MCU领域创新
· 云途发布高端车规MCU芯片YTM32B1H系列,具有高安全高稳定特性,满足ASIL-D认证标准。 · 云途“通用MCU/ZCU+专用SoC+高性能处理芯片HPU”三大产品矩阵,覆盖整车五大域90%应用。 · 云途加入中国汽车芯片产业创新战略联盟,积极推动车规MCU国产化进程。 2023年8月8日,苏州云途半导体有限公司(以下简称“云途半导体”)发布了最新一代域控制器芯片YTM32B1H系列,覆盖汽车动力、智能底盘、功能安全控制器、域控制器等应用领域,目前已经面向目标客户提供样片及开发板。 云途YTM32B1H系列产品的量产标志着云途半导体在高安全性、高可靠性、高一致性的MCU产品研发上又完成了里程碑式的一步。Y
[汽车电子]
高安全性与国产化双重突破:云途引领中国车规<font color='red'>MCU</font>领域创新
第17章 A/D和D/A的学习
从我们学到的知识了解到,我们的单片机是一个典型的数字系统。数字系统只能对输入的数字信号进行处理,其输出信号也是数字信号。但是在工业检测系统和日常生活中的许多物理量都是模拟量,比如温度、长度、压力、速度等等,这些模拟量可以通过传感器变成与之对应的电压、电流等电模拟量。为了实现数字系统对这些电模拟量的检测、运算和控制,就需要一个模拟量和数字量之间相互转换的过程。这节课我们就要学习这个相互转换过程。 17.1 A/D和D/A的基本概念 A/D是模拟量到数字量的转换,依靠的是模数转换器(Analog to Digital Converter),简称ADC;D/A是数字量到模拟量的转换,依靠的是数模转换器(Digital to Analo
[单片机]
第17章 A/D和D/A的学习
单片机学习之C语言点亮控制led灯
C语言是学习单片机的过程中必须要经历的一个环节,但是并不是说学习单片机C语言就要像C语言开发程序员一样要掌握C语言的全部,因此我们只要掌握C语言中可以操作单片机的那一部分就可以了,今天我们要说的就是C语言我们该如何来点亮并控制led灯。 首先来给你大家上电路图,相信大部分同学都可以看懂,如果看不懂的也没关系,因为篇幅有限就不给大家长篇大论了,相信大部分人也看不下去,所以下边还会为大家提供一个C语言点亮控制led灯的配套的视频资料,代码以及如何设计和工作原理在下边为大家提供的视频资料中会给大家一一解释清楚。 看完电路图我们看一小段代码其实很简单,正所谓难者不会会者不难,代码不全部贴出来了,只看片段代码越看越懵,详细代码看看视频
[单片机]
<font color='red'>单片机</font>学习之C语言点亮控制led灯
使用单片机设计抢答器的资料和程序概述
在知识比赛中, 特别是做抢答题目的时候, 在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。如果在抢答中,靠视觉是很难判断出哪组先答题。利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。本文主要介绍了单片机抢答器设计及工作原理,以及它的实际用途。 ! 系统工作原理本系统采用8051单片机作为核心。控制系统的四个模块分别为:存储模块、显示模块、语音模块、抢答开关模块。该抢答器系统通过开关电路四个按键输入抢答信号;利用语音芯片ISD1420 完成语音的录放功能; 利用存储程序; 利用一个数码管来完成显示功能。工作时,用按键通过开关电路输入各路的抢答信号
[单片机]
使用<font color='red'>单片机</font>设计抢答器的资料和程序概述
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved