您可以添加到网摘 让更多人关注此文章:
摘 要:通过从基于FPGA设计的1394物理层芯片与链路层芯片合并为一个FPGA芯片且由双端口升为三端口的VHDL代码移植过程,介绍1394芯片基本原理和移植中所产生的问题解决办法,阐述FPGA芯片设计的代码规范化的重要性以及一些基本技巧。
关键词:异步FIFO 冗余设计 逻辑锁
1 引言
IEEE1394 是在计算机与外设直接进行高速数 据传输的串行总线,因其具有传输速度高、支持即 插即用、支持多达63个设备级联、以及设备间传输 无需主机干预等特点,以至从其一出现就备受青 睐。因IEEE 1394协议中的物理层可以在链路层 不激活的情况下,作为中间节点而存在于1394网 络中,物理层具有单独存在的意义,因此应用中就 有纯物理层芯片、纯链路层芯片以及物理层和链路 层合一的芯片三种类别。
由FPGA实现应用协议是目前最普遍的芯片 设计方法。在用VHDL 语言两个小FPGA芯片上 分别设计出IEEE1394 链路层和双端口的物理层 后,把这两部分代码合并到一个更大容量的FPGA 上,并改进为三端口,看似非常简单,但因FPGA电 路的逻辑综合,引脚到寄存器之间的延时等方面发 生了变化,代码移植发生了问题。
由于物理层部分的移植过程中有增加端口,出现的问题较多,而链路层基本没有变化,这里主要分析物理层的设计部分。
通过对改进电路设计,分析代码上的差别,从 而阐述FPGA设计代码规范化的重要性和一些技巧的应用。
2 IEEE1394物理层介绍
2. 1 IEEE1394总线协议框图 1394物理层的每个端口有两对差分信号TPA和TPB组成,其中TPA包含TPA +和TPA - 两条信号线, TPB包含TPB +和TPB - 两条信号线,物理层通过判断每个端口在自己发送的信号与对方发送的信号产生的线状态来判别总线的工作状态, 当进入接收或发送状态时,就进行数据处理,并与链路层进行数据交换。
1394链路层和物理层使用统一的系统时钟, 以保证数据的同步。链路层对物理层的总线申请和寄存器操作是单向的,由LREQ来控制。而数据则是双向的,由控制信号决定数据的传输。链路层要实现发送数据的打包操作和接收到的数据的校 验判别及解包操作。
1394事务层则由具体的设备程序处理,其与链路层之间交换的是已通过校验的有效数据包。

图1 1394总线协议框图
2. 2 IEEE1394物理层的工作流程 1394物理层的每个设备没有固定的节点号, 是在使用时通过配置产生的节点号,设备间再通过 这个节点号来识别数据的源与目标。其配置流程 如下:

总线复位由设备上电、设备插拔、状态超时、软件 控制等产生,它通过发送一个超过166us的BUS_RESET信号,保证所有的节点都能进入复位状态。
树标识是从叶子节点开始,按端口号由低到高的原则,通过子握手和父握手信号协商,把整个网 络各端口的父子关系确定下来,也就是确定了整个网络的TOP结构(树结构) 。
自标识也是从叶子节点开始的,通过逐一向总线发送自标识包,来表明自己的身份,节点号从0开始,已经完成自标识的进入正常仲裁状态,没有完成自标识的,每收到一个自标识包,其节点号增1,这样当最后一个节点(即根节点)完成自标识包发送后,网络上的每个节点都有一个唯一标识自己 的节点号,这时自标识过程完成,所有节点都进入正常仲裁状态。
正常仲裁则通过判断总线状态和链路层的总线请求,进行总线权的仲裁,包括优先权仲裁、公平 仲裁等,只有通过仲裁获得总线权的节点才可以向网络发送数据。
2. 3 IEEE1394物理层的数据收发 在自标识完成后,获得1394总线权的节点进入数据发送状态,而没有获得总线权的节点进入接收与转发状态。数据的发送比较简单,直接向所有已连接的端口输出信号即可,而接收则不同,一方 面要从接收端口接收数据,另一方面要向其它端口转发接收的数据,而这个转发的数据,需要经过内部时钟同步才能转发出去。这样就会有转发延时的问题,考虑到总线上可挂接63个节点,因此,这个延时还不能太大,否则将影响整个1394总线权的仲裁,而导致系统崩溃。
3 移植前后的主要差异
3. 1 芯片型号变化 由两片EP1C6T144C8合为一片EP1C12Q240C8, 总的I/O引脚减少,单一芯片的逻辑单元数加大,电路综合变得复杂,综合效果没有芯片分开时好,另外合到一个芯片后,原本来自1394信号电缆的干扰基本只与物理层相关,现在更渗透到了链路层,反之,来自应用层的干扰原本主要影响链路层,现在却影响到了物理层。
3. 2 端口数增加 1394端口由2端口增加到3 端口,信号数增加了12根, I/O资源变少,状态判别逻辑变复杂, 与信号直接相关的逻辑单元平均距离变长,也就是说信号延时变长。
3. 3 链路层与物理层程序合一 程序合并后,调试难度增加,一是编译时间加长,分成两个单独芯片进行电路综合的总时间,要比合到一起后的时间短1 /3;二是不能采取与标准 LLC层、PHY层芯片分别调试的方式来简化设计 调试过程,因而导致问题更难定位。
4 移植过程中问题的解决
4. 1 接收F IFO的处理 在移植前,是一个2端口的方案,移植后变成了3 端口, 按照原设计, 先利用接收端口号 ( PORT)选择相应的STRB 和DATA输入,再利用这个信号异或产生时钟信号,接一个F IFO (见图 2) ,但运行中问题出现了,不是所有时间所有端口都能正常接收。
实际上,扩充到3端口后,各引脚不是排列在 FPGA的同一ROW或COLUMN,在电路综合中,不 同端口到F IFO的输入路径长度和方式都不一致, 同时因为内部时钟频率并不比接收时钟频率高,不能在F IFO前对接收信号进行同步处理,只能使用 组合逻辑,使得组合逻辑产生的毛刺影响了数据的有效性。
图2
通过使用冗余的办法,把原来的共用FIFO改为每个端口一个接收FIFO (见图3) ,这样在每个端口能以最短路径和很少的组合逻辑接到FIFO, 而3个FIFO的输出再由接收端口号来控制,此时FIFO的输出是通过内部时钟同步,这样就解决了问题。

图3 使用冗余后每端口接收F IFO
[1] [2] 下一页
|