FPGA和单片机的串行通信接口设计

发布者:心怀梦想最新更新时间:2010-06-21 关键字:FPGA  串口通信  单片机  VHDL语言 手机看文章 扫描二维码
随时随地手机看文章

1 前言

    现场可编程逻辑器件(FPGA)在高速采集系统中的应用越来越广,由于FPGA对采集到的数据的处理能力比较差,故需要将其采集到的数据送到其他CPU系统来实现数据的处理功能,这就使FPGA系统与其他CPU系统之间的数据通信提到日程上,得到人们的急切关注。本文介绍利用VHDL语言实现 FPGA与单片机的串口异步通信电路。

    整个设计采用模块化的设计思想,可分为四个模块:FPGA数据发送模块,FPGA波特率发生控制模块,FPGA总体接口模块以及单片机数据接收模块。本文着重对FPGA数据发送模块实现进行说明。

2  FPGA数据发送模块的设计

    根据RS232 异步串行通信来的帧格式,在FPGA发送模块中采用的每一帧格式为:1位开始位+8位数据位+1位奇校验位+1位停止位,波特率为2400。本系统设计的是将一个16位的数据封装成高位帧和低位帧两个帧进行发送,先发送低位帧,再发送高位帧,在传输数据时,加上文件头和数据长度,文件头用555555来表示,只有单片机收到555555时,才将下面传输的数据长度和数据位进行接收,并进行奇校验位的检验,正确就对收到的数据进行存储处理功能,数据长度可以根据需要任意改变。由设置的波特率可以算出分频系数,具体算法为分频系数X=CLK/(BOUND*2)。可由此式算出所需的任意波特率。下面是实现上述功能的VHDL源程序。

Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity atel2_bin is
port( txclk: in std_logic;                      --2400Hz的波特率时钟
      reset: in std_logic;                      --复位信号
        din: in std_logic_vector(15 downto 0);  --发送的数据
      start: in std_logic;                      --允许传输信号
       sout: out std_logic                      --串行输出端口
          );
end atel2_bin;
architecture behav of atel2_bin is
signal thr,len: std_logic_vector(15 downto 0);
signal txcnt_r: std_logic_vector(2 downto 0);
signal sout1: std_logic;
signal cou: integer:=0;
signal oddb:std_logic;
type s is(start1,start2,shift1,shift2,odd1,odd2,stop1,stop2);
signal state:s:=start1;  
begin
  process(txclk)     
    begin
      if rising_edge(txclk) then
           if cou<3 then thr<="0000000001010101";       --发送的文件头
            elsif cou=3 then
            thr<="0000000000000010";                --发送的文件长度
            elsif (cou>3 and state=stop2) then thr<=din;--发送的数据
            end if;  
      end if;
  end process;
  process(reset,txclk)
  variable tsr,tsr1,oddb1,oddb2: std_logic_vector(7 downto 0);
   begin
         if reset='1' then
            txcnt_r<=(others=>'0');
                 sout1<='1';
                    state<=start1;                    
                       cou<=0;
         elsif txclk'event and txclk='1' then                 
         case state is
         when start1=>
              if start='1' then            
                 if cou=3 then
                    len<=thr;
                 end if;
                 tsr:=thr(7 downto 0);
     oddb1:=thr(7 downto 0); 
                 sout1<='0'; --起始位 
                 txcnt_r<=(others=>'0');   
                 state<=shift1;
              else
                 state<=start1;
              end if;
         when shift1=>
              oddb<=oddb1(7) xor oddb1(6) xor oddb1(5) xor oddb1(4) xor oddb1(3) xor oddb1(2) xor oddb1(1) xor oddb1(0);
              sout1<=tsr(0); --数据位
              tsr(6 downto 0):=tsr(7 downto 1);
              tsr(7):='0';
              txcnt_r<=txcnt_r+1;
              if (txcnt_r=7) then
                 state<=odd1;cou<=cou+1;
              end if;
         when odd1=>         --奇校验位
              if oddb='1' then
                 sout1<='0';state<=stop1;
              else
                 sout1<='1';state<=stop1;
              end if;
         when stop1=>
              sout1<='1';    --停止位
              if cou<4 then
                 state<=start1;
              else
                 state<=start2;                             
              end if;
         when start2=>
              tsr1:=thr(15 downto 8);
     oddb2:=thr(15 downto 8); 
              sout1<='0';    --起始位  
              txcnt_r<=(others=>'0'); 
              state<=shift2;
         when shift2=>
              oddb<=oddb2(7) xor oddb2(6) xor oddb2(5) xor oddb2(4) xor oddb2(3) xor oddb2(2) xor oddb2(1) xor oddb2(0);
              sout1<=tsr1(0);--数据位
              tsr1(6 downto 0):=tsr1(7 downto 1);
              tsr1(7):='0';
              txcnt_r<=txcnt_r+1; 
              if (txcnt_r=7) then
                 state<=odd2;               
              end if;
         when odd2=>       --奇校验位

              if oddb='1' then
                 sout1<='0';state<=stop2;
              else
                 sout1<='1';state<=stop2;
              end if;
         when stop2=>  
              sout1<='1';    --停止位    
              if len="0000000000000000" then
                 state<=stop2;                 
              else
                 state<=start1;               
                 len<=len-1;
              end if;                        
         end case;
         end if;                
   end process; 
  sout<=sout1;
