EDN首页   博客首页

最新日志

发表于:2008-7-19 10:25:52
标签:GPIB  NAT9914  

2

NAT9914学习笔记(1)

1.       发送GPIB数据消息的基本流程(from nat9914_rm):

(1)    确认T1 delay已经被正确设置;

(2)    等待NAT9914被编程(向auxcr寄存器写入0x09\89\0A\8A指令)或寻址(CIC发送MTAMy Talker Address)指令)作为活动讲者;

(3)    等待BO位(ISR0[4])被设置;

(4)    将数据字节写到CDOR寄存器中;

(5)    等待BO位(ISR0[4])或ERR位(ISR1[6])被设置;

BO=1表明系统中的所有设备都已经接收了这个数据或指令;

ERR=1表明系统中有设备没有正常工作。

 

主端口(host interface)可以通过对BOERR位进行查询,也可以通过设置BO IEERR IE位使得这些事件自动产生中断。(两种方式:查询、中断)

 

2.       如何发送EOIEOS

方法一:将字节写入CDOR之前,写入Send EOI指令(向auxcr寄存器写入0x08);

        这一指令的作用:使得下一个数据字节传输完成后EOI信号线自动变高;

方法二:设置XEOSACCRA[3]=1,当CDOR中的字节值与EOSR中设置的值相同时,EOI线将自动置高;

 

方法三:直接向CDOR中写入EOS码。

 

3.       T1 Delay有关的问题:

T1 Delay的定义:在GPIB端口数据传输的过程中,NAT9914作为讲者驱动数据字节到DIO[8-1]信号线上,经过一定的延迟(称为T1 Delay),NAT9914DAV为低向听者表明数据字节已经被放置到DIO[8-1]信号线上。

 

关于T1 Delay的设置,目前先不设ustd, vstdlstdl,先设为缺省值2000ns,等系统功能初步实现后,再琢磨如何提高传输速度。

 

4.       nbaf: auxiliary command0x05),New Byte Available False

nbaf强制将本地消息nba(new byte available)置为false,这个动作将禁止NAT9914发送CDOR中最后写入的字节。这一命令在下面的情形中有用:

NAT9914作为一个讲者,而CDOR中刚被写入一个字节。在讲者将要发送CDOR中的字节数据之前,控者发出了ATN信号。正常情况下,当控者撤销ATN信号后,讲者会继续发送CDOR中的字节数据。如果控者发出ATN信号后,CDOR中的字节数据已经不再需要了,可以使用nbaf来取消这次传输。

 

5.       接收GPIB数据消息的基本流程(from nat9914_rm):

(1)    NAT9914被编程或寻址为活动听者(设置ISR1中的MA位与ADSR中的LA位);

(2)    执行rhdfRelease RFD Holdoff)的辅助命令,释放所有挂起的RFD Holdoff

(3)    等待BI位为1

(4)    读取DIR寄存器中的值作为接收到的字节数据;

(5)    如果设置了BI IE位,则接收到数据后产生中断信号。

 

6.       接收ENDEOS信息

END位(ISR0[3])表明NAT9914作为听者已经接收到一个ENDEOS消息。

 

END消息:讲者置EOI信号线;

EOS消息:

如果NLENIMR2[5]=1,“新行”(new line)字符(0x0A)代表EOS消息;

如果REOSACCRA[2]=1EOSR中的值代表EOS消息。

如果接收到上述字节数据,END位将被置为有效。

 

现在已知END位有效,怎样判断是上面的哪种情况发生呢?

查询NL位(ISR2[5])与EOS位(ISR2[4])。如果NL位有效,说明NAT9914接收到一个new line字符;如果EOS位有效,说明REOS=1并且NAT9914接收到的字符与EOSR寄存器中的内容相同。

 

7.       最终数据字节的RFD holdoff

在一个GPIB读操作过程中,可能需要在读一个数据字符串的最后一个字节时执行RFD holdoff。如果最后一个字节读取时EOI有效或者该字节为EOS字符,那么在NAT9914被编程为RFD Holdoff On End模式(通过hlde辅助命令实现)的情况下,RFD Holdoff自动发生。

 

    如果不知道讲者在发送最后一个字节时是否置EOI有效或者接收接收字节是否匹配EOS字符,可以将NAT9914编程为RFD Holdoff On All模式(通过hlda辅助命令实现)。在RFD Holdoff On All模式下,只要接收到GPIB讲者发送的数据字节,NAT9914将执行RFD  holdoff

点击此处查看原文 >>

系统分类: 测试测量   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(489)
发表于:2008-6-27 23:05:24
标签:SOPC  NIOS  从端口  外设  时序  

1

NIOS系统中Avalon从外设的时序关系匹配

图1

    Avalon总线是一种同步总线,在连接外设接口(例如USB、Ethernet接口芯片)的过程中,不可避免涉及到外设的时序关系问题。在外设寄存器读写的过程中,如何使得Avalon总线提供的chipselect、read、write、readdata/writedata、address等信号间的时序关系能够满足不同外设接口芯片千变万化的读写时序要求,是SOPC设计过程中的一个重要问题。幸好,Avalon总线提供了多种传输模式来满足这一需求:

    (1)基本从端口传输模式;

    (2)具有固定等待周期的从端口传输;

    (3)具有外设控制等待周期的从端口传输;

    (4)具有建立时问的从端口传输。

