高级Avalon总线传输
本节描述高级Avalon总线传输,包括带延迟的总线传输、流传输模式和Avalon总线控制信号。
4.6.1 带延迟的AvaIon读传输
一些同步外设在第一次访问时需要几个周期的延迟,但此后能够在每个总线周期返回数据。针对这样的外设,延迟读传输模式可以提高通讯带宽。因为Avalon写传输不需要由从端口返回确认信号,所以没有带延迟的Avalon写传输。延迟传输使得主端口可以发起一次读传输,转而执行一个不相关的任务,然后再接收数据。这一过程经常被称作“postedreads”。尽管上一次读传输的数据还没有返回,这个不相关的任务也可以是发起另一次读传输。在CPU取指令操作和DMA传输中,延迟传输是非常有用的。在这两种情况下,CPU或DMA主端口会预取期望的数据,从而使同步存储器保持激活状态,并减少平均访问延迟。
延迟读传输模式的传输周期可以分为两个独立的阶段,地址阶段和数据阶段。延迟传输的关键是将传输的地址和数据阶段隔绝。为此提供了一个附加的控制信号readdatavalid,用来指示从readdata端口返回了有效的数据。
控制地址和数据阶段的逻辑类似于两个半独立的端口。一个地址端口在地址阶段发起传输,一个数据端口通过在数据阶段交付数据来完成传输。地址和数据端口是独立操作的,只是数据端口返回的是由地址端口请求的数据。发出地址和控制信号来发起传输同捕获结果数据是独立操作的,也可能是同时的。在Avalon总线模块捕获了地址之后,主端口便可以自由地执行其他操作,包括发起更多的读传输。稍后(或立即)在数据阶段,从端口返回有效的readdata并且相应主端口的readdatavalid被置为有效。
延迟和等待周期是不同的,但它们可以同时出现在一个传输中:
● 等待周期——从外设的等待周期决定了地址阶段的长度(即捕获地址需要多少时 钟周期),从而确定了最大吞吐量。例如,如果一个从端口需要一个等待周期来提 供有效数据,那么在最佳情况下,该端口只能每两个时钟周期完成一次传输
● 延迟——延迟决定了数据阶段的长度(即返回有效数据需要多少时钟周期),但不 影响地址阶段。例如,当访问一个无等待周期的延迟从端口时,一个支持延迟操 作的主端口能够每个时钟周期发起一次新的读传输。主端口能够维持最大吞吐量, 尽管它会在第一个有效的readdata返回时等待几个周期的延迟
SOPC Builder自动生成的Avalon总线模块能够将各类有延迟和无延迟的主从外设无缝地连接起来。
4.6.1.1 带固定延迟的从端口读传输
带固定延迟的从端口必须在系统PTF文件中声明一个非零的Read—Latency参数。具有非零延迟的Avalon从端口在从Avalon总线模块捕获了地址和控制信号后会再花费一个或多个总线周期来产生数据。在从端口捕获了地址之后,Avalon总线模块可以立即发起一次新的传输,即使前一次传输的有效的readdata还没有返回。"
带延迟的从端口读传输包含两个独立的阶段:地址阶段和数据阶段。在地址阶段的信号时序除了readdata信号外与无延迟的Avalon总线传输相同。在地址阶段期间,从端口可以使用建立时间和等待周期,包括外设控制等待周期。在建立时间和等待周期结束之后,从端口必须在传输的最后一个时钟上升沿之前捕获地址。在无延迟的读传输中,有效的readdata总是在最后一个clk上升沿出现。而对于带延迟的传输,readdata不在地址阶段中出现。在地址阶段结束后,Avalon总线模块能够立即发起新的传输。
在数据阶段,外设经过多个时钟周期对地址进行处理并在一个固定的延迟之后生成readdata。如果外设的读延迟是N,从端口必须在address被捕获后的第N个clk上升沿提供有效的readdata。这一延迟是固定的,从端口必须绝对保证在它捕获了address之后的第N个总线周期提供有效的readdata。例如,如果一个从端口的读延迟为l(即PTF文件巾声明了Read_Latency=1),从端口必须在捕获address后的下一个(即第一个)clk上升沿提供有效数据。存从端口提供了readdata之后数据阶段与总线传输结束。
例4.14显示了在Avalon总线模块和一个具有PTF参数Read_Latency=2的延迟从端口之间的多次传输。从端口采用了外设控制的等待周期。带非零延迟的从端口读传输并不保证访问顺序的地址。例如,若系统中有多个主端口,从端口不能控制(也不知道)Avalon总线模块授权的主端口访问顺序。具有非零读延迟的从端口能够被不支持延迟操作的主端口访问。而且在这种情况下并不需要特别的设计考虑。Avalon总线模块只需简单地在每次传输时使主端口等待到从端口返回有效数据为止,便可适应这种情况。这种情况使得这一特定的主从端口对之间只能同时进行一次传输。
时序说明:
(A)Avalon总线模块通过为新传输的地址阶段提供chipselect、read_n和address发起一次读传输;
(B)从端口已设置waitrequest有效,因而前一个总线周期成为一个等待周期。Avalon总线模块保持chipselect、read_n和address不变;
(C)从端口置waitrequest无效并在该clk上升沿捕获address。地址阶段结束,数据阶段由此开始;
(D)第一个延迟周期结束于该clk上升沿;
(E)第二个延迟周期结束于该clk上升沿。从端口提供了有效的readdata,传输到此结束。该clk上升沿还标志着一次新的读传输的开始;
(F)Avalon总线模块为下一次读传输设置chipselect、read_n和address有效;
(G)Avalon总线模块在下一个总线周期,上次传输的数据尚未返回之前发起另一次读传输:
(H)Avalon总线模块在两个延迟周期之后捕获readdata;
(I) Avalon总线模块在两个延迟周期之后捕获readdata。
例4.14带延迟的从端口读传输

4.6.1.2 带可变延迟的从端口读传输
Avalon接口允许从端口在可变的延迟之后返回有效数据。带可变延迟的从端口读传输与带固定延迟的从端口读传输相似,也采用同样的地址阶段和数据阶段的概念。带可变延迟的从端口读传输使用了一个附加的信号readdatavalid用来标记何时提供给Avalon总线模块有效数据。
具有可变延迟的从端口不能在系统PTF文件中声明非零的Read_Latency参数。非零的Read_Latency值会使该端口声明为具有固定延迟。具有可变延迟的从端口还必须在系统PTF文件中声明一个非零的Maximum_Pending_Read_Transactions参数。挂起的读传输(pending read transfer)是指正在进行中的传输,它已经完成了地址阶段(即从端口已经从Avalon总线模块捕获了地址),但相应的readdata结果还没有返回.总端口最多只能接受一个预先定义的固定数量的挂起传输,该数量由.Maximum_Pending_Read_Transactions参数确定。
在地址阶段之后,具有可变延迟的从外设可以占用任意数量的总线周期,然后返回有效的readdata。当外设准备好返回有效数据时,它同时将readdata和readdatavalid置为有效,并保持一个时钟周期。数据阶段和整个传输在下一个时钟上升沿结束,Avalon总线模块在此时捕获readdata和readdatavalid。从端口必须按照它接收地址的同样顺序返回readdata。
具有可变延迟的从端口必须在它从Avalon总线模块捕获了address后的至少一个时钟周期之后再返回readdata。换句话说,具有可变延迟的从端口不能异步地提供readdata,使得Avalon总线模块在设置address有效之后的下一个时钟上升沿就要捕获数据。这样的时序便会和无等待周期且无延迟的从端口读传输一样了。
如果一个从端口希望达到其最大数据吞吐量,则需要使用外设控制的等待周期。当从外设已经达到其最大数据吞吐量时,如果读的传输要求到来,从外设必须设置waitrequest信号使之暂停。一般来说,外设的用户不必精确地估计最大数据吞吐量:从外设只需在它的内部读请求缓冲区或FIFO写满时简单地设置waitrequest有效(挂起读传输操作),就会引起适当的暂停行为。然而,用户必须确定从外设同时能够挂起的读传输的最大数量,该值确定了该从端口的Maximum_ending_Read_Transactions参数值(PTF文件中)。
例4.15显示了在Avalon总线模块和一个具有可变延迟且有PTF参数Maximum PendinK Read Transactions=2的从端口之间的几次传输。从端口采用了外设控制的等待周期。
例4.15带可变延迟的从端口读传输

