I/O Read and Memory Read
1. 第一个时钟周期前:idle状态
在第一个时钟周期来临前,总线处于idle状态。在statemachime module中,pci_frame_l变为低电平时,不依赖于时钟驱动,pci_ad_en使能有效。
2. 第一个时钟周期:从idle状态转入rw_wait状态
此周期为地址命令周期,在glue module中,pci_addr锁存地址pci_ad,cbe_reg_l锁存命令pci_cbe_l,idsel_reg锁存pci_idsel信号。
在statemachine module中,因为是读命令,置read_flag标识;置dts_oe有效,以便在后面的时钟周期中,想PCI总线输出devsel_l,trdy_l,stop_l等响应信号;置count_rst_l低电平有效,对retry module的计数器异步清零,但置count_en_l无效,故计数器并未开始重试计数。
在config_mux module中,不依赖于时钟驱动,ba0_size, ba1_size直接输出到base_addr_chk module中。根据已经锁存的pci_addr和Base Address Register ba0和ba1中的地址,同样不依赖于时钟驱动,输出选定地址空间信号hit_ba0_l或hit_ba1_l到statemachine module。因此,在锁存了地址pci_addr之后,随即base_addr_chk module会置hit_ba0_l或hit_ba1_l有效。
在pci_top module中,pci_addr不依赖于时钟驱动,并已无条件地输出到backend device 地址总线bkend_ad上。由于不在idle和backoff状态,be_oe使能无效,因此,pci_cbe_l和cbe_reg_l上的信号并未被输出到be_l上。
3. 第二个时钟周期:从rw_wait状态转入rw_wait2状态
在statemachine module中,若pci_frame_l已经撤销为高电平,说明主设备要求单周期读传输,置single_read_flag标识。(感觉后面根本就木有用到过这个标识,真不知道什么用意)置count_rst_l无效,count_en_l低电平有效,故从下一个时钟周期开始retry module中的计数器开始计数。根据所要寻址的空间,置backend device侧的base_region0_l或base_region1_l有效,以选择相应的地址空间。因为读数据,所以置bk_oe使能(bk_oe是写数据时使能,将pci_addr上的数据驱动到bkend_dat上)无效,r_w_l置为高电平,以表示读数据。
至第二个时钟周期为止,对于backend device侧,地址总线bkend_ad输出了寻址的地址pci_addr,驱动r_w_l为高电平以表示要从backend device处读数据。停止了驱动pci_ad数据到bkend_dat上;bk_oe无效,停止了驱动pci_cbe_l字节使能信号到be_l上;这都是为backend device输出数据,从设备(target)驱动pci_ad和pci_cbe_l准备一个过渡周期。而对于PCI总线侧,除使dts_oe使能有效外,并未做任何响应动作,因为要等待backend device准备好数据并给出响应信号,才能对PCI总线侧做出响应。
4. 第三个时钟周期:从rw_wait2状态转入其他状态。
从前两个时钟周期可以看出,在第一个时钟周期,锁存PCI总线上地址和命令,第二个时钟周期向backend device侧输出读数据信号及相应的地址,并停止驱动pci_ad和pci_cbe_l。在第三个时钟周期,将根据backend device给出的响应读操作的信号做出响应的操作抉择。
根据backend device侧和其他module传来的信号的情况,将进入不同的状态执行不同的操作。
(1) 若retry_l低电平有效,说明读数据超时,在retry module计数器容许的9个时钟周期内backend device没有准备好数据,进入retry状态。
(2) 若retry_l高电平无效,ready_l低电平有效,pci_fame_l低电平有效,data_stop_l高电平无效,说明backend device已经准备好要读取的数据,且主设备要求猝发读的模式。置devsel_l低电平有效,以声明将传输数据给主设备,转入read_wait状态。
(3) 若retry_l高电平无效,ready_l低电平有效,pci_frame_l高电平无效,data_stop_l高电平无效,说明backend device已经准备好要读取的数据,且主设备要求单周期读的模式。置devsel_l低电平有效,以声明将传输数据给主设备,转入read_wait状态。
(4) 若retry_l高电平无效,ready_l低电平有效,data_stop_l低电平有效,说明本次所要读取的数据已经准备好,但是backend device只支持当前的一次数据传输操作,不再继续支持数据传输。置devsel_l低电平有效,以准备传输数据给主设备,转入read_wait状态。
(5) 若retry_l高电平无效,且ready_l高电平无效,说明backend device尚未准备好本次所要读取的数据。置devsel_l低电平有效(不解???),再次置count_en_l低电平有效以进行重试计数,仍转入rw_wait2状态原地等待。
(6) 若bkend_abort_l低电平有效,则说明backend device须推出并终止本次传输,置stop_l低电平有效,abort_sig高电平有效,转入abort状态。
(7) 其他所有情况,均转入rw_wait2状态原地等待。
5. 第四个时钟周期:根据上一个时钟周期转入的不同状态及不同信号的情况进行不同的操作,转入不同的状态
(1) retry状态
若pci_frame_l仍为低电平有效状态,置dts_oe使能无效,devsel_l低电平有效,trdy_l高电平无效,stop_l有效,以请求主设备终止传输,撤消pci_frame_l信号;置地址空间选择信号base_region0_l, base_region1_l无效,转入retry状态原地等待主设备撤消pci_frame_l信号。
若pci_frame_l撤消为高电平有效状态,置dts_oe,devsel_l,trdy_l,stop_l,pci_ad_oe,base_region0_l,base_region1_l均无效,转入backoff状态。
(2) read_wait状态:在上一个时钟周期中,当主设备要求猝发读或单周期读、从设备仅支持单周期读三种情况下都会转入read_wait状态。
① 若bkend_abort_l低电平有效,则backend device 要退出并终止传输。置devsel_l高电平无效,stop_l低电平有效,base_region0_l,base_region1_l无效,abort_sig有效,转入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高电平无效,转入last_rw状态。
④ 若data_stop_l低电平有效,则是从设备仅支持单周期读的情况。置devsel_l,trdy_l,stop_l均低电平无效,转入last_rw状态。
(3) abort状态
若pci_frame_l仍为低电平有效状态,置devsel_l,tryd_l无效,stop_l低电平有效,abort_sig无效,转入abort状态原地等待pci_frame_l撤消为无效状态。
若pci_frame_l已经撤销为高电平无效状态,置devsel_l,trdy_l,stop_l均无效,abort_sig也置为无效,转入backoff状态。
6. 第五个时钟周期:根据上一个时钟周期转入的不同状态以及信号的情况进行不同的操作,转入不同的状态。
(1) rw状态:只有主设备要求猝发读,从设备支持猝发读操作且没有异常发生的情况下,才会进入rw状态。
① 若bkend_abort_l低电平有效,则说明backend device要求退出并终止传输,置devsel_l,trdy_l高电平无效,stop_l低电平有效,base_region0_l,base_region1_l高电平无效,abort_sig有效,即完成当前的数据传输周期后,即退出传输,转入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,base_region0_l,base_region1_l均无效后,完成数据传输,转入backoff状态。
④ 若pci_frame_l高电平无效,data_stop_l低电平有效,则是最后一个数据已经读完,数据传输周期结束。Backend device要求停止数据传输的情况。置devsel_l,trdy_l,stop_l,base_region0_l,base_region1_l均无效后,完成数据传输,转入backoff状态。
⑤ 若data_stop_l低电平有效,而pci_frame_l也仍为低电平有效,则主设备仍要求读数据,而backend device提出停止传输数据的情况。置devsel_l,trdy_l,stop_l均低电平有效,转入last_rw状态,以待完成最后一个数据传输周期。
(2) last_rw状态
若pci_frame_l已经撤消为无效,则完成当前数据传输周期后退出传输操作。置devsel_l,trdy_l,stop_l,pci_ad_oe,base_region0_l,base_region1_l无效,转入backoff状态。
若pci_frame_l仍然为低电平有效状态,则置devsel_l有效,trdy_l无效,stop_l有效,不再进行数据传输,并期望下一个时钟周期主设备撤销pci_frame_l信号,转入idle状态。
(3) abort状态:同前一个时钟周期中abort状态的操作描述。
(4) backoff状态:结束传输,置pci_ad_oe,dts_oe,par_oe使能均无效。
7. 第六个时钟周期
不是所有的传输都能进入到这个时钟周期,该时钟周期中,总线进入backoff状态。
backoff状态:同前一个时钟周期中backoff状态的操作描述。
文章评论(0条评论)
登录后参与讨论