在SOPC Builder的Component Editor中提供了Avalon Slave Timing的选项:

其中,建立(setup)时间是指WR/RD 前的地址输入建立时间,等待(wait)时间是指有效的WR/RD选通脉冲的宽度,保持(hold)时间是指WR/RD 后的地址输入保持时间。

    根据外设接口芯片的数据手册中提供的读写是读写时序要求,确定上述参数的设置值。一般应该以时间长度(ns/us/ms)等为单位比较合适,因为NIOS CPU软核的时钟频率根据项目情况的不同,不是那么固定。如果使用cycles作为单位,获得的时序关系可能与预想有一定程度的差别。

 

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(241)
发表于:2008-6-15 10:46:59
标签:Quartus  NIOS  license  time-limited  

1

***_time_limited.sof的困惑

    最近在调试有关Quartus6.0+NIOS II+LWIP的程序,发现了一个问题。

   我的Quartus6.0之前使用一直正常,而且能生成sof与pof文件。可是最近工程在编译之后只能生成***_time_limited.sof,迷惑不解。一直没想出问题的原因,更换了多个license也没奏效。其他可能的原因(包括路径名、verilog文件错误、Quartus版本、SP版本等)都想到了,耽误了一个星期也没解决这个问题。

     今天在Quartus的编译报告中发现了这样一条信息:

Warning: Defaulting to OpenCore or OpenCore Plus compilation for core Nios II Processor (6AF7_00A2)

     我开始怀疑是NIOS软核也需要相应的License。仔细回想,我以前编译通过的工程都没有使用NIOS,应该是这个原因。通过搜索找到能应用NIOS的License,安装之后编译通过。

license文件如下:

Quartus 6.0 license(可使用NIOS):点击下载

 

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 原创

评论(1) | 阅读(354)
发表于:2008-6-8 10:03:22
标签:NIOS  DM9000  netif  alt_lwip_dev  lwip_dev_list  

3

DE2开发板:NiosII+LWIP环境下DM9000A的驱动程序分析(web_server.c)

在DE2的开发板上,利用NiosII软核与LWIP,可以实现web服务。Terasic公司提供的DE2_WEB_SERVER DEMO提供了一个很好的范本,可以作为很好的研究对象。NIOS IDE提供了Lan91C11的驱动,对于其他以太网接口芯片没有提供相应的驱动。而DE2开发板提供了DM9000A的驱动,为我们研究NIOS系统中Avalon外部设备的驱动编程提供了有益的参考。

首先需要关注LWIP提供的几个重要的结构体: 

//netif结构体作为LWIP中网络接口的基础数据类型,描述了网络接口的基本属性以及输入、输出函数

struct netif {
  /** pointer to next in linked list */
  struct netif *next;

  /** IP address configuration in network byte order */
  struct ip_addr ip_addr;
  struct ip_addr netmask;
  struct ip_addr gw;

  err_t (* input)(struct pbuf *p, struct netif *inp);
  err_t (* output)(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr);
  err_t (* linkoutput)(struct netif *netif, struct pbuf *p);
  void *state;
#if LWIP_DHCP
  /** the DHCP client state information for this netif */
  struct dhcp *dhcp;
#endif
  /** number of bytes used in hwaddr */
  unsigned char hwaddr_len;
  /** link level hardware address of this interface */
  unsigned char hwaddr[NETIF_MAX_HWADDR_LEN];
  /** maximum transfer unit (in bytes) */
  u16_t mtu;
  /** flags (see NETIF_FLAG_ above) */
  u8_t flags;
  /** link type */
  u8_t link_type;
  /** descriptive abbreviation */
  char name[2];
  /** number of this interface */
  u8_t num;
};


//alt_lwip_dev结构体描述了符合LWIP规范的网络端口设备

struct alt_lwip_dev
{
  /* The netif pointer MUST be the first element in the structure */
  struct netif*     netif; 
  const char*      name;
  err_t (*init_routine)(struct netif*);      //初始化函数
  void (*rx_routine)();                              //数据接收函数
};


//alt_lwip_dev_list:设备链表

typedef struct 
{
  alt_llist     llist;     /* for internal use */
  alt_lwip_dev  dev;
}alt_lwip_dev_list;
typedef struct alt_llist_s alt_llist;

struct alt_llist_s {
  alt_llist* next;     /* Pointer to the next element in the list. */
  alt_llist* previous; /* Pointer to the previous element in the list. */
};


在LWIP定义的这些结构体类型的基础上,DE2_WEB_SERVER定义了针对DM9000网络接口的一个结构体

alt_avalon_dm9k_if:
// dm9k private date structure
typedef struct
{
 alt_lwip_dev_list   lwip_dev_list;   //与之关联的设备链表
 int base_addr;                                   //寄存器的基地址
 int irq;                                                  //中断编号