时序说明:
(A)Avalon总线模块设置address、read_n和chipselect有效,发起一次读传输。假定这时从外设没有挂起的传输;
(B)从外设未置waitrequest有效,因而在该clk上升沿捕获了addressl;
(C)从外设未置waitrequest有效,因而在该clk上升沿捕获了address2;
(D)从端口已经达到它允许的挂起传输的最大数量,但还没有有效的数据返回。从外设在下一个clk上升沿之前置waitrequest有效,使得Avalon总线模块保持address、read_n和chipselect不变。外设将waitrequest保持两个总线周期,直到它能够返回第一个挂起传输的数据;
(E)外设驱动有效的readdata(datal)并置readdatavalid有效,这结束了第一个挂起传输的数据阶段。外设使waitrequest失效表明它能够在下一个clk上升沿接受其他挂起传输。外设不必因为挂起传输少于最大数量就使waitrequest失效,它可以保持waitrequest以暂停任何传输;
(F)Avalon总线模块在该clk上升沿捕获data1。从外设在该clk上升沿捕获address3;
(G)由十从外设仍保持readdatavalid有效,Avalon总线模块在该clk上升沿捕获data2(返回data2需要4个时钟周期的延迟)。Avalon总线模块设置address、read_n和chipselect有效,从外设捕获address4;
(H)由于从外设仍保持readdatavalid有效,Avalon总线模块在该clk上升沿捕获data3(注意返回data3需要2个时钟周期的延迟)。Avalon总线模块设置address、read_n和chipselect有效,从外设捕获address5;
(I)由于从外设仍保持readdatavalid有效,Avalon总线模块在该clk上升沿捕获data4。Avalon总线模块设置address、read_n和chipselect有效,结束了这一读传输序列;
(J)由于从外设已使readdatavalid失效,Avalon总线模块在该clk上升沿未捕获数据;
(K)Avalon总线模块在该clk上升沿捕获readdata,结束了最后一个挂起传输的数据阶段。
每次传输从端口都必须返回有效的数据,即从端口也不能拒绝任何一次传输。一旦Avalon总线模块通过设置address和read_n有效发起了从端口读传输,从端口必须返回有效数据并结束传输。从端口能够控制的只是它们何时返回数据。从外设能够将Avalon总线模块暂停任意长的时间。
Avalon总线模块即使在从外设正在处理一个或多个挂起的读传输时也能够发起从端口写传输。从端口仍然有责任为所有的挂起的读传输返回数据。如果从外设在处理挂起的读传输时不能处理写传输,它可以置waitrequest有效并暂停写操作直到挂起的读传输完成。
如果从端口接受了一个与当前挂起的读传输地址相同的写传输,读传输的结果取决于外设。从端口可以返回这一地址在写操作之前的数据,也可以返回这一地址在写操作之后的数据。
当从端口指定了可变延迟后,对于其他的总线传输模式会有以下的限制:
● 具有可变延迟的从端口不能使用固定的等待周期
● 总线类型为“avalon_tristate”的从端口不能具有可变的读延迟
● 总线类型为“avalon_tristate”的从端口不能包含readdatavalid输出端口注意:这些限制只对该从端口有效,不影响连接在Avalon总线模块上的其他外设。
4.6.1.3 带延迟的主端口读传输
支持延迟操作的丰外设会额外使用readdatavalid信号。支持延迟操作的主外设能够在它接收到先前传输的有效数据之前发起新的主端口读传输。而无延迟的Avalon主端口读传输在主端口捕获数据之前不会结束,不能发起新的主端口读传输。
带延迟的主端口读传输包含两个独立的阶段:地址阶段和数据阶段。在地址阶段中信号时序除了readdata信号外与无延迟的Avalon总线传输相同。主地址端口必须提供read以及(如有必要)adderss和byteenable信号,并在它的waitrequest输入有效期间必须使这些信号保持稳定。地址阶段结束于waitrequest无效后的第一个clk上升沿。在无延迟的读传输中,有效的readdata在最后一个clk上升沿总是有效的。而对于延迟不为零的传输,readdata在地址阶段之后不会立即返回。当Avalon总线模块设置readdatavalid有效时,才标志readata有效。在地址阶段结束后,主地址端口能够立即发起另一次读或写传输。
对于支持延迟操作的Avalon主端口有两条规则:
● 一旦发起了一次传输,就要留意waitrequest信号
● 对于每次读传输,readdatavalid只保持一个时钟周期有效。主端口必须在 readdatavalid被置为有效的clk上升沿捕获有效的readdata
Avalon总线模块总是按照主端口请求的顺序返回有效的readdata。Avalon总线模块在它提供有效的readdata时设置readdatavalid有效。主数据端口必须在readdatavalid被置为有效的同一个时钟上升沿捕获readdata。这一时钟周期是能保证readdata有效的惟一时间。如果发生了某种情况使得主端口不能立即处理输入的readdata,土外设必须拥有FIFO缓冲区以保证来自Avalon总线模块的数据不会丢失。
对于支持延迟操作的主端口,延迟的时钟周期数不是固定的。Avalon总线模块不能保证何时会返回有效的readdata,只能保证数据会按照它被请求的顺序返回。因而,主数据端口必须设计成能够接受任意数量的延迟周期。除了满足具有延迟的从端口要求外,Avalon总线模块还会引入其他的延迟周期。例如,如果外设挂接在Avalon三态桥时,通常会引入额外的延迟。虽然三态桥包含了会引起延迟的内部寄存器,但这些寄存器改进了系统的fMAX并简化了与片外设备的连接。
支持延迟操作的主端口可以访问无延迟的从端口而不需要别的考虑。从主端口的角度来看,这时延迟为零。readdata在地址阶段结束时的clk上升沿立即有效,这与无延迟的Avalon总线传输相同。对于并发多主端口传输也不需要特别的考虑。如果系统中存在多个主端口,并分别向有延迟和无延迟的从端口发起了读传输,Avalon总线模块会执行适当的仲裁,并保证每个主端口能按顺序接收到它们要求的数据。这也包括主端口向一个从端口发出address,同时从另一个从端口捕获readdata的情况。
主端口有时会需要在数据还未返回时,终止已发起的传输。在这种情况下,主端口可以使用flush信号来清除所有的挂起的读传输。例如,一个用于读取CPU指令的支持延迟操作的主端口可以发起多个读传输来预取指令,但是如果遇到了转移指令,所有挂起的预取指令都变得没有用了。主数据端口可以在一个clk上升沿设置flush有效来清除所有挂起的传输。readdatavalid被置为无效直至下一个新的读传输的数据在readdata端口上准备好了。Avalon总线模块可以在flush信号被置为有效的同时捕获address端口上的新值。这一地址对应的数据成为在readdata上返回的下一个有效数据。
例4.16显示了在Avalon总线模块和支持延迟操作的主端口之间的带延迟的数据传输。在这个例子中,waitrequest和readdatavalid何时以及为何设置没有一定的模式。然而这个例子显示了主端口必须随时对waitrequest和readdatavalid做出合适的响应。在这个例子中,倒数第二个传输被flush信号清除了。但是,如果这一传输的延迟比较短,不需要的数据可能会已经出现在readdata上。
例4.16带延迟的主端口读传输

