<?xml version="1.0" encoding="gbk"?> <rss version="2.0"><channel> <title>定阅帖子更新</title> <link>http://www.broadkey.com.cn/XML.ASP</link><description>TEAM Board - 意得法电子</description> <copyright>TEAM 2.0.5 Release</copyright><generator>TEAM Board by TEAM5.Cn Studio</generator> <ttl>30</ttl><item><link>http://www.broadkey.com.cn/Thread.asp?tid=99 </link><title>嵌入式系统中PCI总线仲裁器的设计与实现</title><author>nicky</author><pubDate>2009-11-27 12:32:38</pubDate><description><![CDATA[<strong>摘　要：</strong> 描述了PCI总线仲裁的原理和仲裁算法，阐述了用可编程器件实现总线仲裁的具体方法，并实现了一个双主设备仲裁器。<br />
　　<strong>关键词：</strong> PCI总线 仲裁 CPLD VHDL 嵌入式系统 <font face="宋体">
<p><br />
　　PCI(Peripheral Component Interconnect)总线是现今最为流行的工业控制总线之一。它广泛地应用在计算机中，并且由于众多厂商对PCI的良好支持，使得目前嵌入式设备中的很多解决方案都包含了PCI总线。在多主设备的PCI系统应用中，必须为各个主设备提供仲裁授权信号。很多厂家有针对性地发布了PCI仲裁逻辑的专用芯片或者集成了PCI仲裁逻辑的专用芯片，但使用不够灵活。为了使PCI设备能够更方便地应用在嵌入式系统中，本文介绍了一种基于CPLD(复杂可编程逻辑器件)的PCI总线仲裁器的设计方法。此方法可以为系统量身定制适合于系统本身的PCI总线仲裁器，而不必局限于特定芯片的要求，在体积、功能、成本等诸多方面都有很好的应用前景。<br />
<strong>1 PCI总线仲裁简介<br />
1.1 PCI总线的仲裁原理</strong><br />
　　PCI总线是一种共享式的总线，可以连接多个主设备，但由于数据传输的独占性，每一时刻只能由一个主设备占用总线。因此，为了有效地利用PCI总线带宽，必须设置一个总线仲裁器，按照一定的算法协调系统中各个主设备的操作。<br />
　　每个具备主设备功能的PCI设备必须提供两个与仲裁有关的信号：REQ#和GNT#。其中REQ#为请求总线信号，由需要发起PCI传输事务的设备发出；GNT#为总线授权信号，由PCI总线仲裁器裁决后给出。接到GNT#信号的PCI设备将在下一次总线空闲后开始操作。<br />
　　PCI总线仲裁的裁决过程可以在PCI传输期间完成，并不占用PCI总线的带宽，这称为隐式仲裁。即需要发起PCI操作的设备可以随时发出请求REQ#，PCI仲裁器立即批准该请求并给出GNT#。但是真正的传输操作一定要等到当前传输完成，即总线空闲后才可以开始。图1描述了PCI总线设备与仲裁器的关系。</p>
<p align="center"><img border="0" src="http://www.chinaaet.com/uploadfiles/jishu/jslw/20080425013851375.gif" alt="" /></p>
<p><br />
<strong>1.2 PCI总线仲裁规则约定</strong><br />
　　(1)仲裁器的仲裁算法必须保证所有的设备都能得到授权的机会，否则将会出现某个优先级低的设备永远不能占有总线进行事务操作的情况。<br />
　　(2)如果FRAME无效，GNT可以在任意时间撤消，以便服务于另一个主设备或者作为对主设备撤销REQ的响应。<br />
　　(3)如果GNT信号被撤消但FRAME有信号，当前的总线正在传输数据，则操作合法。<br />
　　(4)如果总线不处于空闲状态，则允许一个GNT的撤消和另一个GNT的发生在同一个周期。如果处在空闲状态，则要求一个GNT撤消到下一个GNT的发出之间必须有一个时钟周期间隔，否则可能会在AD线和PAR线上出现冲突。<br />
　　(5)GNT信号的每次发出，只限于相应的总线主控器可以使用总线进行一次总线操作(一个FRAME发出到撤销)。如果该主控器需要多次总线访问，它可以保持REQ信号一直有效。仲裁器会按照特定的仲裁算法来决定是否仍判给该主设备。<br />
　　(6)一个主控器可以在任意时刻撤消其REQ信号。REQ信号一旦撤消，仲裁器将认为该设备不再请求使用总线，因而撤消其GNT信号(参考上文(1))。如果一个主控器只希望做一次总线传输，则它应当在发出FRAME的同一时钟周期撤消REQ。<br />
　　(7)如果当前的主控器在它的GNT信号发出后，持续16个空闲周期还没有开始总线操作，则仲裁器视其为超时，仲裁器可以在任意时刻撤消GNT信号，以便服务于另一个设备。<br />
<strong>1.3 PCI总线仲裁的算法</strong><br />
　　目前，应用于PCI总线总裁的算法主要有固定优先级算法和动态优先级算法两种。在固定优先级算法中，各个设备的优先级是事先确定好的，仲裁器针对事先设定好的优先级为每个设备分配使用权。这种算法的缺点是：一旦PCI总线事务非常繁忙，优先级高的设备会占有总线不放，将导致优先级低的设备无法申请到总线。可见这是一种并不公平的算法，只适用于总线利用率非常低的情况。动态优先级算法是在每次仲裁授权后动态改变各个设备的优先级。在保证每个设备都有机会获得总线的情况下，优先级改变的算法可以是各种各样的。最常用的是循环优先级算法，即每次仲裁授权后将排队中的设备优先级加1。因其算法简单，且对大部分应用都十分有效，本设计采用循环优先级算法。<br />
<strong>1.4 总线停靠</strong><br />
　　当PCI总线空闲时，一个设备从申请总线到被授权使用，最少也需要2个时钟周期，这对于PCI总线是一种浪费。因此仲裁器通常选中一个最经常占用总线的设备，在PCI总线空闲时将GNT#赋予它，这叫做总线停靠。当总线空闲时，该设备需要占用总线时可马上得到批准。<br />
<strong>2 双主设备PCI总线仲裁器的实现</strong><br />
　　下面描述了一个具有两个设备的总线仲裁器的硬件实现，其一为TriMedia嵌入式DSPCPU PNX1300，其二为Intel i82559 网络控制器。系统结构如图2所示。</p>
<p align="center"><img border="0" src="http://www.chinaaet.com/uploadfiles/jishu/jslw/20080425013910843.gif" alt="" /></p>
<p align="center">&nbsp;</p>
<p align="center"><img border="0" src="http://www.chinaaet.com/uploadfiles/jishu/jslw/20080425013917968.gif" alt="" /></p>
<p><br />
　　该仲裁器的接口信号如表1所示。<br />
　　为设计方便起见，在程序中设计三类状态机：总线状态状态机、总线主设备查询状态机、仲裁状态机。<br />
<strong>2.1 总线状态状态机<br />
</strong>　　总线状态状态机用于记录总线事务的状态，定义如下：<br />
　　type bus_state is(IDLE，BUSY，LAST_DATA，FINISH)<br />
　　四种状态分别表示总线空闲、忙、最后一个数据传输期以及传输完成。状态图如图3。</p>
<p align="center"><img border="0" src="http://www.chinaaet.com/uploadfiles/jishu/jslw/20080425013930656.gif" alt="" /></p>
<p><br />
　　下面是以VHDL代码形式实现的该状态机的状态转换关系。<br />
case bus_cur_state is<br />
　　when IDLE =&gt;<br />
　　　　if Frame_n=&prime;0&prime; then --frame被拉低，表示一个传输事务开始<br />
　　　　　　bus_next_state&lt;=BUSY；<br />
　　　　else<br />
　　　　　　bus_next_state&lt;=IDLE；--总线空闲<br />
　　　　end if；<br />
　　when BUSY=&gt;<br />
　　　　if Frame_n=&prime;1&prime; then --frame为高，等待传输最后一个数据<br />
　　　　　　if Irdy_n=&prime;0&prime; then --主设备准备好，正在传输最后一个数据<br />
　　　　　　　　bus_next_state&lt;=FINISH；<br />
　　　　　　else<br />
　　　　　　　　bus_next_state&lt;=LAST_DATA；--等待最后一个数据完成<br />
　　　　　　end if；<br />
　　　　else<br />
　　　　　　bus_next_state&lt;=BUSY；--等待frame被拉高<br />
　　　　end if；<br />
　　when LAST_DATA=&gt;<br />
　　　　if Irdy_n=&prime;0&prime; then--主设备准备好<br />
　　　　　　bus_next_state&lt;=FINISH；<br />
　　　　else<br />
　　　　　　bus_next_state&lt;=LAST_DATA；--等待最后一个数据传输完成<br />
　　　　end if；<br />
　　when FINISH=&gt;<br />
　　　　if Irdy_n=&prime;1&prime; then<br />
　　　　　　bus_next_state&lt;=IDLE；<br />
　　　　else<br />
　　　　　　bus_next_state&lt;=FINISH；<br />
　　　　end if；<br />
　　when others=&gt;<br />
　　　　bus_next_state&lt;=IDLE；<br />
end case；<br />
　　根据上述状态关系输出总线空闲指示信号busbusy。<br />
case bus_cur_state is<br />
　　when IDLE=&gt;<br />
　　　　busbusy&lt;=&prime;0&prime;；<br />
　　when BUSY=&gt;<br />
　　　　busbusy&lt;=&prime;1&prime;；<br />
　　when LAST_DATA=&gt;<br />
　　　　busbusy&lt;=&prime;1&prime;；<br />
　　when FINISH=&gt;<br />
　　　　busbusy&lt;=&prime;1&prime;；<br />
　　when others=&gt;<br />
　　　　busbusy&lt;=&prime;0&prime;；<br />
end case；<br />
<strong>2.2 总线主设备查询状态机</strong><br />
　　总线主设备查询状态机用来决定当前是否需要重新指定一个主设备。重新指定一个主设备的条件是：(1)当前被授权的设备已开始传输；(2)当前被授权的设备没有开始传输并且超时。将主设备查询状态分为IDLE、GNT1、GNT2、WAIT_NOBUSY和WAIT_BUSY2五个状态，并设置计数器count。当总线上某个设备被授权，但16个周期仍然没有开始操作，count超过16，被视为超时，仲裁器可以撤销其仲裁授权，并转授其他设备。程序根据这个状态机的输出结果决定仲裁状态机是否改变。</p>
<p align="center"><a href="http://www.chinaaet.com/uploadfiles/jishu/jslw/20080425013955484.gif" target="_blank"><img border="0" src="http://www.chinaaet.com/uploadfiles/jishu/jslw/20080425013955484_small.gif" alt="" /></a></p>
<p><br />
　　状态转换如图4所示，状态机描述的VHDL代码略。<br />
　　主设备查询状态机的输出信号search_master：<br />
case search_cur_state is <br />
　　when NO_GNT =&gt;<br />
　　　　search_master &lt;= &prime;1&prime;; <br />
　　when GNT1 =&gt;<br />
　　　　search_master &lt;= &prime;0&prime;; <br />
　　when GNT2 =&gt;<br />
　　　　search_master &lt;= &prime;1&prime;; <br />
　　when WAIT_NOBUSY =&gt;<br />
　　　　search_master &lt;= &prime;0&prime;; <br />
　　when WAIT_BUSY2 =&gt;<br />
　　　　search_master &lt;= &prime;0&prime;; <br />
　　when others =&gt;<br />
　　　　search_master &lt;= &prime;0&prime;;<br />
end case; <br />
　　该状态机的驱动条件是由总线状态状态机的输出结果(busbusy)、仲裁状态机的状态(idle，park)和计数器产生的超时信号(timeout)组成。设置WAIT_BUSY2的目的是为了避免可能会在AD线和PAR线上出现的冲突。该状态机的输出search_master作为仲裁状态机状态转换使能信号，只有该信号有效时，仲裁状态机才进行当前状态的改变。<br />
<strong>2.3 仲裁状态机<br />
</strong>　　仲裁状态机表示总线仲裁器的状态，定义如下：<br />
　　type arbiter_state is(IDLE，DEV1，DEV2，PARK)；<br />
　　当主设备查询状态机输出使能信号(search_master)时，导致仲裁状态机的状态改变。<br />
　　if(PCI_reset=&prime;0&prime;) then<br />
　　　　arbiter_cur_state&lt;=park；--总线在复位期间停靠<br />
　　elsif rising_edge(PCI_clock) then<br />
　　　　if(search_master=&prime;1&prime;) then<br />
　　　　arbiter_cur_state&lt;=arbiter_next_state；<br />
　　　　end if；<br />
　　end if；<br />
　　状态转变过程如图5所示，状态机描述的VHDL代码略。</p>
<p align="center"><a href="http://www.chinaaet.com/uploadfiles/jishu/jslw/20080425014012484.gif" target="_blank"><img border="0" src="http://www.chinaaet.com/uploadfiles/jishu/jslw/20080425014012484_small.gif" alt="" /></a></p>
<p><br />
　　仲裁器根据仲裁状态机当前状态控制仲裁授权信号(GNT)的给出。<br />
　　when idle=&gt;<br />
　　　　gnt_out_n&lt;=(others=&gt;&prime;1&prime;)；<br />
　　when dev1=&gt;<br />
　　　　gnt_out_n&lt;=&Prime;10&Prime;；<br />
　　when dev2=&gt;<br />
　　　　gnt_out_n&lt;=&Prime;01&Prime;；<br />
　　when park=&gt;<br />
　　　　gnt_out_n&lt;=(PARKMASTER)；<br />
　　when others=&gt;<br />
　　　　gnt_out_n&lt;=(others =&gt;&prime;1&prime;)；<br />
　　end case；<br />
　　注：PARKMASTER是事先设置的停靠状态。<br />
<strong>2.4 仿真波形图</strong><br />
　　由图6可以看出，测试文件模拟了一个设备申请和两个设备同时申请的情况，并给出了总线授权信号(GNT)，验证了仲裁器逻辑的正确性。</p>
<p align="center"><a href="http://www.chinaaet.com/uploadfiles/jishu/jslw/20080425014028468.gif" target="_blank"><img border="0" src="http://www.chinaaet.com/uploadfiles/jishu/jslw/20080425014028468_small.gif" alt="" /></a></p>
<p><br />
<strong>2.5 资源占用情况分析<br />
</strong>　　可编程逻辑器件使用<a href="http://www.lattice.com.cn/">Lattice 公司</a>的ispLSI2064E-135LT100，在ispLever中综合本例程序，结果如表2。</p>
<p align="center"><img border="0" src="http://www.chinaaet.com/uploadfiles/jishu/jslw/20080425014042515.gif" alt="" /></p>
<p><br />
　　综合后的延迟分析显示，该逻辑的时钟周期最小为7.5ns，即该逻辑可以运行在133MHz以下的系统中，完全可以胜任33MHz PCI总线的仲裁工作。<br />
　　本PCI总线仲裁器已成功地应用在基于PNX1300的IP会议电视终端系统中，用于处理嵌入式CPU PNX1300和网络控制器I82559的总线占用仲裁。该会议电视终端已于2005年1月在国家泰尔实验室通过测试并取得入网许可证。<br />
<strong>参考文献<br />
</strong>1 李贵山，威德虎.PCI局部总线开发者指南.西安：西安电子科技大学出版社，1997<br />
2 曾繁泰，冯保初.PCI总线与多媒体计算机.北京：电子工业出版社，1998<br />
3 姜立东.VHDL语言程序设计及应用.北京：北京邮电大学出版社，2001</p>
</font>]]></description></item></channel></rss>