PCI板卡验证方法及读写具体过程经验版.docx
- 文档编号:8372341
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:9
- 大小:20.71KB
PCI板卡验证方法及读写具体过程经验版.docx
《PCI板卡验证方法及读写具体过程经验版.docx》由会员分享,可在线阅读,更多相关《PCI板卡验证方法及读写具体过程经验版.docx(9页珍藏版)》请在冰豆网上搜索。
PCI板卡验证方法及读写具体过程经验版
验证方法:
PCItreeisagraphicalWindowstooltolookatallthehardwaredevicesofthePCIbus.Thedevicesaredisplayedinatreelikeview.Informationaboutthedevicesanditsvendorsisobtainedfromaseperatedatabase.PCItreegivesyoureadandwriteaccesstotheconfigregistersofeachdeviceandeventoeachdevice'smemorygivenbytheBAR.
ThistoolhelpsyoutofigureoutproblemswithyourPC,orletsyoudebugyourcustomPCIchip.
PCI接口调试软件PCItree是一个图形窗口工具,它可以显示计算机PCI总线上的所有硬件设备以及这些设备的相关信息,如供应商识别码(VendorID)、设备识别码(DeviceID)和配置寄存器的内容等。
用户可以通过PCItree对PCI设备的配置寄存器以及在基址寄存器BAR中定义的存储器空间进行读写访问。
所以PCItree是一个方便的PCI设备调试软件。
实验中,将设计的PCI板卡插入到台式计算机的PCI扩展插槽,PCItree可以正确识别板卡。
利用PCItree的检验功能(verify)对pci板卡进行调试,即通过PCI接口向FPGA中RAM写入数据,写满之后将RAM中数据读出,然后将写入和读出的数据进行比较,若数据相同,则循环此过程,否则将报错。
连续调试一段时间,如果运行正常,则说明调试成功。
PCI接口设计的关键是本地侧控制逻辑的设计。
是PCI_t32和本地用户功能逻辑RAM之间的桥梁,它的功能是根据PCI_t32给出的本地侧控制信号,把它输出的数据写入RAM或者从RAM中读出所需数据并发送给PCI_t32。
另一种方法:
在windowsXP操作系统下,以VC++6.0为开发环境,利用windriver工具开发PCI接口的驱动程序。
寄存器写操作直接采用windriver提供的函数XXX_WriteDword();寄存器读操作采用函数XXX_ReadDword()。
PCI卡插到工控机插槽中后,系统上电自检,此时复位使能,flash向fpga烧写程序,根据配置信息初始化其内部寄存器,BIOS根据PCI核配置寄存器的内容进行系统资源分配,进入系统后安装PCI驱动。
PCI驱动的开发
DriverStudio是一套开发、调试和性能测试工具。
把微软的DDK用内的形式进行封装,简化了WDM驱动程序的开发,使用方便;SoftICE用来调试内核模式的驱动程序,DriverMonitor可以很方便地观察驱动程序的调试信息;Driverstudio所具备的高性能工具和对现代软件工程的实践,很大程度上方便了设备驱动程序的编写。
PCI配置空间的BA0与BA1
有几点:
1IO空间有限;虽说X86处理器的IO空间可以寻址4G;但是windows系统里给外设分配的IO空间共64KB;
所以就要求单个PCI设备若使用了IO空间,其大小不要超过256字节;
MEMORY空间则没有这个限制,受限于操作系统能够管理的内存大小;
2在驱动程序里面访问IO空间,可以直接使用IO指令访问;
在驱动程序里面访问memory空间,需要先将其物理地址(physicaladdress)映射到虚拟地址(virtualaddress),然后才能访问;
3memory空间访问的时候可以支持burst,IO空间访问的时候只能一个一个访问,所以从性能上看,memory空间访问的性能要高于IO空间。
PCI存储空间分为MEMORY空间和I/O空间两类,它们独立寻址,并使用不同的总线操作命令进行访问。
MEMORY空间适用于设备功能寄存器较多或数据流量较大的场合,例如网口芯片、PCI-PCI桥等。
I/O空间适用于设备功能寄存器较少或数据流量较小的场合,例如串口芯片、LED控制寄存器等。
但在地址空间比较充裕的条件下,也有把范围较小的存储区放入MEMORY空间的做法。
操作响应者根据操作发起者发出的总线操作命令类型,来识别当前操作是指向MEMORY空间还是I/O空间。
单个设备/功能PCI的MEMROY空间的容量可选取16byte~2Gbyte。
但为了减少参与地址译码的地址线数量,PCI规范建议MEMORY空间分配不小于4Kbyte。
单个设备/功能PCI的I/O空间的容量可选取4byte~256byte,不允许超过256byte。
I/OReadandMemoryRead
1. 第一个时钟周期前:
idle状态
在第一个时钟周期来临前,总线处于idle状态。
在statemachimemodule中,pci_frame_l变为低电平时,不依赖于时钟驱动,pci_ad_en使能有效。
2. 第一个时钟周期:
从idle状态转入rw_wait状态
此周期为地址命令周期,在gluemodule中,pci_addr锁存地址pci_ad,cbe_reg_l锁存命令pci_cbe_l,idsel_reg锁存pci_idsel信号。
在statemachinemodule中,因为是读命令,置read_flag标识;置dts_oe有效,以便在后面的时钟周期中,想PCI总线输出devsel_l,trdy_l,stop_l等响应信号;置count_rst_l低电平有效,对retrymodule的计数器异步清零,但置count_en_l无效,故计数器并未开始重试计数。
在config_muxmodule中,不依赖于时钟驱动,ba0_size,ba1_size直接输出到base_addr_chkmodule中。
根据已经锁存的pci_addr和BaseAddressRegisterba0和ba1中的地址,同样不依赖于时钟驱动,输出选定地址空间信号hit_ba0_l或hit_ba1_l到statemachinemodule。
因此,在锁存了地址pci_addr之后,随即base_addr_chkmodule会置hit_ba0_l或hit_ba1_l有效。
在pci_topmodule中,pci_addr不依赖于时钟驱动,并已无条件地输出到backenddevice地址总线bkend_ad上。
由于不在idle和backoff状态,be_oe使能无效,因此,pci_cbe_l和cbe_reg_l上的信号并未被输出到be_l上。
3. 第二个时钟周期:
从rw_wait状态转入rw_wait2状态
在statemachinemodule中,若pci_frame_l已经撤销为高电平,说明主设备要求单周期读传输,置single_read_flag标识。
(感觉后面根本就木有用到过这个标识,真不知道什么用意)置count_rst_l无效,count_en_l低电平有效,故从下一个时钟周期开始retrymodule中的计数器开始计数。
根据所要寻址的空间,置backenddevice侧的base_region0_l或base_region1_l有效,以选择相应的地址空间。
因为读数据,所以置bk_oe使能(bk_oe是写数据时使能,将pci_addr上的数据驱动到bkend_dat上)无效,r_w_l置为高电平,以表示读数据。
至第二个时钟周期为止,对于backenddevice侧,地址总线bkend_ad输出了寻址的地址pci_addr,驱动r_w_l为高电平以表示要从backenddevice处读数据。
停止了驱动pci_ad数据到bkend_dat上;bk_oe无效,停止了驱动pci_cbe_l字节使能信号到be_l上;这都是为backenddevice输出数据,从设备(target)驱动pci_ad和pci_cbe_l准备一个过渡周期。
而对于PCI总线侧,除使dts_oe使能有效外,并未做任何响应动作,因为要等待backenddevice准备好数据并给出响应信号,才能对PCI总线侧做出响应。
4. 第三个时钟周期:
从rw_wait2状态转入其他状态。
从前两个时钟周期可以看出,在第一个时钟周期,锁存PCI总线上地址和命令,第二个时钟周期向backenddevice侧输出读数据信号及相应的地址,并停止驱动pci_ad和pci_cbe_l。
在第三个时钟周期,将根据backenddevice给出的响应读操作的信号做出响应的操作抉择。
根据backenddevice侧和其他module传来的信号的情况,将进入不同的状态执行不同的操作。
(1) 若retry_l低电平有效,说明读数据超时,在retrymodule计数器容许的9个时钟周期内backenddevice没有准备好数据,进入retry状态。
(2) 若retry_l高电平无效,ready_l低电平有效,pci_fame_l低电平有效,data_stop_l高电平无效,说明backenddevice已经准备好要读取的数据,且主设备要求猝发读的模式。
置devsel_l低电平有效,以声明将传输数据给主设备,转入read_wait状态。
(3) 若retry_l高电平无效,ready_l低电平有效,pci_frame_l高电平无效,data_stop_l高电平无效,说明backenddevice已经准备好要读取的数据,且主设备要求单周期读的模式。
置devsel_l低电平有效,以声明将传输数据给主设备,转入read_wait状态。
(4) 若retry_l高电平无效,ready_l低电平有效,data_stop_l低电平有效,说明本次所要读取的数据已经准备好,但是backenddevice只支持当前的一次数据传输操作,不再继续支持数据传输。
置devsel_l低电平有效,以准备传输数据给主设备,转入read_wait状态。
(5) 若retry_l高电平无效,且ready_l高电平无效,说明backenddevice尚未准备好本次所要读取的数据。
置devsel_l低电平有效(不解?
?
?
),再次置count_en_l低电平有效以进行重试计数,仍转入rw_wait2状态原地等待。
(6) 若bkend_abort_l低电平有效,则说明backenddevice须推出并终止本次传输,置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低电平有效,则backenddevice要退出并终止传输。
置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低电平有效,则说明backenddevice要求退出并终止传输,置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低电平有效,则是最后一个数据已经读完,数据传输周期结束。
Backenddevice要求停止数据传输的情况。
置devsel_l,trdy_l,stop_l,base_region0_l,base_region1_l均无效后,完成数据传输,转入backoff状态。
⑤ 若data_stop_l低电平有效,而pci_frame_l也仍为低电平有效,则主设备仍要求读数据,而backenddevice提出停止传输数据的情况。
置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状态的操作描述。
I/OWriteandMemoryWrite
1. 第一个时钟周期前:
idle状态。
在statemachinemodule中,pci_frame_l变成低电平有效之后,pci_ad_en不依赖于时钟驱动使能有效。
由于总线处于idle状态,be_oe使能无效。
2. 第一个时钟周期:
从idle状态转入rw_wait状态,地址期。
在statemachinemodule中,由于从idle状态转入rw_wait状态,be_oe使能有效。
置read_flag=0以表示写交易,dts_oe使能有效,清零count_rst_l,置count_en_l高电平以开始对retry计数器清零,但并没有开始计数。
初始化r_w_l=1即读操作,其它信号均无效。
在gluemodule中,pci_addr锁存pci_ad信号,cbe_reg_l锁存pci_cbe_l信号,idsel_reg锁存pci_idsel信号。
在pci_topmodule中,pci_addr无条件输出到bkend_ad上。
因为be_oe使能有效,pci_cbe_l输出到be_l上。
在config_muxmodule中,不依赖于时钟驱动,输出ba0_size,ba1_size到base_addr_chkmodule中,根据已锁存的pci_addr和ba0,ba1的值,不依赖于时钟驱动,即输出相应的地址空间寻址信号hit_ba0_l或hit_ba1_l。
3. 第二个时钟周期:
从rw_wait状态转入rw_wait2状态,等待周期——写交易中不需要交换周期。
在statemachinemodule中,寻址地址空间0与地址空间1响应操作类似。
置count_rst_l高电平无效,count_en_l低电平有效,即完成retrymodule中计数器清零并置计数器计数使能有效,从下一时钟周期开始计数。
置base_region0_l或base_region1_l有效,以输出访问backenddevice的地址空间选择信号。
dts_oe仍保持使能有效。
置r_w_l=0以表示写backenddevice交易。
在pci_topmodule中,因为bk_oe使能有效,pci_addr开始输出到bkend_dat上。
至此为止,对于backenddevice侧,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状态转入其他状态。
在statemachinemodule中,因为是写交易,pci_ad_oe使能无效,从而禁止输出pci_dat_out数据到pci_ad上。
根据backenddevice侧给出的信号可知其是否做好了写数据的准备,从而做出对应的操作抉择。
(1)若retry_l低电平有效,表明retry计数器计数已满,在8个时钟周期内backenddevice没能做好接收数据的准备。
因此,从设备要以重试的方式结束交易,置devsel_l有效声明交易,stop_l有效,trdy_l无效,转入retry状态。
(2)若retry_l高电平无效,ready_l低电平有效,pci_frame_l低电平有效,data_stop_l高电平无效,则是backenddevice已做好接收数据准备,主设备要求多周期写数据的正常情况。
置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有效,retrymodule中计数器继续计数,置devsel_l有效声明交易,trdy_l,stop_l无效,转入rw_wait2状态原地等待。
(6)若backend_abort_l有效,无论其它信号状态如何,是否有效,都说明backenddevice要求停止并退出交易,即目标设备废止。
置devsel_l无效,stop_l有效,trdy_l无效,以目标设备废止的方式终止交易。
同时置abort_sig有效,转入abort状态。
(7)其它情况下转入rw_wait2原地等待。
在本时钟周期中,写交易与读交易存在一个不同点,写交易在单数据期、多数据期、有数据断开三种情况下不仅声明交易,而且在本时钟周期完成初始数据期;读交易在本时钟周期中只是声明交易,在下一个时钟周期完成初始数据期。
在本时钟周期,单数据期写交易和有数据断开两种情况都转入last_rw状态,但是单数据期写交易中,pci_frame_l已经撤消为无效状态,而在有数据断开的情况下,pci_frame_l可能为有效状态,也可能为无效状态。
这两种情况在last_rw中处理的情况是不同的。
第四个时钟周期:
根据上一个时钟周期转入的不同状态以及backenddevice侧信号线的不同情况进行不同的操作。
(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状
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PCI 板卡 验证 方法 读写 具体 过程 经验