资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
PCIE 调试总结 (2) 4.PCI 配置空间和设备寄存器PCI 总线支持三个独立的物理地址空间:存储器空间、IO 空间和配置空间。在每一个PCI 设备中的每个功能都有一个PCI 配置空间,最大为256B。各 PCI 功能的配置空间不是统一编址的,而是采用一种ID 的寻址方法,用总线号、设备号、功能号和寄存器号来唯一标识一个功能中的配置空间。配置空间只能由处理器通过HOST 桥来访问。 X86CPU 能访问存储器或 IO 地址空间,但不支持直接访问配置地址空间。PCI 规范规定了 X86CPU 间接访问 PCI 配置空间的方法,通过 HOST 桥中映射为 I/O 的一个地址端口和一个数据端口来索引和访问。在计算机上电的时候PCI 设备枚举29,配置空间被 PCIBIOS 访问。从中读取PCI 设备的配置信息。然后在系统的存储器和 I/O 地址空间内为其分配一片独立的存储器或I/O 地址空间,并将所分配空间的起始地址写入每个BAR,此地址确定了该设备作为完成者(目标)可以响应的地址范围。在计算机上电以后计算机(或驱动程序 )可以采用两种方法访问设备寄存器:通过CPU 专用的 I/O 指令或者通过标准内存引用指令。图 4描述了这两种方法,下面对这些方法进行简单说明。图 3CPU 访问 I/O 与内存寄存器1)、I/O 空间寄存器:一些CPU 体系结构(尤其是 Intel X86) 在引用设备驱动程序时使用I/O 机器指令。这些特殊指令引用 CPU 上一个特定的引脚集合,因而为I/O 设备定义了一个单独的总线和地址空间。在此总线上的地址也被称作端口,并且与任何内存地址完全隔离。在Intel X86 体系结构中, I/O 地址空间是 64KB 大小(16 位),汇编语言定义两个指令用于此地址空间读取和写入端口:IN 和 OUT。2)、内存映射寄存器:并非所有的CPU 结构都需要一个独立的I/O 地址空间,在这种情况下,设备寄存器的地址直接映射到 CPU 的内存空间。暴露大量数据缓冲区的设备往往映射到内存空间(如视频卡和数据采集卡 ),这样就使得高级语言可以更快更直接对他们进行访问。3)、配置地址空间: PCI 结构允许 32 个物理单元 (称为设备 )插在同一根总线上。每个这样的物理单元最多可以包含8 个不同的功能单元 (Function)。PCI 标准规定,总线上每个单独的PCI 功能单元必须有 256 字节的存储区域用于保存配置数据,这个区域称为PCI 功能单元的配置空间。每个 PCI 功能单元都有 256 字节的配置寄存器, 每 4 个字节构成一个32 位的寄存器,所以配置空间可以看成是由64 个32 位的寄存器组成。 配置空间的前 64 个字节为预定义信息区 又称标题区 ,其中的信息由 PCI SIG 组织进行预定义;后 192 字节为特殊配置数据区,其中的内容根据接口的特性由生产厂家定义。主机系统可以通过配置寄存器给出的信息来配置操作系统,以实现PCI 接口的即插即用特性。图5 给出了类型 0 配置寄存器前 64 字节的内容。图 4配置空间标题区所有符合 PCI 要求的设备都必须支持厂商识别码、设备识别码、命令和状态字段。其他寄存器的实现是可选的,具体视设备的功能而定。现在讲解我们的 PEX8112 的具体运作方式:5、FPGA 作为从模式的配置读过程:1) 在一个 PCI 的数据传输过程,都是以拉低 FRAME 信号开始的。在 frame=0 and irdy=1 and trdy=1and devsel=1 andstop=1的时候,我们把 cbe 锁存给 cmd,把 ad锁存给 add. 其中,锁存住的add的 add(31 downto 8) ,表示地址, add(7 d ownto 0),代表指令。Cmd 代表指令,指令列表如下:表 2 总线命令一览表C/BE#3:0 命令类型说明0000 中断应答(中断识别)0001 特殊周期 0010 读 I/O 端口0011 写 I/O 端口0100 保留0101 保留0110 存储器读(从内存空间映像中读数据) 0111 存储器写(从内存空间映像中写数据)1000 保留 1001 保留1010 读配置寄存器1011 写配置寄存器1100 存储器多行读1101 双地址周期 1110 线存储器读取(存储器一行读) 1111 存储器写并无效2).一个PCI 的数据传输过程,都是以拉低FRAME 信号开始的。在idsel=1 and frame=0 and irdy=1 and trdy=1 and devsel=1 and stop= 1 的前提下,注: idsel 高有效,它是唯一区别是的io 操作还是寄存器操作的, 我们也锁存 add信号与 cmd 信号。3)下面讲解状态机:配置读状态机:i. 在 cfg_rd_sel=1 or io_rd_sel=1 or mem_rd _sel=1的前提下,我们进入dev_st1状态,什么时候 cfg_rd_sel=1呢?在 idsel=1 and frame=0and ird y=1 and trdy=1 and devsel= 1 and stop=1 前提下(表示我们进行寄存器配置操作),我们锁存住cmd 的指令是cmd=“1010“,读配置寄存器时,使cfg_rd_sel=1。ii在 dev_st1状态,让 devsel=0这个工作,使 FPGA 成为目标设备。进入rdst1状态。iii. 它代表了配置寄存器前64 字节的内容。图 5 当 add(5 d ownto 2)=“0000“ then devid=1;else devid=0; 表示设备识别码。当 add(5 downto 2)=“0001“ then statecmd=1;else statecmd=0;表示厂商识别码依次往下,不再赘述。这个状态我们把电脑想要得到的配置的寄存器的数放到了PCI 总线上,想要哪个数呢?由add决定。下面我们跳到rdst2状态。4)在 rdst2 状态,没有做什么工作,延时功能,跳到rdst3状态。5)在 rdst3 状态,没有做什么工作,延时功能,跳到rdst4状态。6)在 rdst4 状态,trdy=0 ,当 trdy 为 0,表示目标设备准备好,数据在这时真正到了电脑上。spar_en=1when pre_state1=rdst4 ,spar_en是输出口,应该是校验等,跳到rdstopst状态。7)在 rdstopst状态。发送了 stop信号,一次 PCI 操作完成。8)就这样我们我们通过改变ad 的数据,一次一次的将寄存器中的数给了电脑。6、FPGA 作为从模式的配置写过程:配置写过程和配置读过程是类似的。1). 在 cfg_wr_sel=1or io_wr_sel=1 or mem_wr_sel=1的前提下,我们进入dev_st2状态,什么时候 cfg_wr_sel=1呢?在 idsel=1 and frame=0and ird y=1 and trdy=1 and devsel= 1 and stop=1 前提下(表示我们进行寄存器配置操作),我们锁存住cmd 的指令是cmd=“1011“,写配置寄存器时,使cfg_wr_sel=1。2)在 dev_st2状态,让 devsel=0这个工作,使FPGA 成为目标设备。进入wrst1状态。3)在 wrst1状态,没有做什么工作,延时功能,跳到wrst2状态。4)在 wrst2状态,我们让 cfgwr=1 ,表示可以写我了。eg:basereg 0(31 downto 8)=wrreg(31 downto 8);写什么数据呢?wrreg 是随着 ad 不停的变化的。写给谁呢?取决于再FRAME=0, 我们锁存的指令 . 当 add(5 downto 2)=“0100“ then base0= 1;else base0=0; 表示我们写基地址0,当 add(5 downto 2)=“0101“ then base1=1 ;else base1= 0; 表示我们写基地址1,在 base0=1的前提下,我们让 basereg0(31 d ownto 8)=wrreg(31 downto 8), 这时会读回计算机给我们的基地址0的地址。FPGA 程序中,我们会接收 4 种数据,基地址 0,基地址 1,中断向量寄存器,命令。其它下发数据不接收。配置寄存器中的数是我们FPGA的固定数。跳到wrst3状态。5)在 wrst3状态,没有做什么工作,延时功能,跳到wrst4状态。6) 在 wrst4 状态, trdy=0 when pre_state1=rdst4 or pre_state2=wrst4 可以认为我已经接完数了, 在 trdy=0时锁存数据。跳到 wrstopst 状态。7)在 wrstopst状态,发送 stop ,结束整个 PCI 写的操作过程。8)就这样我们一次一次的将电脑给的指令数据锁存的我们的FPGA 内部。注:在计算机一上电时,会首先进行配置写,然后再把写的数读上去。7、DMA 数据传输过程:顶上将的讲的是上电配置,数据是怎样通过DMA 传输的呢?下面讲解数据传输过程: 1). adinreg=ad; 在 DMA 过程中, ad是不停的将数送到adinreg当中的。ext_add记录在 frame0 下的状态下数据口ad 的状态。2)在 iosel=1 时,表示进行io 操作。我们的 FPGA 一共进行了两种操作, IO 操作和寄存器配置操作。上面讲的都是寄存器配置操作。 Io 操作就是数据操作。并且cbe 是“0111” ,寄存器写时:当 ext_add=“00000100“ ,我们让 int_reg_sel=1; 当 ext_add=“00001000“,我们让head_reg_sel= 1; 表示写 DMA 起始地址寄存器。当 ext_add=“00001100“,我们让count_reg_sel=1; 表示写 DMA 传递个数寄存器当 ext_add=“00010000“,我们让master_reg _sel=1; 表示 FPGA作为 DMA 的主模式具体这些寄存器配置过程如下:看slave_mode模块。iiosel=1 和 cbe 是“0111” 会使 mem_wr_sel=1,会进入写的状态机,这个状态机实际就是顶上刚讲的那个状态机。ii会进入在 dev_st2状态,让 devsel=0这个工作,使FPGA成为目标设备。进入wrst1状态。iii 在 wrst1状态,没有做什么工作,延时功能,跳到wrst2状态。iv在 wrst2状态,我们让cfgwr=1 ,表示可以写我了。data_wr是输入信号,它是由以下赋值的data_wr=cfgwr and (iowrsel and iobase0_sel) or (memwrsel and membase0_sel); 当 cfgwr ,也就是( wrst2 wrst3)时, data_wr为 1,当(data_wr=1 and master_reg _sel=1)都为 1 时,master_reg_sel 在 iosel=1 and ext_add=“00010000“ 时为 1,我们把master_reg=adinreg; 也就是在 wrst2 wrst3状态,我们将 ad数据给了 master_reg寄存器,这个状态机被谁启动的呢?iosel=1 和 cbe 是“0111”, 什么时候赋值呢?在wrst2 wrst3 状态,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号