时序说明:
(A)主端口通过为新传输的地址阶段提供address和read_n发起一次读传输;
(B)Avalon总线模块已设置waitrequest有效,因而主端口需要等待并将address和read_n再保持一个时钟周期的稳定;
(C)此时waitrequest无效,因而Avalon总线模块在该clk上升沿捕获address。此时readdatavalid无效,因而主端口不捕获readdata;
(D)Avalon总线模块在该clk上升沿捕获了新的address。此时readdatavalid无效,因而主端口不捕获readdata;
(E)Avalon总线模块在该clk上升沿捕获了新的address(使得挂起传输的数量达到了三个)。此时readdatavalid有效,因而主端口捕获了有效的readdata;
(F)此时readdatavalid无效,因而主端口不捕获readdata;
(G)此时readdatavalid无效,因而主端口不捕获readdata;
(H)此时readdatavalid有效.因而主端口捕获了有效的readdata:
(I)主端口为一个新的读传输提供了address和read_n;
(J)此时readdatavalid无效,因而土端口不捕获readdata。flush已置为有效,因而Avalon总线模块清除了挂起的传输。Avalon总线模块捕获了新的address;
(K)此时readdatavalid有效,因而主端口捕获了有效的readdata。没有任何挂起传输了。
4.6.2流传输模式
流传输模式在流模式主外设和流模式从外设之间建立一个开放的信道以提供连续的数据传输。这个信道使得只要存在有效数据便能在主从端口对之间流动,主外设不必为了确定从端口是否能够发送或接收数据而不断地访问从外设的状态寄存器。流传输模式使得主从端口两者之间的数据吞吐量达到最大,同时避免了从外设的数据上溢或下溢。它对于DMA传输特别重要。例如一个DMA控制器可能只包含简单的流控制信号和一个计数器,它用来在一个从外设和一个存储器之间连续地传输数据。
4.6.2.1 流模式从端口传输
除了在基本从端口传输中使用的信号之外,流模式外设的接口中又引入了三个信号:readyfordata、dataavailable和endofpacket。流模式从端口就是指使用了一个或多个上述信号的从端口。从端口通过设置readyfordata有效来表示它己准备好接受来自Avalon总线模块的写传输。从端口通过设置dataavailable有效来表示它已能够为来自Avalon总线模块的读传输提供数据。当这些信号无效时,会迫使Avalon总线模块(以及发起传输的流模式主端口)等待,直到从端口准备好继续为止。
Avalon总线模块只在readyrfordata或dataavailable有效时才会发起传输的行为(仅适用于在流模式主从端口对之间传输的情况)。非流模式的主端口可以随时向从端口发起传输,不管从端口是否为流模式端口。例如,Avalon总线模块可以向一个流模式从端口发起一个来自于非流模式主端口(CPlU)的从传输,即使此时另一个来自于流模式主端口(DMA控制器)的传输正因为dataavailable无效而在等待。
在任何传输期间,流模式从端口可以设置endofpacket信号有效。此信号通过Avalon总线模块传递到主外设以便它能响应。对于endofpacket信号的解释取决于用户设计。endofpacket信号不保证Avalon总线模块会停止到从端口的传输流。例如,endofpacket可以用作包描述器,使得主外设能在一个长的数据流中知道包的开始与结束位置。此外,endofpacket也可设计为用来中断传输流,迫使主端口稍后继续进行读或写传输。
流模式从端口读传输
流模式从外设通过设置dataavailable有效来表示它能够接收读传输。Avalon总线模块在dataavailable无效时不能发起读传输。当dataavailable有效时,Avalon总线模块能够通过在一个clk上升沿设置chipselect有效来开始一次读传输,这与其他的Avalon读传输相似。read n、byteenable_n和readdata的时序与一般的从端口读传输相同。用户可以设置建立时间和等待周期,包括外设控制的等待周期。
在传输结束后,如果外设不能立刻为以后的读传输提供数据,则必须置dataavailable无效,使得Avalon总线模块不会试图在下一个clk上升沿发起另一次新的读传输。当外设置dataavailable无效时,会迫使Avalon总线模块将到这一从端口的chipselect、read_n、address和byteenable_n置为无效。因此,在外设将dataavailable再次置为有效之前,Avalon总线模块不会对该从端口发起另一次读传输。如果流模式主端口在从端口的dataavailable无效时发起了一次读传输(或继续发起连续的读传输),Avalon总线模块会简单地迫使主端口等待,直到从端口能够再次传输数据。
Avalon总线规范不规定endofpacket的功能,该信号只是简单地通过Avalon总线模块传递给主端口。从端口应当在它设置有效的readdata的同时设置endofpackt有效,这使得主端口可以在捕获readdata的同时捕获endofpacket。从端口可以每次传输都使endofDacket失效,也可以无限期地使endofpacket有效,并等待主端口将它复位。
例4.17显示了流模式从端口读传输。在这个例子中,假定一个Avalon流模式主外设发起了一个流传输模式读序列,传输在从端臼的dataavailable有效时开始,此外假定主端口会连续不断地发起流传输操作。在传输中的某一时刻,从端口使dataavailable失效,迫使Avalon总线模块(以及主端口)等待。此后从端口再次设置dataavailable有效,Avalon总线模块继续从端口读取数据。在本例中,注意数据是从一个固定的从端口地址中读出的。从端口每次都提供新的数据。这种操作在寄存器控制的外设中是常见的,例如UART和SPI。
例4.17中的从端口在使dataavailable失效之前的最后一个数据单元上设置endofpacket有效。这不是必须的,endofpacket同dataavailable以及主外设如何响应没有内在的联系。当dataavailable仍旧有效时,Avalon总线模块使chipselect和read_n失效,从而结束了传输序列。这意味着是主端口,而不是从端口,有权结束传输序列。
例4.17流模式从端口读传输

时序说明:
(A)第一个总线周期开始于clk上升沿;
(B)从Avalon总线到从端门的锁存输出address和read_n有效;
(C)Avalon总线模块对address译码,然后置chipselect有效;
(D)从端口在下一个clk上升沿之前设置有效的readdata。Avalon总线d在下一个clk上升沿捕获readdata;
(E)在chipselect和read_n保持有效的每一个总线周期中,从端口都产生有效的readdata(在本例中,address保持不变,但并不是所有的外设设计都是如此);
(F)从端口能随时在它设置有效的readdata时设置endofpacket有效(在本例中,从端口在一个总线周期后使endofpacket失效,但这对于不同的外设设计可能会不同):
(G)流模式从端口使dataavailable失效,迫使Avalon总线模块搁置所有后续的流模式读传输。注意此时read_n和chipselect仍然保持有效,表明流模式主端口仍在等待传输的结束;
(H)Avalon总线模块使address、read_n和chipselect失效,以响应dataavailable;
(I)在随后的某一时刻,从端口设置dataavailable有效;
(J)为响应dataavailable,Avalon总线模块重新设置address、read_n和chipselect有效(如果没有挂起的流传输操作,这些信号会继续保持无效);
(K)一个新的流模式读传输开始于clk上升沿;
(L—M)从端口在chipselect和read_n保持有效的每一个clk上升沿之前设置有效的readdata;
(N)Avalon总线模块使read_n和chipselect失效,表明现在没有挂起的流传输操作了:
(O)在本例中dataavailable继续保持有效,表明另一次流传输操作可以开始于随后的任一总线周期。
流模式从端口写传输
流模式从外设通过设置readyfordata有效来表示它能够接受写传输。Avalon总线模块在readyfordata无效时不能发起写传输。当readyfordata有效时,Avalon总线模块能够通过在一个cll上升沿设置chipselect和address有效来开始一次写传输。这与其他的Avalon写传输相似。write_n、byteenable_n和readdata的时序与一般的从端口写传输相同。基于系统PTF文件中的声明,传输可以使用建立时间、保持时间和等待周期,包括外设控制的等待周期。
在一次传输结束后,如果外设不能接受随后的写传输数据,则必须置readyfordata无效,使得Avalon总线模块不会在下一个clk上升沿发起另一次写传输。当外设使readyfordata失效时,会迫使Avalon总线模块将送到这一从端口的chipselect、write_n、address和byteenable_n置为无效。因此,在外设将readyfordata再次置为有效之前,Avalon总线模块不会对该从端口发起另一次写传输。如果流模式主端口在从端口的readyfordata无效时发起了一次写传输(或继续发起连续的写传输),Avalon总线模块会简单地迫使主端口等待,直到能再次从从端口捕获数据。
Avalon总线规范不规定endofpacket的功能。该信号只是简单地通过Avalon总线模块传递给主端口。从端口应当在它从Avalon总线模块捕获了writedata后立即设置endofpacket有效。而且必须在chipselect失效前设置endofpacket有效,以便主端口能在同一总线传输中捕获endofpacket。从端口可以每次传输都使endofpacket失效,也可以无限期地使endofpacket有效,并等待主端口将它复位。如果流模式从外设需要一定的保持时间(非常少见的情况),那么endofpacket应当保持有效直至Avalon总线模块使chipselect失效(即使在write_n已失效后)。
例4.18显示了流模式从端口写传输。在这个例子中,假定一个Avalon流模式主外设发起了一个流传输操作序列,传输在从端口的readyfordata有效时开始。此外假定主端口会连续不断地发起写传输。在传输序列中的某一时刻,从端口使:readyfordata失效,迫使Avalon总线模块(以及丰端口)等待。此后从端口再次设置readyfordata有效,Avalon总线模块继续从端口写传输序列。在本例中,注意数据是向一个固定的从端口地址中写入的。这在操作一个寄存器控制的外设时是常见的,例如UART和SPI。
例4.18显示了从端口在写传输序列期间设置endofpacket有效。这种操作依赖于主外设和从外设的设计。endofpacket同readyfordata以及主外设如何响应没有内在的联系。当readyfordata仍旧有效时,Avalon总线模块使chipselect和write_n失效,从而结束了传输序列。这意味着是主端口,而不是从端口,有权结束传输序列。
例4.18流模式从端口写传输

