微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 工业电子 > 基于SOPC技术的EPA现场控制器的设计

基于SOPC技术的EPA现场控制器的设计

时间:08-14 来源:互联网 点击:
。所有NIOSⅡ处理器系统使用统一的指令和编程模型,并有三种类型以满足不同设计的要求,分别是快速型、经济型和标准型。在本控制器中,所定制的NIOSⅡ软核选用快速型,该内核处理速度为49DMIPS,耗费的逻辑门数为1400~1800LE,同时带有硬件乘法器和硬件除法器。根据EPA网络对控制器的要求,添加与CPU相连的片内外设和片外设备接口:SDRAM控制器、片内RAM、三态桥、UART、定时器、通用I/O口、LCD显示驱动电路和以太网接口。按照设计要求,在Quartus II 5.1版本下的对CPU的配置情况如图3所示。FPGA芯片可根据实际需要灵活地增加功能,同样对不必要的功能也可进行删减,以满足快速、高效和低成本的设计。
  在配置完CPU处理器的内部结构以后,按照设计需要对CPU的外围进行配置。由于该控制器是接入EPA网络,需要实现EPA协议,而FPGA芯片EP1C12Q240C8的内部只有288K的RAM,所以在片外扩展了16M bits的FLASH-AM29LV160D和64M bits的SDRAM-HY57V641620的。从外部引入12V的直流电源,经过电平转换以后得到3.3V和1.5V的电源,为CPU、存储器及其他受电设备供电。CPU上的时钟源使用的是50MHz的钟振。JTAG和EPCS下载口用于硬软件的下载。将在Quartus Ⅱ上编辑的硬件程序和软件程序通过JTAG和EPCS下载口,下载到FLASH和RAM(片内或者片外)中,可进行在线调试。该复位电路是由10KW电阻、10mF电容和按键组成,可实现按键低电平复位和上电低电平复位。


图3 EP1C12Q240C8芯片配置情况

  2.3 通信处理模块
  整个设计以FPGA芯片EP1C12Q240C8为数据处理中心,通过网络通信,完成对工业以太网上的其他设备的数据通信,同时通过MAX3232实现和上位机的串口通信。在该模块中,加入了LCD接口、行列式键盘接口和蜂鸣器接口,对工业以太网上的其他EPA设备进行监控和显示,有较好的人机交互的功能。
  在该设计中,网络通信分为有线和无线两种通信方式。其中,有线网络通信使用的是10M/100M的LAN91C111的自适应网卡芯片,并通过RJ45网口接入EPA网络。LAN91C111是SMSC公司为嵌入式应用系统推出的第三代快速以太网控制器。LAN91C111的芯片上集成了遵循SMSC/CD协议的MAC(媒体层)和PHY(物理层),符合IEEE802.3/802.U-100Base-Tx/10Base-T规范。在本控制器上预留了蓝牙模块和ZigBee模块的无线通信接口,作为辅助处理模块。可根据工业现场的实际情况,接入无线通信模块,实现与EPA网络的无线通信,通过该模块能够监测无线现场设备的运行情况及相关参数。
  在整个EPA通信协议栈网络层和传输层接收报文处理流程中。NIOSⅡ处理器复位后初始化UC/OS Ⅱ操作系统、网络接口、堆栈以及定时器等外围设备接口。从外部存储器FLASH中获取IP地址和MAC地址等网络信息。当收到的报文IP地址和MAC地址都是本机地址时,把报文以LWIP所要求的特殊结构体形式存储在接收缓冲区中,然后发送到EPA协议栈中进行处理,当检查到UDP端*是0x88BC时,将报文交由EPA应用层处理模块进行处理。
  其部分报文处理程序如下:
  /*报文发送*/
  void SendTask(void *pdata){
  struct netconn *conn;
  struct ip_addr remote_addr,local_addr;
  struct netbuf * buf;
  struct udp_pcb * udpbuf;
  struct pbuf * buf;
  char text[] = "A static test";
  /*设置远程主机的IP地址*/
  remote_addr.addr = htonl(0x8080023D);
  /*设置本地主机的IP地址*/
  local_addr.addr = htonl(0x80800233);
  for(;;){
  /*建立一个新连接*/
  conn = netconn_new(NETCONN_UDP);
  /*绑定本地IP地址和端**/
  netconn_bind(conn,&local_addr,0x88BC);
  /*连接远程主机*/
  netconn_connect(conn,&remote_addr,0x88BC);
  buf = netbuf_new();
  /*建立任意的数据*/
  netbuf_ref(buf,text,sizeof(text));
  netconn_send(conn,buf);
  netconn_delete(conn);
  netbuf_delete(buf);
  OSTimeDlyHMSM(0,0,1,0);
  buf = pbuf_alloc(PBUF_RAW, 60,
  PBUF_RAM);
  memcpy(buf->payload,text,
  sizeof(text));
  udpbuf = udp_new();
  udpbuf->local_port = 0x88bc;
  udpbuf->remote_port = 0x88bc;
  udpbuf->local_ip = local_addr;
  udpbuf->remote_ip = remote_addr;
  udp_bind(udpbuf, &udpbuf->local_ip,
  udpbuf->local_port);
  udp_sendto(udpbuf,buf,&remote_addr,udpbuf->remote_port);
  udp_remove(udpbuf); //释放
  udp_pcb内存
  pbuf_free(buf);
  OSTimeDlyHMSM(0,0,1,0);
  /* Main initializes lwIP, creates a single task and starts task scheduler. */
  void ReceiveTask(void * pdata){//该任务
  和IP协议栈相关,该任务由
  _sys_thread_new函数来创建
  struct netbuf * buf1,*buf2,*buf1_temp;
  struct netconn * conn1,*conn2;
  void * payload;
  u16_t len;
  struct ip_addr remote_addr,local_addr;
  char text[] = "I get a EPA packet,please
  give me another,I need you, baby.";
  remote_addr.addr = htonl
  (0x8080023D);
  local_addr.addr = htonl(0x80800233);
  conn1 = netconn_new(NETCONN_
  UDP);
  conn2 = netconn_new(NETCONN_
  UDP);
  netconn_bind(conn2, &local_addr, 0x88bc);
  netconn_connect(conn2,&remote_addr,
  0x88BC);
  netconn_bind(conn1, &local_addr, 0x88bc);
  while((buf1_temp = netconn_recv
  (conn1))!=NULL){
  //关于netbuf的结构可以参看api.h文件,在该结构体中,成员p是指向pbuf的一个指针
  buf1 = netbuf_new();
  buf1 = buf1_temp;
  payload = buf1->p->payload;
  len = buf1->p->len;
  netbuf_delete(buf1);
  buf2 = netbuf_new();
  netbuf_ref(buf2,text,sizeof(text));
  netconn_send(conn2,buf2);
  netbuf_delete(buf2);
  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top