原创 5-I/O Write and Memory Write

2010-5-31 11:04 1930 5 5 分类: 通信

I/O Write and Memory Write


1.  第一个时钟周期前:idle状态。


在statemachine module中,pci_frame_l变成低电平有效之后,pci_ad_en不依赖于时钟驱动使能有效。由于总线处于idle状态,be_oe使能无效。


2.  第一个时钟周期:从idle状态转入rw_wait状态,地址期。


在statemachine module中,由于从idle状态转入rw_wait状态,be_oe使能有效。置read_flag=0以表示写交易,dts_oe使能有效,清零count_rst_l,置count_en_l高电平以开始对retry计数器清零,但并没有开始计数。初始化r_w_l=1即读操作,其它信号均无效。


在glue module中,pci_addr锁存pci_ad信号,cbe_reg_l锁存pci_cbe_l信号,idsel_reg锁存pci_idsel信号。


在pci_top module中,pci_addr无条件输出到bkend_ad上。因为be_oe使能有效,pci_cbe_l输出到be_l上。


在config_mux module中,不依赖于时钟驱动,输出ba0_size,ba1_size到base_addr_chk module中,根据已锁存的pci_addr和ba0,ba1的值,不依赖于时钟驱动,即输出相应的地址空间寻址信号hit_ba0_l或hit_ba1_l。


3.  第二个时钟周期:从rw_wait状态转入rw_wait2状态,等待周期——写交易中不需要交换周期。


在statemachine module中,寻址地址空间0与地址空间1响应操作类似。置count_rst_l高电平无效,count_en_l低电平有效,即完成retry module中计数器清零并置计数器计数使能有效,从下一时钟周期开始计数。置base_region0_l或base_region1_l有效,以输出访问backend device的地址空间选择信号。dts_oe仍保持使能有效。置r_w_l=0以表示写backend device交易。


在pci_top module中,因为bk_oe使能有效,pci_addr开始输出到bkend_dat上。


至此为止,对于backend device侧,pci_addr已输出到bkend_dat上;pci_cbe_l输出到be_l上;pci_ad输出到bkend_dat上,给出了地址空间选择信号base_region0_l或base_region1_l以及读写信号r_w_l。但在PCI总线侧,除了是dts_oe使能外,未作任何其它响应操作。


第三个时钟周期:从rw_wait2状态转入其他状态。


在statemachine module中,因为是写交易,pci_ad_oe使能无效,从而禁止输出pci_dat_out数据到pci_ad上。


根据backend device侧给出的信号可知其是否做好了写数据的准备,从而做出对应的操作抉择。


(1)若retry_l低电平有效,表明retry计数器计数已满,在8个时钟周期内backend device没能做好接收数据的准备。因此,从设备要以重试的方式结束交易,置devsel_l有效声明交易,stop_l有效,trdy_l无效,转入retry状态。


(2)若retry_l高电平无效,ready_l低电平有效,pci_frame_l低电平有效,data_stop_l高电平无效,则是backend device已做好接收数据准备,主设备要求多周期写数据的正常情况。置devsel_l低电平有效以声明交易,同时trdy_l低电平有效完成一个数据期。stop_l无效,转入rw状态。


(3)若retry_l高电平无效,ready_l低电平有效,pci_frame_l高电平无效,无论data_stop_l是否有效,从设备都应该在完成该数据期之后结束交易。置devsel_l低电平有效声明交易,trdy_l有效完成一个数据传输,stop_l无效,转入last_rw状态。


(4)若retry_l无效,ready_l有效,data_stop_l有效,无论pci_frame_l是否有效,此时从设备都应当在完成当前数据传输后断开交易,即有数据断开的情况。置devsel_l有效声明交易,trdy_l有效完成当前数据传输,stop_l有效以断开写交易,转入last_rw状态。


(5)若retry_l无效,ready_l也无效,则从设备尚未准备好写数据操作,保持count_en_l有效,retry module中计数器继续计数,置devsel_l有效声明交易,trdy_l,stop_l无效,转入rw_wait2状态原地等待。


(6)若backend_abort_l有效,无论其它信号状态如何,是否有效,都说明backend device要求停止并退出交易,即目标设备废止。置devsel_l无效,stop_l有效,trdy_l无效,以目标设备废止的方式终止交易。同时置abort_sig有效,转入abort状态。


(7)其它情况下转入rw_wait2原地等待。


在本时钟周期中,写交易与读交易存在一个不同点,写交易在单数据期、多数据期、有数据断开三种情况下不仅声明交易,而且在本时钟周期完成初始数据期;读交易在本时钟周期中只是声明交易,在下一个时钟周期完成初始数据期。


在本时钟周期,单数据期写交易和有数据断开两种情况都转入last_rw状态,但是单数据期写交易中,pci_frame_l已经撤消为无效状态,而在有数据断开的情况下,pci_frame_l可能为有效状态,也可能为无效状态。这两种情况在last_rw中处理的情况是不同的。