时序说明:
(A)第一个总线周期开始于clk上升沿;
(B)从Avalon总线到从端口的锁存输出address、write_n和writedata有效;
(C)Avalon总线模块对address译码,然后置chipselect有效;
(D)如有必要,从端口在当前总线传输的最后一个clk上升沿之前置endofpacket有效。在本例中,从端口在一个总线周期后使endofpacket失效,但这对于不同的外设设计可能会不同;
(E)从端口在该clk上升沿捕获writedata和address;
(F-G)在chipselect和write_n保持有效的每一个总线周期中,Avalon总线模块都产生有效的writedata,且从端口必须在下一个clk上升沿捕获数据。在本例中,address保持不变,但并不是所有的外设设计都是如此;
(H)流模式从端口使readyfordata失效,迫使Avalon总线模块搁置所有后续的流模式写传输。注意此时write_n、chipselect和writedata仍然保持有效,表明流模式主端口仍在等待传输的结束。作为对readyfordata的响应,Avalon总线模块随后使address、write_n、chipselect和writedata失效;
(I)在随后的某一时刻,从端口再次设置readyfordata有效;
(J)为响应readyfordata,Avalon总线模块重新设置address、write_n、chipselect和writedata有效。注意如果没有挂起的流传输操作,这些信号会继续保持无效。一个新的流模式写传输开始于下一个clk上升沿;
(K-L)从端口在该clk上升沿捕获writedata。在chipselect和write_n保持有效的每一个总线周期,Avalon总线模块提供有效的writedata;
(M)Avalon总线模块使write_n和chipselect失效,表明现在没有挂起的流传输操作了。在本例中readyfordata继续保持有效,表明另一次流传输操作可以开始于随后的任一总线周期。
4.6.2.2流模式主端口传输
流模式主外设的接口与一般的Avalon主传输的接口几乎相同。流模式主传输接口只引入了一个额外的信号endofpacket,是否需要该信号取决于外设的设计。write_n、read_n、address、writedata、readdata、byteenable_n以及其他信号的时序与一般的主传输相同。
如果Avalon总线模块要求主端口等待,会设置waitrequest信号有效,而且主端口必须服从。以下情况主端口需要等待:另一个主端口可能正在访问目标从端口;从端口可能正在请求等待周期;流模式从端口也许不能提供或接受新的数据,等等。主端口不必关心引起waitrequest的原因。因为在任何情况下,一旦传输已经开始,主端口便不能取消它。Avalon总线模块内部的逻辑对主端口隐藏了细节,简化了流模式主外设的设计。
如果提供了endofpacket信号,该信号在每次传输期间由从端口传递到主端口。对于主端口读和写传输,主端口都在传输的最后一个时钟上升沿捕获endofpacket。对endofpacket信号的解释依赖于外设的设计。例如,endofpacket可以用作包描述器,使得主外设能在一个长的数据流中知道包的开始与结束位置。此外,主端r]也可设计为根据endofpacket的值来决定是否发起另一次传输。
不论外设是否为流模式外设,Avalon总线模块都没有为主端r]提供超时特性。主端口必须在waitrequest保持有效期间一直暂停,且无法取消传输。因此,如果主端口需要一种手段能够仅在从端口准备好时有条件地传输数据,主从端口对之间必须使用某种约定,约定可通过endofpackel或从外设内部的状态寄存器实现。
Avalon总线规范不规定endofpacket的功能,该信号只是简单地通过Avalon总线模块由从端口传递到主端口。主端口必须在当前传输的最后一个clk上升沿捕获endofpacket。在这一时钟上升沿Avalon总线模块使waitrequest失效,且主端口已准备好结束传输。从端口为何以及何时使endofpacket失效取决于外设的设计。然而,主端口只能在流传输操作期间,且访问的从端口定义了endofpacket时,才能看到有效的endofpacket信号。
例4.19显示了流模式主端口传输。在这个例子中,一次流模式主端口读传输紧跟在一次流模式主端口写传输之后,在传输中waitrequest和endofpacket:都在某个时间被置为有效。
例4.19流模式主端口传输

