由图2可以看出,数据传输机制与普通流水协议相同,只多了一个BRST指示信号,它与地址1同时有效,表示本次数据没有传输完毕,下次要传输的数据与本次传输的数据是一个整体,即BRST有效时传输是低32位数据,无效时传输的是高32位数据,这样就实现了在32位数据总线上传输64位数据,如果没有BRST信号,该过程会被认为是2次32位传输。
同理,如果用32位数据总线传输128位数据,在传输前3个32位数据的时候,BRST信号有效,传输最后一个32位数据BRST无效。
注意:使用流水协议时,流水深度由传输类型(读数据还是写数据)决定。在写数据传输中,流水深度固定为1;在读数据传输中,流水线深度可由用户编程决定,即由系统配置寄存器SYSCON决定,在1~4之间可变。
2 FPGA设计
由于DSP的协议是相对固定的,FPGA只需按照协议进行设计即可,下面以DSP访问FPGA内部寄存器为例详细介绍。笔者建议采用同步设计,主要信号、输出信号都由时钟沿驱动,可以有效避免毛刺。
为了使所设计的模块通用化,可设流水深度、数据总线位宽、寄存器位宽、寄存器地址可设。笔者建议采用参数化设计,使用参数传递语言GENERIC将参数传递给实体,在实体内部使用外if…else结构,这样在一个程序中可以包含各种情况,但不会增加逻辑的使用量。下面以个别情况为例,详细介绍。
2.1 32位数据总线,32位寄存器,写操作
前面提过,DSP采用流水协议写FPGA时,流水深度固定为1,FPGA在前一时钟沿采到地址、WRx信号有效,在下一时钟沿就锁存数据,如图1所示,FPGA在时钟沿1采到地址总线上的地址与寄存器地址一致,WRx信号为低,写标志信号S_W_FLAG置高,由于采用同步设计,FPGA只有在时钟沿2才能采到S_W_FLAG为高,一旦采到S_W_FLAG为高,FPGA就锁存数据总线上的数据,即在时钟沿2锁存数据。
2.2 32位数据总线,32位寄存器,读操作
与写寄存器不一样,读寄存器时流水深度在1到4之间可设,需要注意的是,为避免总线冲突,DSP不读时,FPGA数据总线应保持三态。
如果流水深度设置为1,FPGA在前一时钟沿采到地址、RD信号有效,应确保在下一时钟沿数据已经稳定的出现在数据总线上,否则DSP不能正确读取数据,如图3所示,在时钟沿1采到地址总线上的地址与寄存器地址一致,RD信号为低,驱动数据总线,在时钟沿2数据已稳定出现在数据总线上,DSP可以读取。
如果流水深度设置为2,FPGA在前一时钟沿采到地址、RD信号有效,应确保隔一时钟周期后,数据稳定的出现在数据总线上,这样就像写操作一样,需要加一个标志,当条件满足,标志为高,一旦标志为高,输出数据,如图4所示。
综上所述,流水深度加深一级,FPGA就晚一个时钟周期驱动数据总线。可以看出,虽然流水深度在1~4之间可设,但是总能保证一个时钟周期传输一个数据。