由于字数限制,配图请查看:http://bbs.ednchina.com/BLOG_ARTICLE_3016359.HTM
模块化SGDMA调度核
概述
模块化SGDMA的调度核负责缓存描述符以及对读写主(master)核的控制。用户可以将该调配器核配置成以下三种传输类型:
l 存储器到存储器
l 数据流到存储器
l 存储器到数据流
该调度模块组成了模块化SGDMA控制路径,它连接读写主端模块,从而构成了模块化SGDMA的数据路径。因此,模块化SGDMA的所有互连都位于该调度核之中。
调度模块包含了一些可选设置模块,这样有利于不同的应用,可以使应用设计减少硬件资源消耗且提供整体系统性能(Fmax)。该调度核同时提供了Nios® II处理器设备驱动程序,允许设计者Nios II IDE环境或者软件构建工具中开发软件的时候更好地使用SGDMA。
结构框图
图1显示了组成调度核的重要部件的结构框图。
图1:调度核结构框图
注:上图中S表示Avalon-MM接口中的slave(从)端口,SRC表示Avalon-ST接口中的source(源)端口,SNK表示Avalon-ST接口中的sink(接收)端口,CSR表示控制、状态寄存器。
图1中一些端口是可选的,比如当模块化SGDMA配置成数据流到存储器传输模式时,读主端口的命令和响应端口就不会导出。任何一些端口被禁用,都会减少调度核的逻辑和存储器消耗。
调度核的响应从端口只在数据流到存储器传输模式下用到,这些从端口用于向主机沟通类似错误等信息。同时,这些响应端口在一个描述符预取模块加入到模块化SGDMA结构中时也必需的。此时,这些响应端口应当被配置成数据流源端口。
模块化SGDMA通用配置
根据以上分析,我们知道模块化SGDMA有三种主要的配置,这三种配置可以满足大部分系统设计者的需求。下面三个框图分别对这三种配置进行展示。
存储器映射到数据流配置(MM->ST)
图2:模块化SGDMA架构中存储器映射到数据流配置
注:上图中S表示Avalon-MM接口中的slave(从)端口,M表示Avalon-MM接口中的master(主)端口,SRC表示Avalon-ST接口中的source(源)端口,SNK表示Avalon-ST接口中的sink(接收)端口,CSR表示控制、状态寄存器。
数据流到存储器映射配置(ST->MM)
图3:模块化SGDMA架构中数据流到存储器映射配置
注:上图中S表示Avalon-MM接口中的slave(从)端口,M表示Avalon-MM接口中的master(主)端口,SRC表示Avalon-ST接口中的source(源)端口,SNK表示Avalon-ST接口中的sink(接收)端口,CSR表示控制、状态寄存器。
存储器映射到存储器映射配置(MM->MM)
图4:模块化SGDMA架构中存储器映射到存储器映射配置
注:上图中S表示Avalon-MM接口中的slave(从)端口,M表示Avalon-MM接口中的master(主)端口,SRC表示Avalon-ST接口中的source(源)端口,SNK表示Avalon-ST接口中的sink(接收)端口,CSR表示控制、状态寄存器。
调度核端口列表
这一节详细介绍下模块化SGDMA调度核模块导出的各种Avalon-MM和ST端口。设计者在图形化界面下创建元件时,有些信号和端口根据不同的设置在可选择的情况下可以被移除。同时以下列出的一些信号也不会被调度核用到,它们只是为了完成记录。
读命令源端口
表1:读命令源端口各比特定义
比特 |
信号信息 |
31-0 |
Read Address [31:0] |
63-32 |
Length [31:0] |
71-64 |
Transmit Channel [7:0] |
72 |
Generate SOP |
73 |
Generate EOP |
74 |
Stop1 |
75 |
Reset1 |
83-76 |
Read Burst Count [7:0] |
99-84 |
Read Stride [15:0] |
107-100 |
Transmit Error [7:0] |
108 |
Early Done Enable |
140-109 |
Read Address [63:32] |
255-141 |
2 |
1 不遵守流控制的组合逻辑信号
2 保留位驱动到地
读响应接收端口
表2:读响应接收端口各比特定义
比特 |
信号信息 |
0 |
Reset Delayed1 |
1 |
Stop State1 |
2 |
Early Done Strobe2 |
3 |
Done Strobe3 |
255-4 |
|
1 不遵守流控制的组合逻辑信号
2 当最后一个读命令发送后被置有效
3当所有数据被读完后被置为有效
写命令源端口
表3:写命令源端口各比特定义
比特 |
信号信息 |
31-0 |
Write Address [31:0] |
63-32 |
Length [31:0] |
64 |
End on EOP |
65 |
|
66 |
Stop1 |
67 |
Reset1 |
75-68 |
Write Burst Count [7:0] |
91-76 |
Write Stride [15:0] |
123-92 |
Write Address [63:32] |
255-124 |
|
1 不遵守流控制的组合逻辑信号
2 保留位驱动到地
写响应接收端口
表4:写响应接收端口各比特定义
比特 |
信号信息 |
31-0 |
Actual Bytes Transferred [31:0] |
32 |
Reset Delayed1 |
33 |
Stop State1 |
41-34 |
Error [7:0] |
42 |
Early Termination |
43 |
Done Strobe |
255-44 |
|
1 不遵守流控制的组合逻辑信号
响应源端口
响应端口可以被配置成Avalon-MM从端口或者Avalon-ST源端口,当被配置成源端口的时候,可以将其连接到一个可以从存储器预取描述符的模块。当前,预取模块暂时还不可用。
表5:
比特 |
信号信息 |
31-0 |
Actual bytes transferred [31:0] |
39-32 |
Error[7:0] |
40 |
Early termination |
41 |
Transfer complete IRQ mask1 |
49-42 |
Error IRQ mask1 |
50 |
Early termination IRQ mask1 |
51 |
Descriptor buffer full2 |
255-52 |
|
1 缓存中断屏蔽,这样描述符预取模块可以置位IRQ信号
2用于通知描述符预取模块调度核描述符FIFO里有空间可提交另一个描述符进FIFO
描述符从端口
描述符从端口是一个只写端口,且可以配置成128或者256比特宽。端口宽度取决于用户选择的系统使用的描述符格式。本文后面的软件编程一节会介绍不同描述符格式的结构。需要注意的非常重要的一点是,当你向这个端口写描述符的时候,描述符最后一个比特必须设置为高,以此来完成向调度核写入一个描述符。该端口可以以任何字节通道顺序访问(只写),只要保证最后一次写的时候最后一比特被设置为高即可。
CSR从端口
控制和状态寄存器端口是可读可写端口,并且端口宽度是32-bit。当调度核模块的响应端口被禁用或者被设置为存储器映射模式时,CSR端口也负责向主机发送中断。寄存器的映射关系将在本文后面的软件编程模型一节进行介绍。
响应从端口
响应从端口可以配置成禁用模式、存储器映射或者数据流模式。在存储器映射模式下,响应信息通过一个从端口与主机进行沟通。响应信息宽度一般都宽于从端口,所以主机必须执行两次读才能接收完整的响应信息。由响应从端口读取最后一个字节的时候,对调度核模块内的响应缓冲执行一个破坏性的读。因此始终确保软件是从最后一个响应地址读。(?)
软件编程模型
SGDMA模块化的架构,包含了丰富的功能,同时尽可能地消耗更少的硬件资源。因此,模块化SGDMA定义了两种描述符格式,一种叫标准描述符格式,一种叫扩展描述符格式。所谓标准格式就是这种描述符包含了所有传输所必需的最少设置。扩展格式除了包含标准格式的所有功能,同时还包含了一些其它可选功能。为了能够使用扩展格式,必须在调度核模块图形化用户界面里选择“高级特性(Enhance Feature)”。同时,还需要在读写主端口模块里使能一些高级特性。
软件文件
模块化调度模块提供了以下一些设备驱动文件:
l descriptor_regs.h:定义描述符从端口寄存器映射,提供访问底层硬件的符号常量。
l csr_regs.h:定义CSR从端口寄存器映射,提供访问底层硬件的符号常量。
l response_regs.h:定义可选响应端口的寄存器映射,提供访问底层硬件的符号常量。
l sgdma_dispatcher.h:定义调度核使用的描述符格式,也提供描述符结构和访问描述符、CSR以及响应从端口的原型。
l sgdma_dispatcher.c:提供描述符结构体和描述符、CSR以及响应从端口的访问函数。
标准描述符格式
表6:标准描述符格式
|
Byte Lanes |
|||
Offset |
3 |
2 |
1 |
0 |
0x0 |
Read Address[31..0] |
|||
0x4 |
Write Address[31..0] |
|||
0x8 |
Length[31..0] |
|||
0xC |
Control[31..0] |
扩展描述符格式
表7:扩展描述符格式
|
Byte Lanes |
|||
Offset |
3 |
2 |
1 |
0 |
0x0 |
Read Address[31..0] |
|||
0x4 |
Write Address[31..0] |
|||
0x8 |
Length[31..0] |
|||
0xC |
Write Burst Count[7..0] |
Read Burst Count[7..0] |
Sequence Number[15..0] |
|
0x10 |
Write Stride[15..0] |
Read Stride[15..0] |
||
0x14 |
Read Address[63..32] |
|||
0x18 |
Write Address[63..32] |
|||
0x1C |
Control[31..0] |
描述符字段
所有的描述符字段都是字节边界对齐,必要时可以跨多个字节。描述符从端口的每一个字节管道都可被独立访问,如此允许你使用任何尺寸来填充描述符。
值得重点注意的是,不同格式描述符的控制字段有不同的偏移地址。控制字段的最后一个比特被置有效的时候,用于提交该描述符到调度模块缓存。因此,控制字段总是位于描述符的末尾,这样就允许主机将描述符按序写入调度模块。
l 读写地址字段
读写地址字段对应于每次缓冲传输的源和目的地址。根据传输类型的不同,不是每次都需要提供读或写的地址。当执行存储器映射到数据流的数据传输的时候,不需要写地址,因为数据是传输到流端口,所以这时候没有目的地址。同样,当执行数据流到存储器映射的传输时,不需要读地址,因为数据源于一个流端口。
如果在一个配置中读或者写地址字段被写入地址,而这些地址如上述那样不是必需的,那么模块化SGDMA就会简单地忽略掉这些不必要的地址。对于不能被模块化SGDMA访问的写地址比特将会被丢弃,而且会导致硬件重配到更底层的地址空间。64-bit地址寻址需要使用到扩展描述符格式。
l 长度字段
长度字段用于指定每个描述符传输的字节数,长度的单位是字节。长度字段也用于数据流到存储器映射的包传输中在包结束(EOP)标识符到达之前限制其可被传输的字节数。所以,长度字段必须总是要被编程写入,如果不希望限制ST到MM传输的包,可以往长度字段编程写入最大可能的值,即0xFFFFFFFF。这样在使能包支持的情况下,就允许你为每个描述符知道最大的包尺寸。
l 序列号字段
序列号字段只在描述符高级特性被使能的情况被使用。序列号字段是分配给描述符的一个仲裁值,这样就可以知道读写主模块当前操作的到底是那个描述符。如果是执行存储器映射到存储器映射的传输,该值将被读写主控模块单独跟踪,因为此时每个主控模块都能操作不同描述符。要使用此功能,只需向描述符简单地编程写入唯一的序列号,然后访问调度模块的CSR从端口,以确定哪一个描述符正处于操作之中。
l 读和写突发数字段
可编程的读和 突发数只有在扩展描述符格式里才会用到。可编程突发数只是个可选项,而且在读和写主控模块可以被禁用。由于可编程突发数字段有八个比特,所以突发数的设置范围是1到128。写入0或者任何大于128的值都将自动地被转换为最大突发数。
模块化SGDMA的可编程突发数只被推荐用于那些最大突发数不同的从端口之间。比如,一个模块化SGDMA被用于传输数据到一些个从端口,而这些从端口的最大突发数可能分别设置为2、64和128,这时候我们则必须设置每个从端口最大突发数为128。
l 读和写跨越字段
读和写跨越字段是个可选项,且只有在扩展描述符格式下才使用。跨越值决定了读和写主控模块将通过如何递增地址来访问存储器。跨越值的单位是字,所以地址递增依赖于主控模块的数据位宽。
当使能跨越时,主控模块默认依次跨越的间隔等于1。跨越值为0,则导致主控模块连续地访问同一个地址。跨越值为2时,则表示间隔一个地址连续访问存储器。可以使用此特性来执行交错的数据访问,或者执行一帧缓冲区的行和列的调换。读和写的跨越长度可以独立保存,这样在进行存储器映射到存储器映射的传输中可以在读和写的时候使用不同的地址递增方式。举例来说,在执行2:1的数据抽取传输的时候,我们只需简单地配置读主控模块的跨越长度为2,而写主控模块的跨越长度为1即可。当然,为了完成抽取操作,也可以在两个主控模块直接插入一个滤波器。
l 控制字段
控制字段在标准描述格式和扩展描述符格式中都是必要选项,可以使用该字段来定义描述符的各种特性,比如被驻留描述符、出错处理以及中断屏蔽等。写入中断屏蔽到描述符中,这样使得每次传输都有唯一的中断使能。
表8:描述符控制寄存器各比特定义
比特偏移 |
名称 |
7-0 |
Transmit Channel |
8 |
Generate SOP |
9 |
Generate EOP |
10 |
Park Reads |
11 |
Park Writes |
12 |
End on EOP |
13 |
|
14 |
Transfer Complete IRQ Mask |
15 |
Early Termination IRQ Mask |
23-16 |
Transmit Error/Error IRQ Mask |
24 |
Early done enable |
30-25 |
|
31 |
Go1 |
1 写一个‘1’到‘Go’比特将整个描述符提交给描述符FIFO。
Transmit Channel:在MMàST传输时用于发送一个通道号
Generate SOP:在MMàST第一个传输时用于发送一个包的起始标识
Generate EOP:在MMàST最后一个传输时用于发送一个包的结束标识
Park Reads:该比特被设置时,如果没有其它描述符被缓冲,那么调度核模块就继续提交同一个描述符给读主控模块。这种操作通常用于视频帧缓冲。
Park Writes:该比特被设置时,如果没有其它描述符被缓冲,那么调度核模块就继续提交同一个描述符给写主控模块。
End on EOP:收到包尾(EOP)即结束,在STàMM的传输中在指定时间内传输的数据数量未知的情况下允许写主控模块持续地发送数据。这种操作在通常用于基于包的传输,比如以太网应用。
End on EOP or Length:收到包尾(EOP)或指定长度的数据即结束。在STàMM的传输中和“End on EOP”用法类似,除了可以使能写主控模块在完成指定长度数据传输后结束。举个例子,在一次STàMM的传输中如果在长度字段指定了1MB,如果该1MB传输完毕但是却没有收到EOP,那么写主控模块就会提前结束本次传输,参考后面“early termination”的解释。
Transfer Complete IRQ Mask:用于传输完成后向主机触发一个中断。在MMàST传输时这个中断是基于读主控模块完成一次传输。在STàMM或MMàMM的传输中这个中断是基于写主控模块完成一次传输。
Early Termination IRQ Mask:用于在STàMM的传输提前结束时向主机触发一个中断。举个例子,在一次STàMM的传输中,如果该比特被设置同时传输长度被设置为1MB,那么当有超过1MB的数据到达写主控模块,此时就算没有收到EOP,该中断就会被响应或得到触发。
Transmit Error/Error IRQ Mask:在MMàST传输时该字段用于指定一次传送错误。此时通常用于类似以太网 MAC这样的应用那样可以向下发送传输错误信息到数据流组件。而在STàMM传输时,该字段则用于一个错误中断屏蔽。当一个错误到达写主控模块的流接收端口时,会被一直保留。而当传输完成时,任何错误比特在传输任何时候被设置且错误中断屏蔽比特被设置,那么主机将会收到一个中断请求。
Early Done:用于隐藏读取描述符之间的延迟。该字段被设置时,读主控模块将不会延迟到上次读返回才去读其它描述符。通常,该比特除了在读最后一个描述符的时候都会被设置。该比特在那些需要极低读延迟的应用中非常有效率(比如SDRAM、PCIe、SRIO等待)。
Go:用于将所有描述符信息提交到描述符FIFO。当主机需要将其它字段写入到描述符FIFO的时候,字节使能被用于写每个字节到FIFO。然而,所有数据只有在‘go’比特被写入‘1’的时候才会被提交进描述符FIFO。因此,需要确保‘go’比特是该描述符最后一被写入的比特。
调度模块控制和状态寄存器(CSR)
表9:调度模块控制和状态寄存器映射
|
|
Byte Lanes |
|||
Offset |
Access |
3 |
2 |
1 |
0 |
0x0 |
Read/Clear |
Status |
|||
0x4 |
Read/Write |
Control |
|||
0x8 |
Read |
Write Fill Level[15..0] |
Read Fill Level[15..0] |
||
0xC |
Read |
1 |
Response Fill Level[15..0] |
||
0x10 |
Read |
Write Sequence Number[15..0]2 |
Read Sequence Number[15..0]2 |
||
0x14 |
N/A |
1 |
|||
0x18 |
N/A |
1 |
|||
0x1C |
N/A |
1 |
1 写保留比特将不会对硬件有任何影响,读保留比特则会返回未知数值
2序列码只有在调度核的高级特性被使能的时候才会出现
CSR状态寄存器
表10:CSR状态寄存器各比特定义
比特 |
名称 |
描述 |
0 |
Busy |
当调度模块还缓冲有命令或者某个master还在传输数据时设置本比特 |
1 |
Descriptor Buffer Empty |
当读和写命令缓冲都空的时候设置本比特 |
2 |
Descriptor Buffer Full |
当读或者写命令缓冲为满的时候设置本比特 |
3 |
Response Buffer Empty |
当响应缓冲为空的时设置本比特 |
4 |
Response Buffer Full |
当响应缓冲为满时设置本比特 |
5 |
Stopped |
当手动停止SGDMA或在有错误或提前结束发生时由调度模块停止SGDMA,或有上述情况之一发生时设置本比特。若手动停止SGDMA本比特只有在master完成任何正在进行中的读写操作后才会被置有效。 |
6 |
Resetting |
在写软件复位寄存器以及SGDMA处在复位之中时设置本比特。这个复位周期在确保没有传输和FPGA竞争的时候是必需的。当本比特被置无效后可以继续使用SGDMA。 |
7 |
Stopped on Error |
当调度模块被编程用于停止错误或者一个错误已经进入到写主控模块时,该比特被设置。 |
8 |
Stopped on Early Termination |
当调度模块被编程用于在提前终止时停止,以及在写主控模块执行包传输的时候在传输描述符长度字段里预先设置的传输数量前没有收到EOP的时候设置本比特。如果不希望看到提前终止,可以在描述符里设置长度为0xFFFFFFFF,这样会使得传输获得可能的最大包长度(提前终止在包传输的时候总是被使能)。 |
9 |
IRQ |
当中断情况发生的时候被置位 |
31-10 |
|
N/A |
CSR控制寄存器
表11:CSR控制寄存器各比特定义
Bit |
Name |
Description |
0 |
Stop Dispatcher |
设置本比特将停止SGDMA的一次事务。若一个读或写操作正在进行,那么该操作则会被允许完成。通过读状态寄存器的停止位来确定SGDMA何时已经被停止了。调度核复位后,默认是开始操作模式。 |
1 |
Reset Dispatcher |
设置本比特将复位调度核以及所有mater模块的寄存器和FIFO。由于复位需要多个时钟周期才能完成,这是因为传输需要经过多个模块,所以需要通过读取状态寄存器的复位字段来确认完整的复位周期是否已经完成。 |
2 |
Stop on Error |
设置本比特将阻止SGDMA向master模块提交更多的读写命令当有一个错误进入写主控模块的接收端口的时候。 |
3 |
Stop on Early Termination |
当进行包传输的时候,设置本比特将阻止SGDMA向master模块提交更多的读写命令如果写主控模块试图写更多超过用户在长度字段指定数据。长度字段在包传输的时候总是被使能,且用于限制多少数据可以被传输。 |
4 |
Global Interrupt Enable Mask |
设置本比特将允许中断传输到中断发送端口。这个屏蔽发生在寄存逻辑之后,这样可以确保在屏蔽禁用后所有中断都不会丢失。 |
5 |
Stop Descriptors |
设置本比特将会阻止SGDMA调度模块提交更多的描述符到读或者写主控模块。通过读状态寄存器的停止字段来确定调度模块何时已经停止提交命令以及何时读写主控模块开始空闲。 |
31-6 |
|
N/A |
响应寄存器
表12:响应寄存器映射
|
|
Byte Lanes |
|||
Offset |
Access |
3 |
2 |
1 |
0 |
0x0 |
Read |
Actual Bytes Transferred[31:0] |
|||
0x4 |
Read |
2 |
|
Early Termination1 |
Error[7:0] |
1 提前结束字段是一单一比特,位于偏移地址0x4的比特8
2读字节7会弹出FIFO响应
带模块化SGDMA控制器的编程(略)
文章评论(0条评论)
登录后参与讨论