时序说明:
(A)第一个总线周期开始于clk上升沿;
(B)主端口设置有效的address、write_n和writedata;
(c)Avalon总线模块在下一个clk上升沿之前置waitrequest有效,迫使主端口等待;
(D)waitrequest在该clk上升沿保持有效,因而主端口保持address、write_n和writedata不变;
(E)Avalon总线模块置waitrequest无效:
(F)Avalon总线模块在该clk上升沿捕获writedata;
(G)流模式主端口继续保持address和write_n有效并设置了新的writedata。注意address不必保持不变,这取决于外设的设计;
(H)如有必要,主端口在当前总线传输的最后一个clk上升沿捕获endofpacket。主端口通过使address、write_n和writedata失效结束了流模式写传输;
(1)主端口通过设置read_n和一个有效的address在下一个总线周期立即开始了一次读传输;
(J)Avalon总线模块设置waitrequest有效,表明它不能在下一个clk上升沿返回有效数据;
(K)最终Avalon总线模块使waitrequest失效,并提供了有效的readdata。在本例中,Avalon总线模块设置endofpacket有效,但对它的解释留给了流模式主外设;
(L)主端口在该clk上升沿捕获readedata和endofpacket.
(M)主端口为另一次流模式读传输继续保持address和read_n有效,因此Avalon总线模块提供了有效的maddata;
(N)主端口使address和read_n失效,从而结束了传输。
4.6.3 Avalon总线控制信号
Avalon总线模块为系统级功能提供了一些控制信号。这些信号与单独的数据传输的功能不直接相关。
中断请求信号
大多数微处理器系统都要求有中断产生与优先级仲裁逻辑。Avalon总线模块也提供这一服务。
每个从端口都可以使用一个irq输出信号,每当外设需要产生中断时可以置该信号有效。Avalon总线规范不规定为何以及何时应当设置irq。irq信号的时序与任何总线传输都没有关系,而且irq可以随时被设置。在大多数实际情况下,从端口应当设置irq并将它保持有效,直到主端口明确地将这一中断请求复位。每个使用irq的从端口都赋予一个中断优先级。每个从端口的IRQ优先级都定义在系统PTF文件中。较低的IRQ值具有较高的中断优先级,IRQ0具有最高的优先级。
主端口可以使用两个输入信号来处理中断结果:irq和irqnumber。在系统模块中所有从外设的irq输出信号通过逻辑或连接在一起并传递给主端口。因而当任何一个从端口产生中断时,主端口上的irq信号都会有效。Avalon总线模块内部逻辑向6位的irqnumber端口提供了最高优先级IRQ的编码值(0到63)。如果多个主端口都使用了irq和irqnumber,每个主端口都会在irq和irqnumber上收到同样的值。Avalon总线规范不规定系统模块中的主外设何时以及如何响应irq信号。在大多数实际情况下,主端口必须响应irq,并在此后由主端口来复位从外设的中断请求。
复位控制逻辑
系统模块有一个复位输入端口,系统模块外部的用户自定义逻辑可以使用该端口复位系统模块以及它包含的任何外设。这一全局的复位信号与系统模块内部的其他复位逻辑结合存一起,并分发给所有使用了reset信号的Avalon外设。每个Avalon外设都能按照外设设计的需要解释(或忽略)reset信号。
存系统模块内部,reset信号会在三种情况下设置:
● PLD被重新配置——在PLD完成配置之后,Avalon总线模块立即检测到这一状 态,并在所有的Avalon外设上设置reset信号有效并保持至少一个时钟周期
● 系统模块上的全局复位输入信号被置为有效
● 一个Avalon从端口将其。resetrequest信号(在后而定义)置为有效
一般来说,执行跨越多个时钟周期的操作的外设每当reset有效时应当进入一个明确定义的复位状态。reset信号的时序与任何总线传输都没有关系,而且reset可以随时被设置。 从端口可以使用resetrequest信号来迫使整个系统模块复位。resetrequest对丁类似于看门狗定时器的功能是非常有用的。该定时器如果在一个设定的时间问隔内未得到服务便会复位整个系统。Avalon总线规范没有定义外设应当在何时以及为何设置resetrequest有效。注意reseterquest不是类似于IRQ的请求信号,能在随后某个时间得到服务。resetrequest使得Avalon总线模块立即在所有使用了reset信号的Avalon外设卜设置reset有效,且不允许其他的Avalon外设在应答复位之前结束挂起的操作。
开始传输信号
从端口上的begintransfer输入信号提供了一个易于理解的指示,表示已发起了新的Avalon从传输。Avalon外设必须服从Avalon总线规范,并按照合适的顺序产生和接受Avalon总线信号。对于和Avalon接口不直接相关的逻辑(包括用户的大脑),要精确地确定Avalon从传输在何时开始是比较困难的。因为地址、读使能、写使能和片选信号不能保证在每次传输开始时都会改变。Avalon系统模块会在每一次Avalon读传输的第一个总线周期中设置begintransfer信号有效。对该信号的使用是与外设相关的。
在模拟Avalon传输时,begintransfer信号是一个使结果清晰的有用的调试信号。begintransfer也可以简化具有较低智能外设功能的设计,例如clear-on-read和set-on-write操作,或是其他不需要执行完整的Avalon传输的逻辑的操作。
4.7 片外设备与Avalon总线的接口
本节描述Avalon三态接口,用于将片外设备通过PLD的I/0引脚直接连接到Avalon总线模块上。PTF参数Bus_Type=“avalon_tristate”用来指定一个片外的外设使用Avalon三态接口。大多数系统都需要一个接口来连接某种形式的片外存储器设备。片外存储器设备经常在物理的印刷电路板(PCB)上共享地址总线和数据总线线路。这需要一个包含三态的双向数据引脚的接口,使得其他的外设也能够驱动数据线而不会引起信号的竞争。Avalon三态接口描述了一个适当的用来通过设备I/O引脚连接简单的片外从设备的接口,例如闪存、SRAM以及同步SRAM(SSRAM)。某些Avalon传输模式不支持片外设备。
Avalon三态接口的范围仅限于片外从外设。片外从外设可以使用外设控制的等待周期或是固定的建立时问、保持时问及等待周期。外设可以使用固定的延迟,但不能使用可变的延迟。Avalon三态接口不能扩展到片外主外设。用户可通过创建一个片上的用户自定义外设来连接片外主外设,这一外设用作Avalon接口和片外设备通信协议之间的桥,这样的桥往往较为复杂且特定于某个应用。而不像外部从存储器设备那样被经常使用。因而Avalon总线规范不包括这些情况。
4.7.1 从传输的Avalon三态信号
表4.6列举了片外从外设与Avalon总线模块之间接口的信号类型,信号的方向是以外设的角度定义的。外设提供的端口由外设的设计和PTF文件中的端口定义决定,不需要提供全部的信号类型。表4.6给出了一个简单的描述,说明信号是否必需且在何种环境下使用。表4.6 Avalon三态从端口信号
表4.6 Avalon 三态从端口信号

同非三态的Avalon接口一样,所有的信号类型在添加了“_n”之后便成为低电平有效的形式,例如chipselect_n和write_n。
Avalon三态接口使用双向端口data代替分离的readdata和writedata端口,在写传输期间,Avalon总线模块驱动data端口,从设备捕获data;在读传输期间,从设备驱动data端口,Avalon总线模块捕获data。data端口是双向的,从外设和Avalon总线模块只能在特定的时间驱动data信号线。
Avalon三态接口引入了共享端口的概念。共享端口在将Avalon总线连接到外部设备时能够减少所需的外部引脚数量。PTF参数Is_Shared用于声明一个端口是共享的。一个特定类型的共享端口可以连接到多个片外从设备,并由它们共享。数据端口总是共享的,例如,当Avalon总线模块的data端口连接到PLD的I/O引脚时,这些data引脚可以连接到多个片外外设。其他端口例如address、read和write根据需要也可以共享。如果一个或多个其他外设使用了一个同样类型的端口,并且这些外设的端口也都声明为共享,那么SOPCBuilder就会将这些共享端口复用到相同的设备。I/0引脚上。Avalon三态从外设只能根据chipselect和outputenable的定义,在特定时间响应共享信号。
使用Avalon三态接口的外设必须使用chipselect端口。片外从外设只能在它的chipselect信号有效时接受传输。chipselect不会是共享信号,每个片外外设都由独立的chipselect信号驱动。
Avalon三态接口为从端口读传输引入了outputenable信号类型。为避免data线上的信号竞争,片外从外设只能在outputenable有效时驱动它们的data输出引脚。outputenable主要用于具有延迟的片外存储器设备,例如SSRAM在发起读传输后的几个时钟周期之后驱动data信号线。
4.7.2 无延迟的AValon三态从端口读传输
在将异步的片外存储器设备(如SRAM和闪存)连接到Avalon总线模块时,无延迟的Avalon三态从端口读传输是最常用的。基本Avalon三态从端口读传输所用的信号和时序几乎与(非三态的)基奉Avalon从端口读传输相同,惟一的区别是双向data端口的行为。从外设只能在outputenable有效时驱动它的data信号线。在所有其他时间,从外设必须将其data信号线置为高阻态。固定的建立时问和等待周期,以及外设控制的等待周期也被支持,其时序同非三态时的情况一样。
大多数线路板设计将Avalon的chipselect_n信号直接连接到外部存储器设备的片选引脚(如CSn)上,将Avalon的read_n信号直接连接到输出使能引脚(如OEn)上。Avalon的0utputenable_n信号也可用于驱动外部设备的输出使能引脚(如OEn)。对于无延迟的从传输,outputenable_n信号与read_n是相同的。
某些存储器设备具有组合的R/Wn引脚(即高电平读,低电平写)。Avalon三态write_n信号的行为与此相同,可以连接到RfWn引脚。write_n仅在写传输期间有效,在所有其他时间无效(即表示读).
例4.20显示了具有固定建立时间和固定等待周期的Avalon三态从端口读传输。在这个例子中,address和双向的data端口是共享的。时序图中显示了一个特定外设的data端口的三态行为。然而,由于共享data和address信号的其他外设的传输活动,数据线可以在任何时间被激活。write_n在图中仅作为参考,它在整个传输过程中保持无效(即读方式)。read_n、chipselecL_n和write_n选用低电平有效逻辑,以反映大多数外部存储器设备的惯例。clk仅作为时序参考。
例4.20具有固定建立时间和固定等待周期的三态从端口读传输

