<s id="nm53x"><xmp id="nm53x"></xmp></s><sub id="nm53x"></sub>
  • <tbody id="nm53x"><noframes id="nm53x">
    <sub id="nm53x"><progress id="nm53x"></progress></sub>
  • iihacker
    论坛版主
    论坛版主
    • 注册日期2010-01-07
    • 最后登录2017-08-16
    • 粉丝5
    • 关注8
    • 积分377分
    • 威望1941点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    • 社区居民
    阅读:6609回复:59

    PCI9054+fpga从零开始(持续更新一个月)

    楼主#
    更多 发布于:2013-07-01 13:54
    本部分内容设定了隐藏,需要回复后才能看到

     
     
     
     

    最新喜欢:

    GreeceGreece Honghong321Hongho...
    NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
    qjyun99
    驱动牛犊
    驱动牛犊
    • 注册日期2013-06-27
    • 最后登录2013-10-18
    • 粉丝0
    • 关注0
    • 积分2分
    • 威望21点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    沙发#
    发布于:2013-07-01 16:39
    thank有
    iihacker
    论坛版主
    论坛版主
    • 注册日期2010-01-07
    • 最后登录2017-08-16
    • 粉丝5
    • 关注8
    • 积分377分
    • 威望1941点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    • 社区居民
    板凳#
    发布于:2013-07-02 12:57
    转载请注明出处:http://www.ampacpure.com/read.php?tid-125690-page-e.html#a



    PCI9054有三种工作模式:M,J,C
    M模式,直接为Motorola公司的MPC850和MPC860准备的非复用接口;
    C模式,地址,数据线不复用;(主意区分和PCI信号线,不要搞混了)
    J模式,地址数据线复用。
     
     
    PCI9054的本地端支持可编程的特点,通过两个模式选择管脚MODE[1:0]来设置LocalBus端分别工作在C模式、J模式、M模式。这样可以使得PCI9054的Local Bus可以挂载不同类型的其他设备。

    再详解:
     M模式是专门为motorola公司的mcu设计的工作模式。这种模式专门为motorola公司的mpc850和mpc860提供直接的非复用的接口。
         C模式是一种类似于单片机的工作方式 。在这种工作模式下,9054芯片通过片间逻辑控制,将pci的地址线和数据线分开,很方便地为本地工作时序提供各种高难工作方式 ,一般较为广泛的应用于系统设计中。对于这种工作方式 ,设计者只要严格的把握时序的控制,把local端和pci端的各种时序控制线的时序过程严格控制,就可以很好的应用9054芯片。
         J模式是一种没有local master的工作模式,它的好处 是地址数据线没有分开,严格仿效pci总线的时序。只是为了时序的控制,增加了很多的控制信号,这样为设计者了解pci协议和更好的控制pci通信提供了更好的空间。
         本课题选用plx9054的c模式工作方式 。plx9054的工作方式可利用模式选择引脚加以选择。对于176pin-PQFP封装的plx9054芯片。模式选择引脚为pin156(mode1),pin157(mode0)
     由于M模式使用范围比较小,J模式使用起来控制比较复杂,一般使用C模式。
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    华丽的分界线,说完了9054再说一下PCI规范中的信号线
     
    PCI信号线
     1.系统信号
      CLK IN:系统时钟信号,为所有PCI传输提供时序,对于所有的PCI设备都是输入信号。其频率最高可达33MHz/66MHz,这一频率也称为PCI的工作频率。
      RST# IN:复位信号。用来迫使所有PCI专用的寄存器、定序器和信号转为初始状态。
     
    2.地址和数据信号
      AD[31::00]T/S地址、数据复用的信号。PCI总线上地址和数据的传输,必需在FRAME#有效期间进行。当FRAME#有效时的第1个时钟,AD[31::00]上的信号为地址信号,称地址期;当IRDY#和TRDY#同时有效时,AD[31::00]上的信号为数据信号,称数据期。一个PCI总线传输周期包含一个地址期和接着的一个或多个数据期。
      C/BE[3::0]# T/S:总线命令和字节允许复用信号。在地址期,这4条线上传输的时总线命令;在数据期,它们传输的时字节允许信号,用来指定在数据期,AD[31::00]线上4个数据字节中哪些字节为有效数据,以进行传输。
      PAR T/S:奇偶校验信号。它通过AD[31::00]和C/BE[3::0]进行奇偶校验。主设备为地址周期和写数据周期驱动PAR,从设备为读数据周期驱动PAR。
    3.接口控制信号
      FRAME# S/T/S:帧周期信号,由主设备驱动。表示一次总线传输的开始和持续时间。当FRAME#有效时,预示总线传输的开始;在其有效期间,先传地址,后传数据;当FRAME#撤消时,预示总线传输结束,并在IRDY#有效时进行最后一个数据期的数据传送。
      IRDY# S/T/S:主设备准备好信号。IRDY#要与TRDY#联合使用,当二者同时有效时,数据方能传输,否则,即为未准备好二进入等待周期。在写周期,该信号有效时,表示数据已由主设备提交到AD[31::00]线上;在读周期,该信号有效时,表示主设备已做好接收数据的准备。
      TRDY# S/T/S:从设备(被选中的设备)准备好信号。同样TRDY#要与IRDY#联合使用,只有二者同时有效,数据才能传输。
      STOP# S/T/S:从设备要求主设备停止当前的数据传送的信号。显然,该信号应由从设备发出。
      LOCK# S/T/S:锁定信号。当对一个设备进行可能需要多个总线传输周期才能完成的操作时,使用锁定信号LOCK#,进行独占性访问。例如,某一设备带有自己的存储器,那么它必需能进行锁定,以便实现对该存储器的完全独占性访问。也就是说,对此设备的操作是排它性的。
      IDSEL IN:初始化设备选择信号。在参数配置读/写传输期间,用作片选信号。
      DEVSEL# S/T/S:设备选择信号。该信号由从设备在识别处地址时发出,当它有效时,说明总线上有某处的某一设备已被选中,并作为当前访问的从设备。
    4.仲裁信号(只用于总线主控器)
      REQ# T/S:总线占用请求信号。该信号有效表明驱动它的设备要求使用总线。它是一个点到点的信号线,任何主设备都有它自己的REQ#信号。
      GNT# T/S:总线占用允许信号。该信号有效,表示申请占用总线的设备的请求已获得比准。
    5.错误报告信号
      PERR# S/T/S:数据奇偶校验错误报告信号。一个设备只有在响应设备选择信号(DEVSEL#)和完成数据期之后,才能报告一个PERR#。
      SERR# O/D:系统错误报告信号。用做报告地址奇偶错、特殊命令序列中的数据奇偶错,以及其他可能引起灾难性后果的系统错误。它可由任何设备发出。
    6.中断信号 在PCI总线中,中断是可选项,不一定必须具有。
      INTA# O/D:用于请求中断。
      INTB# O/D、INTC# O/D、INTD# O/D:用于请求中断,仅对多功能设备有意义。所谓的多功能设备是指:将几个相互独立的功能集中在一个设备中。各功能与中断线之间的连接是任意的,没有任何附加限制。
    7.其他可选信号
     (1)高速缓存支持信号:SBO# IN/OUT、SDONE IN/OUT
     (2)64位总线扩展信号:REQ64# S/T/S、ACK65# S/T/S
    、AD[63::32]T/S、C/BE[7::4]#T/S、PAR64 T/S。
     (3)测试访问端口/边界扫描信号:TCK IN、TDI IN、TDO OUT、TMS IN、TRST# IN。

     
     
     
     
     
     
     
    其他的版本的引脚说明,下面说的不是很清楚,建议看上面的,不过可以参考下面的:
     
    所有模式
    AD[31:0](Address and Data)地址和数据复用,首先是一个地址段,后面跟着一个或多个数据段,支持突发模式的读写;
    C/BE[3:0]#(Bus Command and Byte Enables)总线命令和数据使能复用管脚,在AD为地址线的时候作为总线命令,在AD为数据线的时候作为数据使能;
    DEVSEL#(Device Select)有效的时候表示当前设备被选中,作为输入端口;
    FRAME#(Cyclone Frame)由主设备驱动,用来表示当前设备已经开始接入,总线开始传输数据。有效:传输数据。无效:完成最后一个数据的传输;
    GNT#(Grant)用来表示当前接入的设备已经被接受;
    IDSL(Initialization Device Select)在配置寄存器读写的时候用做片选信号;
    INTA#(Interrupt A)PCI中断请求;
    IRDY#(Initiator Ready)说明当前数据有效,可以并要完成传输;
    LOCK#(Lock)提示有自动操作,需要消耗若干个时钟来完成操作;
    PAR(Parity)作为AD和C/BE两部分总线的基偶校验,在传输地址的时候PAR要在地址传输完毕后一个时钟周期保持稳定。对于数据段,PAR要在IRDY#或者TRDY#有效以后一个时钟周期保持稳定。一旦PAR数据有效,将保持有效到当前数据或地址段传输结束;
    PCLK(Clock)系统时钟,9054工作在33MHz;
    PERR#(Parity Error)用来报告奇偶校验错误,不包括特殊周期;
    PME#(Power Management Event)唤醒中断;
    REQ#(Request)请求信号,通知总线判决器,当前设备必须使用总线;
    RST#(Reset)系统复位;
    SERR#(System Error)用来报告特殊周期的奇偶校验错误和其他系统错误;
    STOP#(Stop)要求主系统,停止当前设备的数据传输;
    TRAY#(Target Ready)目标设备准备完毕,可以传输当前数据;
    BIGEND#(Big Endian Select)
    CCS#(Configuration Register Select)低有效的片选信号;
    EECS(Serial EEPROM Chip Select)选择串行EEPROM;
    EEDI/DDEO(Serial EEPROM Data In/ Serial EEPROM Data Out)控制串行EEPROM读写数据;
    EESK(Serial Data Clock)EEPROM读写时钟;
    ENUM#(Enumeration)突发输出,用来表示一个使用PCI9054芯片的适配器刚刚从一个CPI总线通道里面加入或者移出;
    LCLK(Local Processor Clock)本地时钟输入;
    LEDon/LEDin LED控制;
    LFRAME#(PCI Buffered FRAME# Signal)指示PCI总线的状态;
    LINT#(Local Interrupt)本地总线中断。输入到9054,低有效,触发一个PCI中断。作为输出,等待到一个触发发生;
    LRESETo#(Local Bus Reset Out)当PCI9054芯片被复位以后,该管脚可以用来驱动其他芯片的RESET#信号;
    MDREQ#/MDPAF/EOT#
    MODE[1:0](Bus Mode)11:M模式;10:J模式;01:保留;00:C模式;
    TEST(Test Pin)芯片检测管脚,高为检测,低为工作,平时置低;
    USERi/BACK0#/LLOCKi# 复用管脚
    USERo/DREQ0#/LLOCKo# 复用管脚
    VDD 电源
    VSS 地
    C模式:
    ADS#(Address Strobe)说明地址有效,总线有新设备接入;
    BLAST#(Burst Last)该信号由本地总线控制,表示最后一个字符的传输;
    BREQi(Bus Request In)本地总线控制,数据从本地总线输入;
    BREQo(Bus Request Out)PCI总线控制,数据从PCI总线输出;
    BTERM#(Burst Terminate)作为输入,表示当前突发操作结束,开始下一个突发地址的读写,和PCI9054内部的可编程等待状态生成器一起使用。作为输出,和READY#一起使用,中断当前突发操作,开始下一个突发操作地址周期;
    DP[3:0](Data Parity)奇偶校验数据;
    LA[31:2](Address Bus)地址总线;
    LBE[3:0]#(Byte Enable)控制数据有效,不同的模式有不同的控制方法;
    LD[31:0](Data Bus)数据总线;
    LHOLD(Hold Request)发送要求使用本地总线,本地总线决定分配给当前装置以后,判决器发送LHOLDA信号反馈;
    LHOLDA(Hold Request)反馈信号;
    LSERR#(System Error Interrupt Output)系统错误中断;
    LW/R#(Write/?Read)低电平读,高电平写;
    READY#(Ready Input/Output)无论主还是从模式,表示数据准备好,有效;
    WAIT#(Wait Input/Output)作为输入,控制PCI9054插入等待状态。作为输出,PCI9054处于Ready状态。
    J模式:
    ADS#(Address Strobe)说明地址有效,总线有新设备接入;
    ALE(Address Latch Enable)地址传输时有效,数据传输时无效;
    BLAST#(Burst Last)该信号由本地总线控制,表示最后一个字符的传输;
    BREQi(Bus Request In)本地总线控制,数据从本地总线输入;
    BREQo(Bus Request Out)PCI总线控制,数据从PCI总线输出;
    BTERM#(Burst Terminate)作为输入,表示当前突发操作结束,开始下一个突发地址的读写,和PCI9054内部的可编程等待状态生成器一起使用。作为输出,和READY#一起使用,中断当前突发操作,开始下一个突发操作地址周期;
    DEN#(Data Enable)和DT/R#连接在一起使用,用来控制和本地总线连接的数据收发器;
    DP[3:0](Data Parity)奇偶校验数据;
    DT/R#(Data Transmit/Receive)与DEN#连接在一起使用,有效的时候PCI9054接收数据;
    LA[28:2](Local Address Bus)本地总线地址;
    LAD[31:0](Address/Data Bus)地址周期:该总线包括了物理地址总线的上30位。数据周期:该总线传输32位数据;
    LBE[3:0]#(Byte Enable)控制数据有效,不同的模式有不同的控制方法;
    LHOLD(Hold Request)发送要求使用本地总线,本地总线决定分配给当前装置以后,判决器发送LHOLDA信号反馈;
    LHOLDA(Hold Request)反馈信号;
    LSERR#(System Error Interrupt Output)系统错误中断;
    LW/R#(Write/Read)低电平读,高电平写;
    READY#(Ready Input/Output)无论主还是从模式,表示数据准备好,有效;
    WAIT#(Wait Input/Output)作为输入,控制PCI9054插入等待状态。作为输出,PCI9054处于Ready状态。


     
     
     
     
     
    NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
    iihacker
    论坛版主
    论坛版主
    • 注册日期2010-01-07
    • 最后登录2017-08-16
    • 粉丝5
    • 关注8
    • 积分377分
    • 威望1941点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    • 社区居民
    地板#
    发布于:2013-07-02 17:38
    转载请注明出处:http://www.ampacpure.com/read.php?tid-125690-page-e.html#a



    PCI9054内部状态机给用户提供了三种传输方式:PCI Initiator传输方式(主模式)、PCI Target(从模式)传输方式以及PCI DMA传输方式。

    图片:pci9054.jpg


     
    PCI Initiator(主模式)传输方式下,PCI9054成为PCI Bus端的主机,同时是Local Bus端的从机,由Local Bus端主动发起数据传输,PCI9054被动后再主动向PCI Bus发起传输。
         主模式操作就是允许本地的cpu访问pci总线的内存和I/O接口。模式选择必须在pci命令寄存器中使能给出。如pci主设备存储器和i/o范围寄存器,pci基址寄存器,主设备配置和命令寄存器等。主模式操作包括pci主设备存储器和i/o译码,pci主设备存储器和i/o配置访问,pci双地址周期访问,pci主设备存储器写并无效等操作。
     
     
    PCI Target(从模式)传输方式下PCI9054的角色刚好与PCI Initiator方式相反,成为PCI Bus端的从机以及Local Bus端的主机。而在PCI DMA方式下PCI9054同时是PCI Bus端和Local Bus端的主机。
    从模式就是允许pci总线上的主控设备访问局部总线上的plx9054的配置寄存器和内存,支持突发和单周期动模式传输。Plx9054通过16字长的pci从设备度FIFO和32字长的pci从设备写FIFO,来支持从pci总线到局部总线上的突发和单周期存储器映射访问和i/o映射访问。Pci基址寄存器用来设定pci存储器和i/o地址空间。从模式操作包括延时读操作,提前读操作等。这种模式有非复用的地址和数据总线,电路设计,时序和控制相对简单。
     
    DMA模式
     Plx9054  有一个强大的双通道分散/收集dma控制器,支持pci主机和适配器内存的高效突发传输。两个独立的dma通道能从局部总线到pci总线和从pci总线到局部总线传输数据。每个通道包括一个dma控制器和一个专用双向FIFO。两个通道都支持块传输,分散/收集传输,应用或者不用EOT传输等。模式选择在plx9054 成为一个pci总线主设备之前由主设备使能位(pcicr[2])使能。另外,两个dma通道都能编程实现8,16,32bit局部总线带宽,使能/使无效内部等待周期,使能/使无效局部总线突发传输;执行pci存储器写并无效操作;设置pci中断(inta)或看是否本地中断(i.int)等  对于数据传输模式的选择,主要是根据硬件制作者对硬件设计的需求而定的。当硬件制作者选择有pci发起控制的时候,则9054应该为pci的工作目标,这时候应选择9054的pci target方式。当硬件制作者选择由本地端发起控制的时候 ,9054 成为主控设备,而pci则成为9054的工作目标,这种情况应选择婆4的pci master方式。而在数据进行dma传输的时候,9054  对pci端和local端都是主控设备,本身就具有dma控制器,完全可以脱离pc机进行dma控制,这时候,9054就工作在dma传输方式。本课题就是由pc机发起控制请求向外部sram读写数据的,所以选择plx9054从模式(pci target)传输方式。在这种模式下,plx9054对pci端是目标设备,对local端则是主控设备
     
    PCI9054提供了两个独立的可编程DMA(Direct Memory Access,直接存储器存取)控制器;每个通道均支持块和分散/集中的DMA方式;在PCI总线端支持32位的数据位宽,时钟速率达到33MHz;本地端可以编程实现8、16或32位的数据宽度;传输速率最高可达132MB/s;本地总线端时钟最高可达50MHz支持复用/非复用的32位地址数据。
     
    在PCI9054内部分别提供了这三种传输方式下的内部寄存器,方便设计者来对每一种传输方式进行配置
     
     
     
     
     
     
    NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
    iihacker
    论坛版主
    论坛版主
    • 注册日期2010-01-07
    • 最后登录2017-08-16
    • 粉丝5
    • 关注8
    • 积分377分
    • 威望1941点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    • 社区居民
    地下室#
    发布于:2013-07-02 17:44
    预留
    NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
    iihacker
    论坛版主
    论坛版主
    • 注册日期2010-01-07
    • 最后登录2017-08-16
    • 粉丝5
    • 关注8
    • 积分377分
    • 威望1941点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    • 社区居民
    5楼#
    发布于:2013-07-02 17:46
    [sell=1,money][/sell]PCI9054笔记.pdf
    方便交流,建立了FPGA+PCI群,以后技术要点还是要发到论坛上来。 注明:FPGA+PCI
    搞活驱网才是王道。天天扯淡的就别进来了。
    群:187471817
     
     资料已经更新到PCI  PCIEX4
     资料出售地址:
    http://weixinstrong.taobao.com/
     
    NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
    terry_nyh
    驱动牛犊
    驱动牛犊
    • 注册日期2013-07-04
    • 最后登录2013-08-14
    • 粉丝0
    • 关注0
    • 积分1分
    • 威望11点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    6楼#
    发布于:2013-07-04 14:15
    拜读看看
    iihacker
    论坛版主
    论坛版主
    • 注册日期2010-01-07
    • 最后登录2017-08-16
    • 粉丝5
    • 关注8
    • 积分377分
    • 威望1941点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    • 社区居民
    7楼#
    发布于:2013-07-05 17:50
    接下来我们应该了解PCI配置空间。
    PCI空间包含了我们我们必须的访问信息。比如mem base addr ,IO base addr .如果你是做黑客的话你可以用到扩展ROM base addr,自己写个PCI板卡BIOS,在BIOS运行完后接管,这个时候你就可以胡作非为了,比如拦截硬盘访问,植入带有操作系统的驱动,这就是很多人说的360都杀不掉的木马,国外有开源项目。扯太远了。还有INT中断啥的,对了还有关键的一个PID  VID,系统根据INF加载驱动就是通过这个,还有就是驱动的编写。
    我们一展美图
            DW |    Byte3    |    Byte2    |    Byte1    |     Byte0     | Addr
            ---+---------------------------------------------------------+-----
             0 |     Device ID     |     Vendor ID      | 00
            ---+---------------------------------------------------------+-----
             1 |      Status     |      Command      | 04
            ---+---------------------------------------------------------+-----
             2 |        Class Code        | Revision ID | 08
            ---+---------------------------------------------------------+-----
             3 |   BIST  | Header Type | Latency Timer | Cache Line  | 0C
            ---+---------------------------------------------------------+-----
             4 |           Base Address 0           | 10
            ---+---------------------------------------------------------+-----
             5 |           Base Address 1           | 14
            ---+---------------------------------------------------------+-----
             6 |           Base Address 2           | 18
            ---+---------------------------------------------------------+-----
             7 |           Base Address 3           | 1C
            ---+---------------------------------------------------------+-----
             8 |           Base Address 4           | 20
            ---+---------------------------------------------------------+-----
             9 |           Base Address 5           | 24
            ---+---------------------------------------------------------+-----
            10 |          CardBus CIS pointer          | 28
            ---+---------------------------------------------------------+-----
            11 |  Subsystem Device ID  |   Subsystem Vendor ID   | 2C
            ---+---------------------------------------------------------+-----
            12 |        Expansion ROM Base Address        | 30
            ---+---------------------------------------------------------+-----
            13 |        Reserved(Capability List)         | 34
            ---+---------------------------------------------------------+-----
            14 |            Reserved             | 38
            ---+---------------------------------------------------------+-----
            15 |  Max_Lat  |  Min_Gnt  |  IRQ Pin  |  IRQ Line  | 3C
            -------------------------------------------------------------------
     
    这个只是PCI空间256的前64字节。4*16
     
    PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是由操作系统决定其映射的基址。
    系统加电时,BIOS检测PCI总线,确定所有连接在PCI总线上的设备以及它们的配置要求,并进行系统配置。所以,所有的PCI设备必须实现配置空间,从而能够实现参数的自动配置,实现真正的即插即用。
    PCI总线规范定义的配置空间总长度为256个字节,配置信息按一定的顺序和大小依次存放。前64个字节的配置空间称为配置头,对于所有的设备都一样,配置头的主要功能是用来识别设备、定义主机访问PCI卡的方式(I/O访问或者存储器访问,还有中断信息)。其余的192个字节称为本地配置空间,主要定义卡上局部总线的特性、本地空间基地址及范围等。
    PCI设备有三个空间——内存地址空间、IO地址空间和配置空间。由于PCI支持即插即用,所以PCI设备不是占用固定的内存地址空间或I/O地址空间,而是可以由操作系统决定其映射的基址。
     
    那我们顺便看一下PLX9054对应的PCI和本地配置空间

    图片:9054_EEPROM.png


    忘了说了,PLX9054的配置信息是存到EEPROM中的。我们通过PLXMon工具来配置。
    从图上看以出来主要分2部分,第一部分是PCI配置空间,第二部分是本地的配置空间。
    是不是怀疑PCI配置空间如此至少,谁让人家是即插即用那。我们来一个对号入座。比如PCI配置空间的0X3C出有INT中断,呵呵 果真如此吧。PCI配置空间和PLXMon配置空间的偏移都是这个。
     
    NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
    iihacker
    论坛版主
    论坛版主
    • 注册日期2010-01-07
    • 最后登录2017-08-16
    • 粉丝5
    • 关注8
    • 积分377分
    • 威望1941点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    • 社区居民
    8楼#
    发布于:2013-07-05 18:14
    PCI9054有SPACE0 SPACE1连个地址空间,都可以配置成IO和存储器空间。这两个类似但是还是有
    差别的。
    1 存储空间支持0-4G空间映射, IO只支持0-256字节映射
    2 存储空间可以8/16/32位总线位宽操作,IO只支持32位
    3 存储空间支持单一周期和突发模式读写。 IO只支持单一周期读写。
     
     
    根据自己的需求选择上面两种方式进行操作。如果是数据流最好是存储器空间,采用DMA方式,
    进行参数配置和寄存器读取采用IO空间。
    对于上位机驱动IO和存储器空间自动分配,不会重叠,但是对于FPGA我们要避免地址重叠。
     
     
    我们接下来介绍IO空间操作和存储器空间操作(DMA)
    一  先说IO空间操作吧
    这个操作中,PLX5054对于PCI总线来说是从设备,对于FPGA来说是主设备。可以这样记住,左边:PCI是主设备----plx9054是从,右边
    PLX9054是主--FPGA是从设备。
    即PCI局部总线端 或者其他设备作为主设备发起PCI9054的IO操作,此时PCI9054的局部总线端是目标设备。同事PCI9054的本地总线又作为本地总线端
    向FPGA发起IO操作,FPGA作为目标设备接收总线控制。

    图片:PCI Target Read.png



    Read过程

    图片:PCI Target Write.png



    Write过程

    图片:PCI9054目标设备Local总线存取过程.png


    PCI9054目标设备Local总线存储过程。

    上图可以看出存储过程主要是进行地址映射的过程,首先进行Local端和PCI端的寄存器映射,再通过PCI9054内部的两个目标设备FIFO进行存取
    ,主机根据寄存器的值既可以得到映射位置上面的数据。

    上面的过程主要对应如下时序:
    1 主设备发起Local总线占用请求LHOLD信号,FPGA应答产生LHOLDA信号运行该请求。
    2 主设备获得运行后,发起起始信号ADS#,并提供Local总线读写方向信号LW/R#以及地址信号LA[31:2]
    3 fpga获得其实信号后,发出总线准备好信号READY#,并执行相应操作。
    4 主设备完成操作后,发起结束信号BLAST#,FPGA捕获后改变READY#状态。
    5 主设备捕获READY#状态后,释放Local总线占用信号LHOLD。
    FPGA应答线释放,结束操作。
    NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
    iihacker
    论坛版主
    论坛版主
    • 注册日期2010-01-07
    • 最后登录2017-08-16
    • 粉丝5
    • 关注8
    • 积分377分
    • 威望1941点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    • 社区居民
    9楼#
    发布于:2013-07-06 09:10
    IO模式的FPGA代码分析:

     // la[13:0] == 14'b1 ,实现定义好的地址协议,用于判断操作类似类似,联合以下信号
    // ADS#、LW/R、LBE#和LA(控制模块将对以上信号锁存和译码来确定操作目标和操作类型)本程序未使用LBE
    module WITH_PCI_LED_RUN(
                            clkin,//时钟
                            lrst,//RST
                            ld, //本地总线的数据信号
                            ads,//开始信号
                            lwr,//低电平读,高电平写
                            ready,//总线准备好信号
                            blast,//操作结束信号
                            lhold, //Local总线占用请求信号
                            lholda,//Local总线占用允许信号
                            la, //本地总线的地址信号
                            ccs,//低有效的片选信号
                            bterm,//当前突发操作结束
                            led //OUTPUT控制LED的
                            );
     
        input             clkin;
        input            lrst,ads,lwr,blast,lhold;
        input    [13:0]    la;
        output            ready,lholda,ccs,bterm;
        input    [31:0]    ld;
        output     [3:0]     led;
     
        reg     [3:0]     led;
        reg     [24:0]    count;
        reg     [1:0]     state;
        wire             clk;
        reg                lholda;
        wire            ready,ccs,bterm;
     
        reg                readyflag;
        reg        [7:0]    LEDByControl;
    //--计数分频-------------------------------------
    always @ (posedge clkin)
        count <= count+1;
     
    assign clk = count[24];
    //--LED控制--------------------------------
    always @ (posedge clk)
        begin
            case(LEDByControl)
                8'd1:    led <= 4'b0001;
                8'd2:    led <= 4'b0010;
                8'd3:    led <= 4'b0100;
                8'd4:    led <= 4'b1000;
                8'd5:    case(state)
                            2'b00:    led <= 4'b0001;
                            2'b01:    led <= 4'b0010;
                            2'b10:    led <= 4'b0100;
                            2'b11:    led <= 4'b1000;
                        endcase
                default:led <= 4'b0000;
            endcase        
        end
     
    always @ (posedge clk)
        state <= state+1;
     
    //--PCI本地控制器-------------------------------
    always @(posedge clkin)
        lholda <= lhold;
     
    always @(posedge clkin or negedge lrst)
        begin
            if(!lrst)
                begin
                    readyflag <= 1'b0;
                    LEDByControl[7:0] <= 8'b0;
                end
            else if(!ads & lwr & blast & la[13:0] == 14'b1)//ads为低,blast 为高代表是一个起始信号。(低电平有效)
                begin
                    readyflag <= 1'b1;
                end
            else if(ads & lwr & blast & readyflag == 1'b1 & la[13:0] == 14'b1)// 开始阶段到取数据阶段的一个中间状态,可以进行相应操作
                begin                                                                                        
                    readyflag <= 1'b1;                                            
                end
            else if(ads & lwr & !blast & readyflag == 1'b1 & la[13:0] == 14'b1)  //取数据。
                begin
                    LEDByControl[7:0] <= ld[31:24];
                    readyflag <= 1'b0;
                end
            else
                begin
                    LEDByControl[7:0] <= LEDByControl[7:0];
                    readyflag <= 1'b0;
                end
        end
    //-----------------------------------------------------
    assign       ccs = 1'b1;
    assign       bterm = 1'b1;
    assign          ready = 1'b0;
     
    endmodule
     
    再详细的说明等拿到板卡在调试。
    下图是片上逻辑分析仪的时序图

    图片:时序图.png


    NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
    iihacker
    论坛版主
    论坛版主
    • 注册日期2010-01-07
    • 最后登录2017-08-16
    • 粉丝5
    • 关注8
    • 积分377分
    • 威望1941点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    • 社区居民
    10楼#
    发布于:2013-07-06 09:18
    下一个就是DMA模式
    NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
    ddsea
    驱动牛犊
    驱动牛犊
    • 注册日期2013-04-17
    • 最后登录2013-08-12
    • 粉丝0
    • 关注0
    • 积分1分
    • 威望11点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    11楼#
    发布于:2013-07-11 11:03
    拜读啦,谢谢分享!
    popboy126
    驱动牛犊
    驱动牛犊
    • 注册日期2011-10-19
    • 最后登录2013-07-12
    • 粉丝0
    • 关注0
    • 积分1分
    • 威望11点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    12楼#
    发布于:2013-07-12 19:54
    谢谢楼主分享经验,学习了!
    helsin
    驱动牛犊
    驱动牛犊
    • 注册日期2006-06-04
    • 最后登录2013-07-14
    • 粉丝0
    • 关注0
    • 积分1分
    • 威望11点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    13楼#
    发布于:2013-07-13 23:15
    谢谢,不错。
    jorley
    驱动牛犊
    驱动牛犊
    • 注册日期2011-11-21
    • 最后登录2016-03-25
    • 粉丝0
    • 关注0
    • 积分2分
    • 威望21点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    14楼#
    发布于:2013-07-15 11:18
    thanks a lot
    iihacker
    论坛版主
    论坛版主
    • 注册日期2010-01-07
    • 最后登录2017-08-16
    • 粉丝5
    • 关注8
    • 积分377分
    • 威望1941点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    • 社区居民
    15楼#
    发布于:2013-07-18 16:25

    图片:IMG_20130718_133351.jpg


    图片:IMG_20130718_133356.jpg


    图片:IMG_20130718_133404.jpg


    图片:IMG_20130718_133445.jpg



    淘宝地址:
    驱动会员成本价:60元一片,邮费自付。
    http://item.taobao.com/item.htm?spm=686.1000925.1000774.11.dP7Byo&id=26501560516
    四层板,15*11cm 斜边+金手指。
    NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
    iihacker
    论坛版主
    论坛版主
    • 注册日期2010-01-07
    • 最后登录2017-08-16
    • 粉丝5
    • 关注8
    • 积分377分
    • 威望1941点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    • 社区居民
    16楼#
    发布于:2013-07-18 16:37
    近期比较忙,过几天,成本价出售 成品PCI卡

    在这里插入一个硬件调试的步骤。
    因为做的新板卡EEPROM是空白的所以在进入系统时候会进不去,也就是在BIOS启动后,就卡在那里了,屏幕左上角会有一个光标不停的闪烁。
    恭喜你,这是成功的最后一步了。至少我的系统是这样的。
    方法有两个
    1  使用编程器烧写EEPROM,记得是16bit的。(我用编程器正常烧写了还是不行,没有天理)
    2 采用一般的路子, 把TEST管脚拉高并且把EEDIO管脚拉低时能进入系统的,原因是TEST拉高进入测试模式,PCI9054相当于不工作,在出现进度条时候
    把TEST拉低。这样进入之后系统提示新硬件,然后就是安装官方驱动(要求重启,上面的步骤再来一次),再就是启动PLXMON烧写eeprom。
    正常烧写了EEPROM后,设置TEST管脚一直为低,,就可以使用正常启动系统了。以后 以后的以后都可以正常启动。
    NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
    nurikolu
    驱动牛犊
    驱动牛犊
    • 注册日期2007-08-14
    • 最后登录2013-07-26
    • 粉丝0
    • 关注0
    • 积分13分
    • 威望43点
    • 贡献值0点
    • 好评度2点
    • 原创分0分
    • 专家分0分
    17楼#
    发布于:2013-07-26 14:06
    受益良多 希望大大可以持續更新此文...
    gutian98
    禁止发言
    禁止发言
    • 注册日期2003-01-12
    • 最后登录2016-12-11
    • 粉丝4
    • 关注2
    • 积分760分
    • 威望8026点
    • 贡献值1点
    • 好评度364点
    • 原创分0分
    • 专家分21分
    • 金点子奖
    • 社区居民
    18楼#
    发布于:2013-07-30 16:36
    用户被禁言,该主题自动屏蔽!
    wuwovicky
    驱动牛犊
    驱动牛犊
    • 注册日期2013-07-30
    • 最后登录2014-01-12
    • 粉丝0
    • 关注0
    • 积分1分
    • 威望11点
    • 贡献值0点
    • 好评度0点
    • 原创分0分
    • 专家分0分
    19楼#
    发布于:2013-07-30 19:02
    正在学9054的开发呢,看看。
    上一页
    游客

    返回顶部