end behav;

其中各信号的说明已在程序中标明了。波形仿真图如图2所示。

 
图2  FPGA数据发送时序仿真图

    图中Din写入值为3355H,波特率为2400Hz,Start信号始终置逻辑1,即随时都能发送数据。Reset信号逻辑1时复位,逻辑0时电路开始工作。THR是数据寄存器,文件头、数据长度以及数据位都先寄存到THR中,Len是数据长度,TSR是低8位数据帧寄存器,TSR1是高8位数据帧寄存器。数据长度Len定为02H,发送时先发送低8位55H,后发送高8位33H,一共发送两遍。发送的数据格式说明:当发送55H时,其二进制为01010101,则发送的数据的二进制数为00101010111(1位开始位+8位数据位+1位奇校验位+1位停止位)。

    单片机部分先对FPGA发送过来的文件头进行确认,正确就接收文件,否则放弃接收的数据。根据FPGA发送模块的协议,对串口控制寄存器SCON和波特率控制寄存器PCON的设置即可实现。

3 总结

    目前电子产品的开发中经常要综合运用EDA技术、计算机控制技术、数字信号处理技术,那么电路各部分经常需要数据交换。本文也是基于此给出这方面应用的实例,供开发者交流。

关键字:FPGA  串口通信  单片机  VHDL语言 引用地址:FPGA和单片机的串行通信接口设计

上一篇:一种基于FPGA的数字复接系统的设计与实现
下一篇:开放源码硬件与嵌入式大赛落幕,花落北大

推荐阅读最新更新时间:2024-05-02 21:04

基于单片机的冷媒中心控制系统的研制
引言 制冷系统已成为的现代汽车重要配置,制冷系统内的冷媒量和冷媒纯度都是影响制冷效果的关键因素,需要按期进行系统检测和冷媒更换。冷媒的更换过程分为冷媒回收、抽真空、注冷冻油和冷媒加注四个步骤。目前我国的汽车制冷系统的维修和维护的手段,大多仍是人工操作,其工作过程繁杂,效率低下,常因操作不当导致系统损伤。 作者完成的汽车制冷系统维护的自动化设备研制,有效地提高了维修效率和维护质量,实现了汽车制冷系统冷媒更换的全自动操作,使用简便,界面友好。 全自动冷媒加注控制系统采用16位单片机MSP430F149为核心控制器,采用了ATERA公司新型CPLD器件EPF10K10A,并实现了外存数据加密,整机功能完备、
[单片机]
基于<font color='red'>单片机</font>的冷媒中心控制系统的研制
高云半导体引入成熟的Arm®嵌入式生态系统到其FPGA产品中
全球增长最快的可编程逻辑公司—广东高云半导体科技股份有限公司(以下简称“高云半导体”)宣布与ARM公司合作,将成熟的Arm®嵌入式生态系统引入其FPGA产品中。 高云半导体将加入Arm DesignStart™FPGA计划,通过在FPGA中使用经过验证的Arm IP和相关软件,为嵌入式开发人员提供免费的无需版权认证的模型来使用ArmCortex®-M处理器。 嵌入式设计正在推动当今物联网系统往高性能,高灵活性和低成本方向发展。 FPGA以相同的成本,功耗和封装尺寸提供比微控制器更高的灵活性,更大的设计优化空间和更高的性能。 现在,通过将嵌入式系统引入到FPGA产品中,开发人员可以更加轻松的访问Arm处理器以及其相关软件和
[嵌入式]
高云半导体引入成熟的Arm®嵌入式生态系统到其<font color='red'>FPGA</font>产品中
详解寻线行走机器人设计与实现
  在最近的机器人比赛和电子设计竞赛中,较多参赛题目要求机器人沿场地内白色或黑色指引线行进。一些研究人员提出了基于寻线的机器人设计策略,主要是关注指引线的检测,但对于机器人的整体设计未做说明。本文在总结此类赛事的基础上,提出了一种将DSP(Digital Signal Processor)和CPLD(Complex Programmable Logic Device)作为核心处理器,采用模糊控制策略处理来自检测指引线传感器信号的机器人行走机构的通用性设计方法。    1 车体机械设计   由于机器人比赛对参赛机器人有严格的尺寸限制,需要在有限的空间内合理安排各个机构。本文给出车体最小尺寸时驱动轮、光电传感器以及控制芯片之间的相