时序说明:
(A)Avalon总线模块驱动address,并设置chipselect_n有效;
(B)在一个总线周期的建立时间延迟之后,Avalon总线模块设置read_n有效(在本例中,它与outputenable_n相同);
(c)从外设驱动data以响应read_n。在此时data可以是有效的,也可以是无效的。在本例中,它是未定义的;
(D)在一个总线周期的等待周期期间,Avalon总线模块保持address有效;
(E)在本次传输的最后一个时钟上升沿之前的某一时刻,从外设驱动了有效的data;
(F)Avalon总线在该clk上升沿捕获data,传输到此结束;
(G)从外设使data变为高阻态以响应read_n(当前无效)。
4.7.3带固定延迟的Avalon三态从端口读传输
带延迟的Avalon三态从端口读传输通常用于向Avalon总线模块连接片外的同步存储器设备,例如SSRAM和ZBT SRAM。对于片外设备不支持可变延迟。
带固定延迟的Avalon三态从端口读传输所用的信号和时序几乎与(非三态的)带固定延迟的Avalon从端口读传输相同。惟一的区别是双向data端口的行为,从外设只能在outputenable有效时驱动它的data线。在其他所有时间,从外设必须将其data线置为高阻态。由于有效数据是在几个周期的延迟之后返回的,outputenable在传输的地址阶段结束后仍然有效。固定的建立时间和等待周期也被支持,其时序同非三态时的情况一样。
大多数线路板设计将Avalon的chipselect_n信号直接连接到外部存储器设备的片选或片使能引脚(如CSn或CEn)上。某些同步存储器设备要求片选信号只在地址阶段期间有效,而其他一些设备则要求片选信号在整个传输结束前一直保持有效。Avalon三态接口通过PTF参数Active_CS_SThrougkh_Read_Latency来适应这一变化。当Active—CS_Through Read Latency=l时,chipselect在整个读传输期间保持有效,这时chipselect与0utputenable信号相同;当Active—CS_Through—Read_Latency=0时,chipselect仅在地址阶段保持有效,这时chipselect与read信号相同。
某些同步存储器设备具有组合的R/Wn引脚(即高电平读,低电平写)。Avalon三态write_n信号的行为与此相同,可以直接连接到RfW_n引脚。write_n仅在写传输期间有效,而在所有其他时间无效(即表示读)。
与无延迟的Avalon_一态读传输不一样,outputenable信号和read信号不相同。对于延迟读传输模式,read信号在地址阶段有效,而在数据阶段无效。outputenable信号在传输的最后一个时钟上升沿之前一直保持有效,使得外设可以驱动其data引脚。在一次传输结束后,由于后面的挂起的读传输还要返回数据,outputenable可以继续保持有效。outputenable在没有更多的挂起的读传输时失效。即使在outputenable失效时,data线也可以被一个写传输或共享这一数据线的其他外设的信号激活。因此,每当outputenable失效时从外设将其data线置为高阻态是非常重要的。
例4.2l显示了几次带2个时钟周期固定延迟的Avalon三态从端口读传输。在这个例子中,address和双向的data端口是共享的。outputenable_n、chipselect_n和write_n选用低电平有效逻辑,以反映人多数外部存储器设备的惯例。write_n用作R/Wn选择引脚,在图中仅作参考,它在整个操作期间保持无效。
时序说明:
(A)Avalon总线模块设置chipselect_n、address和read_n有效,发起读传输1。此时outputenable_n也置为有效,表明从设备可以随时自由地驱动data信号线。在本例中,设备未驱动data,信号线仍保持高阻态;
(B)从设备在该clk上升沿捕获address和read_n。数据阶段开始,从设备必须在两个时钟周期之后产生有效数据;
(c)read_n在该clk上升沿失效。由于PTF设置Active_CS_Through_Read_Latency=“l”表示chipselect必须保持到所有挂起的读传输结束,因而chipselect_n继续保持有效;
(D)从设备在数据阶段的最后一个时钟上升沿之前的某个时刻驱动了有效的data (readdatal):
(E)Avalon总线模块在该clk上升沿捕获readdatal。Avalon总线模块设置chipselect_n、address和read n有效,发起传输2;
(F)Avalon总线模块在该clk上升沿设置chipselect_n、address和read_n有效,发起传输3。由于前面的一个空闲总线周期,data线未定义。因为outputenable_n有效,从设备可以驱动data信号线。在本例中,设备未驱动data,信号线仍保持高阻态;
(G)Avalon总线模块在该clk上升沿捕获readdata2。Avalon总线模块在该clk上升沿设置chipselect_n、address和read_n有效,发起传输4;
(H)Avalon总线模块使read_n失效并结束了这个读传输序列。chipselect_n继续保持直到所有挂起的读传输结束;
(I)Avalon总线模块在该clk上升沿捕获readdata3;
(J)Avalon总线模块在该clk上升沿捕获readdata4;
(K)已没有挂起的传输,Avalon总线模块使outputenable_n失效,这迫使从设备将其data信号线置为高阻态。
例4.21 带2个时钟周期固定延迟的三态从端口读传输

4.7.3 Avalon三态从端口写传输
Avalon三态从端口写传输用于将Avalon总线模块连接到可写的片外存储器设备,例如SRAM、SSRAM和闪存。基本Avalon三态从端口写传输所用的信号和时序几乎与非三态基本Avalon从端口写传输相同。惟一的区别是使用双向的data端口取代writedata输入端口。固定的建立时间、保持时间和等待周期,以及外设控制的等待岗期也得到支持,其时序同非三态时的情况一样。如同非三态的Avalon写传输一样,不存在带延迟的写传输模式。
即使一个从外设没有进行传输,data端口(以及其他共享端口)也可能在任何时刻被其他不相关的外设驱动。因此,片外设备只能在chipselect有效时捕获data,并且不能在写传输期间驱动data端口。
线路板设计可以将Avalon的write_n信号直接连接到写使能引脚(如WEn)上。某些同步存储器设备具有组合的R/Wn引脚(即高电平读,低电平写)。Avalon三态信号write_n的行为与此相同,可以连接到R/Wn引脚。write』仅在写传输期间有效,在所有其他时间无效(即读方式)。此外,某些同步存储器设备在写传输期间使用字节使能信号来指定要写入哪个字节段(例如BWnl、BWn2、BWn3和BWn4)。Avalon端口writebyteenable是write信号和byteenable信号的逻辑与,可以直接连接到这样的BWn引脚。
Avalon三态接口不支持延迟写传输。然而,Avalon三态从端口写传输能够成功地将数据写入片外同步存储器设备,如SSRAM和ZBT RAM。举例来说,保持状态可以用于在write失效后将data再保持几个时钟周期有效。Avalon总线模块在发起一个新的写传输之前会等待所有挂起的延迟读传输模式结束,这避免了由于延迟的读数据同写数据碰撞引起的data线上的信号竞争。由于这个原因,Avalon三态接口在执行紧挨着的读一写传输序列时也许不能达到同步存储器设备所允许的最大带宽。然而,Avalon三态接口支持连续的延迟读传输模式以及连续的写传输等最常见的要求高带宽的情形。
例4.22显示了具有固定建立时间和固定保持时间的Avalon三态从端口写传输。在这个例子中,address和双向的data端口是共享的。write_n、chipselect_n和outputenable_n选用低电平有效逻辑,以反映大多数外部存储器设备的惯例。outputenable_n在图中作为参考,在整个传输过程中它一直保持无效,外设不能驱动data信号线。clk仅作为时序参考。
例4.22具有固定建立时间和保持时间的三态从端口写传输