第四个时钟周期:根据上一个时钟周期转入的不同状态以及backend device侧信号线的不同情况进行不同的操作。


    (1)retry状态:目标设备超时重试的情况下会转入retry状态。


     若pci_frame_l依然有效,则保持devsel_l有效,stop_l有效,trdy_l无效,等待主设备撤消pci_frame_l信号。相应地,dts_oe保持使能有效,bk_oe,base_region0_l,base_region1_l都置为无效,转入retry状态原地等待。


若pci_frame_l已经撤消为无效,则devsel_l,stop_l撤消为无效状态,trdy_l无效,dts_oe保持有效,bk_oe,pci_ad_oe,base_region0_l,base_region1_l都置为无效,转入backoff状态。


这里应注意,在写交易中,pci_ad数据线由主设备驱动,因此在等待pci_frame_l撤消的过程中,置bk_oe无效只是pci_ad数据不再驱动到bkend_dat上,但主设备仍旧驱动pci_ad到稳定状态。在读交易中,pci_ad数据线由从设备驱动,因此在等待pci_frame_l撤消的过程中,不可置pci_ad_oe无效,应保持其有效,以便从设备可以驱动pci_ad到稳定状态。而在pci_frame_l撤消后,交易结束,方可置pci_ad_oe无效,从而不再驱动pci_ad总线。


(2)rw状态:多周期写交易情况下目标设备会转入此状态。


①若bkend_abort_l有效,无论其它信号线状态如何,是否有效,都表明从设备要终止并退出交易,即目标设备废止的情况。置devsel_l无效,stop_l有效,trdy_l无效,以目标设备废止的方式终止交易。同时置abort_sig有效,置bk_oe无效,base_region0_l,base_region1_l无效,转入abort状态。


②若pci_frame_l依然有效,bkend_abort_l,data_stop_l均无效,则是多数据期写交易的正常数据期。保持devsel_l,trdy_l有效,stop_l无效,继续写数据,转入rw状态,继续数据期。


③若pci_frame_l高电平无效,bkend_abort_l无效,data_stop_l无效,则是多数据期写交易最后一个数据期的情况。置devsel_l,trdy_l,stop_l均无效,pci_ad_oe,bk_oe无效,base_region0_l,base_region1_l无效,转入backoff状态。


④若pci_frame_l无效且data_stop_l有效,则是多数据期写交易中有数据断开最后一个数据期的情况。置devsel_l,trdy_l,stop_l无效,bk_oe无效,base_region0_l,base_region1_l无效,转入backoff状态。


⑤若data_stop_l有效,无论pci_frame_l是何种状态,是否有效,都属于多数据期写交易有数据断开的情况。置stop_l,devsel_l,trdy_l有效,转入last_rw状态。


从上面的响应可以看出,如果pci_frame_l已经是高电平了,则可在本时钟周期完成最后一个数据期后转入backoff状态;如果pci_frame_l不确定,则可能需要在本时钟周期完成最后一个数据期后等待pci_frame_l撤销,这时就要转入last_rw状态。从这个意义上讲,上一个时钟周期中情况(3)可以在完成数据期后直接进入backoff状态,因为pci_frame_l已经撤消为无效状态。


(3)last_rw状态:单数据期写交易、有数据断开最后一个数据期完成后进入last_rw状态。该时钟周期中只是等待pci_frame_l撤消为无效状态,并没有进行数据传输。


若pci_frame_l仍为低电平有效,则是有数据断开最后一个数据期后的情况,保持devsel_l,stop_l有效,trdy_l无效直到pci_frame_l撤消为无效,转入last_rw状态原地等待。


若pci_frame_l已经撤消为高电平无效,则交易已经完成,置devsel_l,trdy_l,stop_l无效,base_region0_l,base_region1_l无效,转入backoff状态。


(4)abort状态:任何时候发生目标设备终止并退出交易,以目标设备废止的方式结束交易的情况下转入abort状态。


若pci_frame_l仍然是低电平有效,保持devsel_l无效,stop_l有效,trdy_l无效直到pci_frame_l撤消为无效。同时置abort_sig信号有效,转入abort状态原地继续等待。


若pci_frame_l已经撤消为无效状态,置devsel_l,trdy_l,stop_l无效,bk_oe,pci_ad_oe无效,abort_sig信号有效,转入backoff状态。


第五个时钟周期


       backoff状态:写交易结束,最终都转入backoff状态。


置dts_oe,par_oe,bk_oe,pci_ad_oe无效,转入idle状态。


其他状态同前面时钟周期中的描述。


 


 


注:在一次交易的整个过程中,pci_ad总线时刻都要被驱动到稳定状态,写交易中由主设备驱动,读交易中由从设备驱动。因此,在statemachine module中开始交易时,应在地址期后的第一个时钟周期中(读交易中是交换周期),先决定pci_ad_oe是否使能,而后在bk_oe是否使能;在结束交易时,同样应该先决定bk_oe是否关闭,再决定pci_ad_oe是否关闭。因为若是pci_ad_oe需要使能,则在整个交易中都需要由从设备驱动pci_ad线,而若是bk_oe需要使能,则在整个交易中主设备自会驱动pci_ad线,bk_oe使能晚些没有关系。



 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条