[单片机]
详解寻线行走机器人设计与实现
芯原业界领先的嵌入式GPU IP赋能先楫高性能的HPM6800系列RISC-V MCU
先楫新一代的仪表显示产品具有高画质、低功耗等特点 2024年3月4日,中国上海—— 芯原股份今日宣布先楫半导体(简称“先楫”)的HPM6800系列新一代数字仪表显示及人机界面系统应用平台采用了芯原的高性能2.5D图形处理器(GPU)IP。 HPM6800系列产品基于RISC-V CPU内核,具备高算力、低功耗、高集成度和出色的多媒体功能,适用于汽车仪表、人机交互界面(HMI),以及电子后视镜(CMS)等需要复杂图形处理、高分辨率显示和高性能多媒体用户界面的应用。 芯原支持OpenVG的2.5D GPU IP能够为MCU/MPU设备提供高能效的图形处理和优质的图像输出,同时显著降低CPU负载。 凭借成熟的可扩展性,该GP
[嵌入式]
芯原业界领先的嵌入式GPU IP赋能先楫高性能的HPM6800系列RISC-V <font color='red'>MCU</font>
赛灵思在MWC演示无线和基带处理的FPGA设计平台
2011 年 2 月 22 日,中国北京 — 全球可编程平台领导厂商赛灵思公司(Xilinx, Inc. )于 2011 年 2 月 14 日至 17 日在西班牙巴塞罗那举行的 2011 年全球移动通信大会上演示了其面向蜂窝基础设施的FPGA目标设计平台。该平台采用 FPGA 支持全球无线通信,并实现了无线中频、基带和连接功能领域低成本和低功耗的解决方案。这款市场专用平台集成了最新软/硬件和 IP 创新,帮助网络基础设施厂商以及运营商大大降低了软件无线中频和3/4G 多模基站的资本、运营支出及开发成本。 大会期间,赛灵思与世界级生态系统合作伙伴联合演示了能够满足不断发展的标准要求以及长期演进 (LTE) 基带和多模无线中
[嵌入式]
以AT89C51单片机为控制核心的低成本高精度倒计时系统设计
1 引 言 倒计时系统的任务, 就是对某一设定日期进行倒数, 并在显示屏显示当前至设定日期的时间, 以增强人们的关注度和紧迫感。开发实践表明: 以时钟芯片DS12C887为时钟模块、单片机AT89C51为控制模块的高精度倒计时系统具有精度高、能够长时间连续稳定地工作、使用方便的特点, 可较好满足实际需要。系统的硬件设计和软件设计如下。 2 系统的硬件设计 系统的控制模块由AT89C51单片机构成, 用于完成对串行口控制器的初始化和数据读写, 并对接收的各种数据进行识别、转储及显示。时钟芯片DS12C887提供高精度的年、月、日、时、分、秒时间,校准后直接与单片机相连。倒计时显示模块由LED数码管, 74HC595芯片和74L
[单片机]
以AT89C51<font color='red'>单片机</font>为控制核心的低成本高精度倒计时系统设计
89C51单片机和8254-2实际步进式PWM输出
简介:介绍一种新型PWM输出的方式。它是用89C51作为主控部分,用8254-2可编程定时器/计数器来实现1Hz~3kHz步进式PWM的输出;具有分辨率高、反应速度快及占用CPU时间少的优点。 引言 脉宽调制(PWM)技术最初是在无线电技术中用于信号的调制,后来在电机调速中得到了很好的应用。本设计中要求输出PWM从1Hz~3kHz步进式递增,单步为1Hz。由于89C51的时钟最大能取24MHz,单指令周期为0.5μs,计数频率为×10 6Hz。当输出2999Hz和3000Hz时,若采用89C51内部计数器来计数,根本无法区别。因为计数频率为2MHz,单指令周期0.5μs,而要输出2999Hz时,计数应为666.889;输出30
[单片机]
89C51<font color='red'>单片机</font>和8254-2实际步进式PWM输出
Holtek 5V宽电压Cortex-M0+支持触控单片机
Holtek 新推出 5V 宽电压 Arm® Cortex®-M0+ Touch 单片机 HT32F542xx 系列产品,频率最高可达 60MHz,提供最多 28 个触控键,可通过 CS (Conductive Susceptibility) 10V 动态测试,此外还内建具自动扫描功能的 LED controller。 应用上适用于各类电器产品,如空气炸锅、电饭锅、智能门锁、洗衣机面板等。 HT32F54231/54241 系 列 的 Flash 容 量 为 32KB/64KB,SRAM 容 量 为4KB/8KB,提供最多 24 个触控键,并支持深度休眠模式 1 / 深度休眠模式2下自动侦测功能,适合低功耗产品的应用。此外
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

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

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