时序说明:
(A)Avalon总线模块驱动address和有效的data,并设置chipselect_n有效;
(B)在一个总线周期的建立时间延迟之后,Avalon总线模块设置write_n有效,并保持一个总线周期(即无等待周期);
(C)Avalon总线模块设置write_n无效,但address和data继续在一个总线周期的保持时间内保持有效;
(D)写传输在clk的此上升沿结束。
4.8 Avalon总线地址对齐方式
4.8.1 地址对齐概述
Avalon总线模块能够适应主从外设的各种不同的和不匹配的数据宽度。例如,32位的主端口可以访问8位的从端口,16位的主端口可以访问32位的从端口。当系统中存在数据宽度不匹配的主从端口对时,便要考虑地址对齐的问题。这一情形并不特定于Avalon总线,它对于所有微处理器系统都存在。
在讨论数据宽度不同的主从端口之间的数据传输时,必须分清哪个外设的数据端口较宽。在较宽的主端门访问较窄的从端口时,问题变为:当较宽的主端口读(或写)较窄的从端口时,如何处理最高有效位(MSBs)? Avalon总线为处理这一情形提供了两种方法:
● 静态地址对齐(Native Address Alignment)——在静态地址对齐方式下,主端口的单个传输精确地对应于从端口的一次传输。例如,当32位的主端口读取16位的从端口时,Avalon总线模块返回一个32位的数据,但只有最低的16个有效位包含了来自从端口的数据,最高有效位可以是0或未定义。这是许多嵌入式系统中典型的“主设备处理一切”的情形。然而,控制主端口的软硬件设计必须意识到所有相关外设的物理地址宽度和编址方案。这增加了主外设的设计复杂性
● 动态地址对齐(Dynamic Bus Sizing)——在动态地址对齐方式下,当较宽的主端 口读取较窄的从端口时,Avalon总线模块执行多次从端口读传输,直至较窄的从 端口数据单元填满主端口的数据宽度。例如,当32位的主端口读取8位的从端口 时,Avalon总线模块返回一个32位字,它由来自从端口的4个有效的字节数据填 充。动态地址对齐抽象了从端口的物理细节,使得各个主端口进行数据传输时好 象从端口的数据宽度总是与主端口一致。动态地址对齐消除了主端口软件将来自 较窄的从外设的数据结合在一起的需要,简化了软件设计
注意:一般来说,存储器外设使用动态地址对齐,所有其他外设使用静态地址对齐。
此外,还存在着较窄的(如16位)主端口连接到较宽的(如32位)的从端口的情形,Avalon总线模块对此也能适应。Avalon总线模块由从端口读取整个32位字,并自动向16位主端口提供合适的半字。在这一情况下,复用32位数据所需的逻辑是集成在Avalon总线模块内部的。
4.8.2 为AvaIon外设选择地址对齐参数
地址对齐参数在系统PTF文件中声明。每一个连接到Avalon总线模块上的从端口都要指定一个地址对齐设置,或是静态,或是动态。主端口不需要地址对齐参数。主端口总是按照其数据宽度接收数据,从端口的地址对齐方式决定了主端口如何理解这些数据。
用作程序或数据存储器的外设应当设置为动态地址对齐方式。从系统级的角度来看,动态地址对齐提供了三项优点:
● 32位或16位的处理器可以使用廉价的8位或16位存储器作为数据和指令存储。若没有动态地址对齐,处理器便不可能从一个比指令宽度还窄的存储器中执行程序
● 存储器的物理宽度对于软件是透明的
● 因为软件不需要拼接数据,软件较为简单且执行速度较快在微处理器只需访问存储器中的单个字节的情况下,处理器可以使用字节操作来读写合适的字节。然而,在大多数情况下,处理器需要传输全宽度的数据。
静态地址对齐适用于所有其他类型的从外设。动态地址对齐不适合于映像到存储器空间的寄存器控制的从外设。对特定控制寄存器的读写传输直接影响外设的运转。处理器通常一次只访问外设的一个控制寄存器。处理器应当读写单个寄存器,而不需要连续地访问到其他不相关的寄存器。
可能会存在一些外设既包含控制寄存器,又包含存储器空间。在这种罕见的情况下,对于设置合适的地址对齐方式有两种解决办法。首先,实际上这样的外设也许是为特定的嵌入式系统特殊设计的,在这种情况下,设计者应当按照主端口的数据宽度设计外设。如果从端口不比主端口窄,地址对齐就不是一个问题了。第二,如果外设设计已经存在且不能为匹配主端口宽度重新设计,接口逻辑应当设计为两个Avalon从接口的组合。一个采用静态地址对齐的从端口映像到外设的寄存器空间,另一个采用动态地址对齐的从端口映像到存储器空间。
4.8.3静态地址对齐
4.8.3.1 32位主端口
下面讨论32位主端口如何理解较窄的从外设中的数据。对于数据宽度为1到8、9到16和17到32位的从外设作分别的讨论。
宽度为1到8位的从端口
在32位主端口与8位从外设传输数据的情况下,只有32位字的8个最低有效位是有效数据,但未被使用的高24位也占用地址空间。
考虑一个假想的8位从外设通过Avalon总线模块连接到一个32位主外设,如NIOS处理器。这个示例外设拥有5个内部的8位寄存器,由表4.7所示。
表4.7 具有五个寄存器的8位从外设

假定这个从外设被设置为静态地址对齐方式,且映像到一个基地址“BASE”。32位主端口读取这个采用静态对齐方式的8位外设的结果如表4.8所示。
表4.8 静态对齐方式到8位外设的32位传输

注:表中uu代表未定义。
在读传输的情况下,来自任何静态对齐的8位(或更窄的)从外设的有效数据出现在提供给主端口的32位值的最低有效位(LSBs)。较高的位未定义。在32位写传输的情况下,较高位的数据被忽略。例如,一个32位主端口向一个4位从端口写入数值0xFEDCBA98,实际写入从端口的值为0x8。
宽度为9至16位的从端口
在32位主端口与宽度为9到16位的外设传输数据的情况下,32位字的最低有效位是有效的数据,但未被使用的较高位也占用地址空间。
考虑一个假想的16位从外设通过Avalon总线模块连接到一个32位主外设,如NIOS处理器。这个示例外设拥有5个内部的16位寄存器,由表4.9所示。
表4.9 具有五个寄存器的16位从外设

假定这个从外设被设置为静态地址对齐方式,且映像到一个基地址“BASE”。32位主端口读取这个采用静态对齐方式的16位外设的结果如表4.10所示。
表4.10静态对齐方式到16位外设的32位传输

注:表中uu代表未定义。
在读传输的情况下,来自任何静态对齐的16位(或更窄的)从外设的有效数据出现在提供给主端口的32位值的最低有效位。较高的位未定义。
在32位写传输的情况下,较高位的数据被忽略。例如,一个32位主端口向一个12位从端口写入数值0xFEDCBA98,实际写入从端口的值为0xA98。
宽度为17到31位的从端口
在32位主端口与17到3l位的内部对齐外设传输数据的情况下,32位字的最低有效位是有效的数据。如果从端口是完整的32位宽,便不需要考虑地址对齐了。
在读传输的情况下,来自任何静态对齐的31位(或更窄的)从外设的有效数据出现在提供给主端口的32位值的最低有效位。较高的位未定义。
在32位写传输的情况下,较高位的数据被忽略。例如,一个32位主端口向一个24位从端口写入数值0xFEDCBA98,实际写入从端口的值为0xDCBA98。
4.8.3.2 16位主端口
下面讨论16位主端口如何理解较窄的从外设中的数据。对于数据宽度为1到8位和9到16位的从外设作分别的讨论。
宽度为1到8位的从端口
在16位主端口与8位从外设传输数据的情况下,只有16位半字中的8个最低有效位是有效数据,但未被使用的高8位也占用地址空间。
仍然考虑那个假想的8位从外设,它通过Avalon总线模块连接到一个16位主外设。假定这个从外设被设置为静态地址对齐方式,且映像到一个基地址“BASE”。16位主端口读取这个采用静态对齐方式的8位外设的结果如表4.11所示。
表4.11 静态对齐方式到8位外设的16位传输

注:表中uu代表未定义。
在读传输的情况下,来自任何静态对齐的8位(或更窄的)从外设的有效数据出现在提供给主端口的16位值的最低有效位。较高的位未定义。
在16位写传输的情况下,较高位的数据被忽略。例如,一个16位主端口向一个4位从端口写入数值0xBA98,实际写入从端口的值为0x8。
宽度为9到16位的从端口
在16位主端口与9到15位的内部对齐外设传输数据的情况下,16位半字的最低有效位是有效的数据。如果从端口是16位宽,便不需要考虑地址对齐了。
在读传输的情况下,来自任何静态对齐的15位(或更窄的)从外设的有效数据出现在提供给主端口的16位值的最低有效位。较高的位未定义。在16位写传输的情况下,较高位的数据被忽略。例如,一个16位主端口向一个12位从端口写入数值0xBA98,实际写入从端口的值为0xA98。
4.8.3.3 在多主外设的系统模块中对静态对齐方式的考虑
在Avalon总线模块上可以连接多个主外设。从端口的地址对齐对于Avalon总线的并发多主设备行为只有很小的影响。
用户也许要考虑如何从多个主外设的视角来理解地址空间映像,考虑两个32位主端口对一个采用静态地址对齐的普通16位从端口编址的情形。这时两个主端口具有相同的宽度,它们对于地址空间的理解是相同的,没有特别需要考虑的事项。
现在考虑一个32位主外设和一个16位主外设,它们都要对前面假想的16位从外设(见表4.9)进行编址的情形。在几乎所有的多个不同宽度的主外设连接到Avalon总线模块的情形下,对于主外设的设计没有特别需要考虑的事项。然而,当考虑到每个主外设如何理解它们相应的地址空间时,这一情形可能会对用户带来概念上的障碍。这一地址空间如表4.12所示。
表4.12 不同宽度的主端口访问16位从外设

注:表中uu代表未定义。
对这一地址空间安排的第一感觉可能比较混乱,因为不同宽度的主外设对于地址空间的理解是不同的。例如,32位主端口在地址BASE+4看到的半字是0xbbbb,而16位主端口在地址BASE+4看到的半字是0XCCCC。对于这种存储不一致的讨论主要是学术性的而不是实践性的。这种不一致性对于真实的系统不会引起问题,这可分为两个基本情况进行讨论:
● 从外设是存储器设备——存储器设备应当设定为动态的而不是静态的地址对齐方 式。动态地址对齐使得所有访问存储器的主端口的地址空间保持一致
● 从外设是由映像到存储器的寄存器控制的——在寄存器控制的外设的情况下,可 以假定控制主端口的软件(或硬件逻辑)对于从外设如何工作有一定的了解,否则主 端口便不能连接该从外设。因此,只要该从外设存在任何特殊的使用要求(包括对 编址的考虑),外设驱动软件必须包含相应的处理代码
在两种情况下,地址空间的不一致性都不会使用户感到意外而造成错误的编址。
4.8.4动态地址对齐
当较宽的主端口访问被设置为动态地址对齐的较窄的从端口时,一次单个的主传输会引起多次的从传输才能得到一个完整的、主端口宽度的有效数据单元。因而,软件不必处理含有未使用位的存储器。
例如,一次对8位存储器从端口的32位主端口读传输会引起对8位存储器的四次从端口读传输。Avalon总线模块在主端口和从端口之间进行中转,因而每个外设看到的都是标准的Avalon读传输。主端口看到一个存储器外设每次传输都在几个等待周期之后返同完整的32位数据,而从端口看到的是四次单独的读传输。Avalon总线内部的逻辑迫使主端口在四次从端口读传输期间等待,然后向主端口一次性提供组合起来的32位结果。
下面的讨论定义了较宽的主端口如何理解具有动态地址对齐的较窄的从外设中的数据。分两种情况进行讨论:32位或16位主端口访问8位从端口的情况,以及32位主端口访问16位从端口的情况。动态地址对齐对于32位主端口和16位主端口的情形在概念上是相同的,因此这些情形放在一起考虑。
动态地址对齐用于程序的数据和指令存储器,一般具有标准的8、16和32位宽度。因而下面的讨论只关心这些实际的情形。
4.8.4.1 具有动态地址对齐的8位从端口
考虑一个类似于表4.7的8位从外设,只是这次假定该外设具有10个存储单元,从aa到jj。假定这一从外设现在设定为动态地址对齐方式,并映像到某个基地址BASE。对丁每次32位主传输,Avalon总线模块对从端门的四个连续单元进行四次从传输。同样地,对于每次16位主传输,Avalon总线模块对从端口的两个连续单元进行两次从传输。从主端口和从端口的视角来看,这些传输在本质上和标准的Avalon传输没有区别。
读取这一具有动态地址对齐的外设的结果如表4.13所示。
表4.13 对具有动态地址对齐的从外设的32位和16位主传输

注:表中uu代表未定义。
在大多数实际的情况下,8位存储器外设不会在一个不完整的字边界结束,因此从一个动态地址对齐的从端口返回未定义值的情况是不多见的。
注意:32位主端口和16位主端口看到的地址空间是一样的,没有在静态地址对齐情况下
的不一致现象。例如,两个主端口在地址BASE+2处看到的半字都是0xddcc。
32位主端口无法只读取一个8位存储单元,例如只读取aa或只读取ee。一个主端口读传输总是会引起对从端口的地址空间中连续地址的多次从端口读传输。这便是动态地址对齐不适合于寄存器控制的从外设的原因。
对于窄于8位的存储器的数据传输的讨论几乎没有什么实际价值,但动态地址对齐的功能是良好定义的。对于读传输,Avalon总线模块在每次从端口读传输时捕获8位数据,在从端口中不存在的位则没有定义。主外设必须明白如何处理这些未定义的位。对于写传输,在16或32位字中对应于从外设中不存在的那些位被简单地忽略。
动态地址对齐对于写传输的影响随着写入的数据单元宽度的不同而有所不同。主端口使用位使能(byteenable_n)输出向Avalon总线模块指定它需要写入哪些字节单元。对于主数据端口的每一个字节段都有一个字节使能信号线。Avalon总线模块根据byteenable_n发起向8位存储器从外设写入相应字节所需的适当数量的从端口写传输。
4.8.4.2 具有动态地址对齐的16位从端口
考虑一个类似于表4.9的16位从外设,它具有5个存储单元,从aaaa到eeee。假定这一从外设现在设定为动态地址对对齐方式,并映像到某个基地址BASE,对于每次32位主传输,Avalon总线模块对从端口的两个连续单元进行两次从传输。从主端口和从端口的视角来看,这些传输在本质上和标准的Avalon传输没有区别。由于主从端口的宽度已匹配,16位主端口的情况不再相关了。读取这一具有动态地址对齐的外设的结果如表4.14所示。
表4.14 对具有动态地址对齐的16位从外设的32位和16位主传输

注:在表中uuuu代表值未定义。
在大多数实际的情况下,16位存储器外设不会在一个不完整的字边界结束,因此从一个动态地址对齐的从端口返回未定义值的情况是不多见的。
注意:32位主端口和16位主端口看到的地址空间是一样的,没有在静态地址对齐情况下的不一致现象。例如,两个主端口在地址BASE+2处看到的半字都是0xbbbb。
32位主端口无法只读取一个16位存储单元,例如只读取aaaa或只读取dddd。一个主端口读传输总是会引起对从端口的地址空间中连续地址的多次从端口读传输,这便是动态地址对齐不适合于寄存器控制的从外设的原因。
对于宽度在8至16位之间的存储器的数据传输的讨论几乎没有什么实际价值,但动态地址对齐的功能是明确定义的。对于读传输,Avalon总线模块在每次从端口读传输时捕获16位数据,在从端口中不存在的位则没有定义。主外设必须明白如何处理这些未定义的位。对于写传输,在32位字中对应于从外设中不存在的那些位被简单地忽略。
动态地址对齐对于写传输的影响随着写入的数据单元宽度的不同而有所不同。主端口使用位使能(byteenable_n)输出向Avalon总线模块指定它需要写入哪些字节单元。对于主数据端口的每一个字节段都有一个字节使能信号线。Avalon总线模块根据byteenable_n发起向16位存储器从外设写入相应字节所需的适当数量的从端口写传输。
4.8.4.3 具有动态地址对齐的32位从端口
如果从端口的宽度为32位,那么它和32位主端口的宽度便匹配了,这就不必考虑编址问题了。
在从端口的宽度为17到3l位时,动态地址对齐的行为与静态地址对齐相同。
4.9连接到外部设备
对于只使用系统模块内部外设的系统,用户不必考虑Avalon外设连接Avalon总线的细节。然而,大多数系统需要连接片外的存储器设备。用户必须手工将系统模块外的外设(包括片外设备)连接到Avalon总线端口。此外,许多系统通过三态总线将Avalon信号驱动到片外,因而通过同样的地址和数据物理引脚可以访问多个片外设备。这一连接方式非常类似于传统的总线结构,总线信号通过PCB上的物理线路传递。在这样的系统中,如何将系统模块外部的外设的地址引脚连接到Avalon总线模块的地址端口上并不总是显而易见的。当系统包含多个既有动态又有静态地址对齐方式,且数据位宽度不同的片外外设时,情况变得尤为复杂。
在下面的讨论中,A[0]代表从设备地址线的最低有效位。各个从设备的A[0]引脚并非一定要连接到Avalon的address端口的最低有效位。连接方式取决于PTF文件中声明的从端口的地址对齐方式。请留意存储器外设总是使用动态地址对齐,且Avalon的address端口是按字节编址的。表4.15列出了如何将片外设备的A[0]引脚连接到Avalon的address端口。
表4.15 将Avalon总线模块连接到外部设备

当连接较窄的从设备到较宽的Avalon data端口时,从设备的最低有效位数据引脚必须连接到Avalon data端口的最低有效位。