精华内容
下载资源
问答
  • 文档主要包括四个部分:1)Magwizard中例化模块的说明;...3)结合实际应用介绍应用层接口信号(我们主要帮客户解决这部分的问题,底层软件驱动部分由客户自己开发,Altera不负责支持);4)学习初期疑问及AE的解答。
  • altera PCIE设计指导

    2015-08-28 08:54:23
    刚做完了一个PCIE项目,使用altera芯片,做一下总结。
  • PCIE一套齐全,资料的整理花费了很长时间。相信我一定值得。有问题call我。
  • Intel Altera PCIE IP介绍

    千次阅读 2020-02-09 20:59:46
    本文主要是介绍下关于altera器件上的PCIE IP。 目前最高端的agilex系列fpga已经能支持到PCIE5.0 即32Gbpsx16.在quartusii里可以通过两种方式来生成PCIE ,一种是利用 Hard IP For PCI Express ,这种方式生成的IP...

    本文主要是介绍下关于altera器件上的PCIE IP。
    目前最高端的agilex系列fpga已经能支持到PCIE5.0 即32Gbpsx16.在quartusii里可以通过两种方式来生成PCIE ,一种是利用Hard IP For PCI Express ,这种方式生成的IP是一个完整的PCIE架构包括事务层,数据链路层,MAC以及底层物理层。 一种是利用Tranceiver Native PHY。

    在这里插入图片描述
    下表列出了两者的区别如果用Native PHY的话需要自己添加MAC,数据链路以及事务层 。而使用Hard IP 则是完整解决方案,既有MAC,数据链路,事务层,同时也包含了PHY物理层,即包括了NATIVE PHY,不需要再额外列化Native PHY IP.在这里插入图片描述
    在这里插入图片描述

    2、Hard IP for PCI Express 顶层模块的信号介绍

    下图是一张完整的Hard IP的顶层接口在这里插入图片描述

    (1)Avalon -ST
    这个是Hard IP的输入输出数据流跟上层用户逻辑间的接口。
    (2)物理层信号接口
    差分串行高速接口是root跟endpoint间的物理链路连接信号
    在这里插入图片描述

    (3)PIPE Interface
    该接口只能用于仿真,在实际板上调试时是不能用的。你在仿真的时候可以使用PIPE 接口或者serial serdes接口。使用PIPE接口的话是bypass了serdes模块的,所以,仿真速度更快。
    (4)其他的管理控制接口

    在这里插入图片描述

    注意:A10上不是每个Hard IP都支持CVP功能,只有是bottom left支持CVP(在pin planner里对应的就是bottom right)
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • Altera pcie-avmm dma IP寄存器 DMA Descriptor Controller Registers DMA控制器读写均支持最多128个描述符,读写操作是以FPGA视角来看,读操作是从PCIe地址空间到FPGA Avalon-MM地址空间,写操作是从FPGA ...

    作者

    QQ群:852283276
    微信:arm80x86
    微信公众号:青儿创客基地
    B站:主页 https://space.bilibili.com/208826118

    FPGA设计

    参考我的博客:Altera FPGA PCIe Avalon-MM DMA设计

    Altera pcie-avmm dma IP寄存器

    DMA Descriptor Controller Registers

    DMA控制器读写均支持最多128个描述符,读写操作是以FPGA视角来看,读操作是从PCIe地址空间到FPGA Avalon-MM地址空间,写操作是从FPGA Avalon-MM地址空间到PCIe地址空间。
    在DMA控制器寄存器里设置描述符表位于在PCIe地址空间里的地址和大小,DMA控制器用Read Data Mover首先将描述符复制到自己内部的FIFO中,然后在根据描述符来开始DMA传输。描述符在RC内的地址必须是32字节对齐的。
    DMA控制器有寄存器指示读写描述符的完成状态,读和写分别有自己的状态寄存器表,每个表有128个连续的DWORD项,对应128个描述符。状态字占用512字节,位置在RC Read Status and Descriptor Base指定的地址偏移0处,而实际的描述符在0x200偏移处,DMA控制器项状态字的done位写1表示传输成功,DMA控制器在完成最后一个描述符后会发送一个MSI中断,在接收到中断之后,主机host软件可以轮询done位来判断描述符状态,但是DMA控制器不会设置done位或者发送MSI在每一个描述符完成的时候,它根据RD_DMA_LAST PTR和WR_DMA_LAST_PTR寄存器存储的描述符ID来操作,由于描述符支持PCIe完成包的乱序传输,所以done位置位的时候,描述符可能还没有传输完成。例如想在128个描述符的传输中间时刻和完成时候获得通知:

    1. 写入RD_DMA_LAST_PTR值63。
    2. 写入RD_DMA_LAST_PTR值127。
    3. 轮询第63个状态字。
    4. 轮询第127个状态字。

    Read DMA Descriptor Controller Registers

    地址偏移寄存器访问权限描述
    0x00RC Read Status and Descriptor Base (Low)R/W低32位,在设置高32位之后设置,地址必须32位对齐,在传输完成的时候才能改变这个寄存器
    0x04RC Read Status and Descriptor Base (High)R/W高32位
    0x08EP Read Descriptor FIFO Base (Low)RW低32位,指定存储描述符的FIFO地址,在设置高32位之后设置
    0x0CEP Read Descriptor FIFO Base (High)RW高32位
    0x10RD_DMA_LAST_PTRRW读返回上次操作的描述符ID,如果没有DMA操作则返回0xFF,指定最后一个操作的描述符ID发起DMA,比如,读返回4,为了传输5个描述符,软件应该写入9
    0x14RD_TABLE_SIZERW设置读描述符表的大小,值为描述符数量减1,默认为127
    0x18RD_CONTROLRW高31位保留,第0位设置上报每一个描述符的done位,但MSI都不会每次上报,否则根据RD_DMA_LAST_PTR来上报

    Write DMA Descriptor Controller Registers

    和读一样,地址偏移在0x100。

    Read DMA and Write DMA Descriptor Format

    每个描述符32字节,Read/Write Status and Descriptor Base + 0x200处,

    地址偏移寄存器描述
    0x00RD_LOW_SRC_ADDR低32位,DMA源地址,PCIe地址空间
    0x04RD_HIGH_SRC_ADDR高32位
    0x08RD_CTRL_LOW_DEST_ADDR低32位,Avalon-MM地址空间
    0x0CRD_CTRL_HIGH_DEST_ADDR高32位
    0x10CONTROL[31:25] Reserved,必须为0
    [24:18] ID,描述符ID,0-127
    [17:00] SIZE,传输大小,以DWORD单位,最大传输大小是1MB-4bytes,超过最大传输大小,按最大值传输,否则传输设置值,这个字段最大值为0x40000-0x1
    0x14-0x1CReservedN/A

    windows DMA编程

    分配Descriptor内存,

        NTSTATUS status = WdfCommonBufferCreate(engine->parentDevice->dmaEnabler, bufferSize,
                                                WDF_NO_OBJECT_ATTRIBUTES, &engine->descBuffer);
        if (!NT_SUCCESS(status)) {
            TraceError(DBG_INIT, "WdfCommonBufferCreate failed: %!STATUS!", status);
            return status;
        }
    
        PHYSICAL_ADDRESS descBufferLA = WdfCommonBufferGetAlignedLogicalAddress(engine->descBuffer);
        PUCHAR descBufferVA = (PUCHAR)WdfCommonBufferGetAlignedVirtualAddress(engine->descBuffer);
        RtlZeroMemory(descBufferVA, bufferSize);
    

    申请MSI/MSI-X中断,

        NTSTATUS status = WdfInterruptCreate(xdma->wdfDevice, &config, &attribs,
                                             &(xdma->channelInterrupts[index]));
        if (!NT_SUCCESS(status)) {
            TraceError(DBG_INIT, "WdfInterruptCreate failed: %!STATUS!", status);
        }
    

    申请DMA,这里设置了ADMA_MAX_TRANSFER_SIZE,

    	WdfDeviceSetAlignmentRequirement(adma->wdfDevice, FILE_32_BYTE_ALIGNMENT); //add by zhuce 
        WDF_DMA_ENABLER_CONFIG dmaConfig;
        WDF_DMA_ENABLER_CONFIG_INIT(&dmaConfig, WdfDmaProfileScatterGather64Duplex, ADMA_MAX_TRANSFER_SIZE);
        status = WdfDmaEnablerCreate(adma->wdfDevice, &dmaConfig, WDF_NO_OBJECT_ATTRIBUTES, &adma->dmaEnabler);
        if (!NT_SUCCESS(status)) {
            TraceError(DBG_INIT, " WdfDmaEnablerCreate() failed: %!STATUS!", status);
            return status;
        }
    

    申请读/写队列,

    	WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchSequential);
    	config.EvtIoWrite = EvtIoWriteDma;
    	//config.EvtIoRead = EvtIoReadDma;
    	WDF_OBJECT_ATTRIBUTES_INIT(&attribs);
    	attribs.SynchronizationScope = WdfSynchronizationScopeQueue;
    	WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&attribs, QUEUE_CONTEXT);
    	status = WdfIoQueueCreate(device, &config, &attribs, queue);
    	if (!NT_SUCCESS(status)) {
    		TraceError(DBG_INIT, "WdfIoQueueCreate failed %d", status);
    		return status;
    	}
    

    发起DMA,ADMA_EngineProgramDma作为回调函数,超过ADMA_MAX_TRANSFER_SIZE,传输会被分多次,WDF为我们做了很多工作,这些我们都是看不到的。

        status = WdfDmaTransactionInitializeUsingRequest(queue->engine->dmaTransaction, Request,
                                                         ADMA_EngineProgramDma,
                                                         WdfDmaDirectionReadFromDevice);
        if (!NT_SUCCESS(status)) {
            TraceError(DBG_IO, "WdfDmaTransactionInitializeUsingRequest failed: %!STATUS!",
                       status);
            goto ErrExit;
        }
        status = WdfDmaTransactionExecute(queue->engine->dmaTransaction, queue->engine);
        if (!NT_SUCCESS(status)) {
            TraceError(DBG_IO, "WdfDmaTransactionExecute failed: %!STATUS!", status);
            goto ErrExit;
        }
    

    回调函数,填入描述符表。

        for (ULONG i = 0; i < SgList->NumberOfElements; i++) {
            descriptor[i].control = XDMA_DESC_MAGIC;
            descriptor[i].numBytes = SgList->Elements[i].Length;
            ULONG hostAddrLo = SgList->Elements[i].Address.LowPart;
            LONG hostAddrHi = SgList->Elements[i].Address.HighPart;
            if (Direction == WdfDmaDirectionWriteToDevice) {
                // source is host memory
                descriptor[i].srcAddrLo = hostAddrLo;
                descriptor[i].srcAddrHi = hostAddrHi;
                descriptor[i].dstAddrLo = LIMIT_TO_32(deviceOffset);
                descriptor[i].dstAddrHi = LIMIT_TO_32(deviceOffset >> 32);
            } else {
                // destination is host memory
                descriptor[i].srcAddrLo = LIMIT_TO_32(deviceOffset);
                descriptor[i].srcAddrHi = LIMIT_TO_32(deviceOffset >> 32);
                descriptor[i].dstAddrLo = hostAddrLo;
                descriptor[i].dstAddrHi = hostAddrHi;
            }
        }
    
    展开全文
  • altera公司的pcie IP核实现方案。包括Hard IP设计方案以及soft IP设计方案。
  • Altera pcie开发手册

    2011-05-15 18:01:57
    Altera pcie开发手册 新版11.0的包含了Qsys的内容
  • alterapcie,qsys设计流程,sgdma,windriver驱动; 注意:并非手把手介绍每个步骤,只是介绍了最主要的东西,简单明了。 源代码太大,上传不了!
  • 版权声明:本文为CSDN博主「黑客三遍猪」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。...Altera pcie-avmm dma IP寄存器DMA Descriptor Controller RegistersDMA控制器...

    版权声明:本文为CSDN博主「黑客三遍猪」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/Zhu_Zhu_2009/article/details/80790252

    Altera pcie-avmm dma IP寄存器
    DMA Descriptor Controller Registers
    DMA控制器读写均支持最多128个描述符,读写操作是以FPGA视角来看,读操作是从PCIe地址空间到FPGA Avalon-MM地址空间,写操作是从FPGA Avalon-MM地址空间到PCIe地址空间。
    在DMA控制器寄存器里设置描述符表位于在PCIe地址空间里的地址和大小,DMA控制器用Read Data Mover首先将描述符复制到自己内部的FIFO中,然后在根据描述符来开始DMA传输。描述符在RC内的地址必须是32字节对齐的。
    DMA控制器有寄存器指示读写描述符的完成状态,读和写分别有自己的状态寄存器表,每个表有128个连续的DWORD项,对应128个描述符。状态字占用512字节,位置在RC Read Status and Descriptor Base指定的地址偏移0处,而实际的描述符在0x200偏移处,DMA控制器项状态字的done位写1表示传输成功,DMA控制器在完成最后一个描述符后会发送一个MSI中断,在接收到中断之后,主机host软件可以轮询done位来判断描述符状态,但是DMA控制器不会设置done位或者发送MSI在每一个描述符完成的时候,它根据RD_DMA_LAST PTR和WR_DMA_LAST_PTR寄存器存储的描述符ID来操作,由于描述符支持PCIe完成包的乱序传输,所以done位置位的时候,描述符可能还没有传输完成。例如想在128个描述符的传输中间时刻和完成时候获得通知:

    1、写入RD_DMA_LAST_PTR值63。
    2、写入RD_DMA_LAST_PTR值127。
    3、轮询第63个状态字。
    4、轮询第127个状态字。

    Read DMA Descriptor Controller Registers

    地址偏移寄存器访问权限描述
    0x00RC Read Status and Descriptor Base (Low)RW低32位,在设置高32位之后设置,地址必须32位对齐,在传输完成的时候才能改变这个寄存器
    0x04RC Read Status and Descriptor Base (High)RW高32位
    0x08EP Read Descriptor FIFO Base (Low)RW低32位,指定存储描述符的FIFO地址,在设置高32位之后设置
    0x0CEP Read Descriptor FIFO Base (High)RW高32位
    0x10RD_DMA_LAST_PTRRW读返回上次操作的描述符ID,如果没有DMA操作则返回0xFF,指定最后一个操作的描述符ID发起DMA,比如,读返回4,为了传输5个描述符,软件应该写入9
    0x14RD_TABLE_SIZERW设置读描述符表的大小,值为描述符数量减1,默认为127
    0x18RD_CONTROLRW高31位保留,第0位设置上报每一个描述符的done位,但MSI都不会每次上报,否则根据RD_DMA_LAST_PTR来上报

     

    Write DMA Descriptor Controller Registers

    和读一样,地址偏移在0x100。

    Read DMA and Write DMA Descriptor Format

    每个描述符32字节,Read/Write Status and Descriptor Base + 0x200处。

    地址偏移寄存器描述
    0x00RD_LOW_SRC_ADDR低32位,DMA源地址,PCIe地址空间
    0x04RD_HIGH_SRC_ADDR高32位
    0x08RD_CTRL_LOW_DEST_ADDR低32位,Avalon-MM地址空间
    0x0CRD_CTRL_HIGH_DEST_ADDR高32位
    0x10CONTROL

    [31:25] Reserved,必须为0
    [24:18] ID,描述符ID,0-127
    [17:00] SIZE,传输大小,以DWORD单位,最大传输大小是1MB-4bytes,超过最大传输大小,按最大值传输,否则传输设置值,这个字段最大值为0x40000-0x1

    0x14~0x1CReservedN/A

     

    windows DMA编程

    分配Descriptor内存,

     1     NTSTATUS status = WdfCommonBufferCreate(engine->parentDevice->dmaEnabler, bufferSize,
     2                                             WDF_NO_OBJECT_ATTRIBUTES, &engine->descBuffer);
     3     if (!NT_SUCCESS(status)) {
     4         TraceError(DBG_INIT, "WdfCommonBufferCreate failed: %!STATUS!", status);
     5         return status;
     6     }
     7 
     8     PHYSICAL_ADDRESS descBufferLA = WdfCommonBufferGetAlignedLogicalAddress(engine->descBuffer);
     9     PUCHAR descBufferVA = (PUCHAR)WdfCommonBufferGetAlignedVirtualAddress(engine->descBuffer);
    10     RtlZeroMemory(descBufferVA, bufferSize);

     

    申请MSI/MSI-X中断,

    1     NTSTATUS status = WdfInterruptCreate(xdma->wdfDevice, &config, &attribs,
    2                                          &(xdma->channelInterrupts[index]));
    3     if (!NT_SUCCESS(status)) {
    4         TraceError(DBG_INIT, "WdfInterruptCreate failed: %!STATUS!", status);
    5     }

     

    申请DMA,这里设置了ADMA_MAX_TRANSFER_SIZE,

    1     WdfDeviceSetAlignmentRequirement(adma->wdfDevice, FILE_32_BYTE_ALIGNMENT); //add by zhuce 
    2     WDF_DMA_ENABLER_CONFIG dmaConfig;
    3     WDF_DMA_ENABLER_CONFIG_INIT(&dmaConfig, WdfDmaProfileScatterGather64Duplex, ADMA_MAX_TRANSFER_SIZE);
    4     status = WdfDmaEnablerCreate(adma->wdfDevice, &dmaConfig, WDF_NO_OBJECT_ATTRIBUTES, &adma->dmaEnabler);
    5     if (!NT_SUCCESS(status)) {
    6         TraceError(DBG_INIT, " WdfDmaEnablerCreate() failed: %!STATUS!", status);
    7         return status;
    8     }

     

    申请读/写队列,

     1     WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchSequential);
     2     config.EvtIoWrite = EvtIoWriteDma;
     3     //config.EvtIoRead = EvtIoReadDma;
     4     WDF_OBJECT_ATTRIBUTES_INIT(&attribs);
     5     attribs.SynchronizationScope = WdfSynchronizationScopeQueue;
     6     WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&attribs, QUEUE_CONTEXT);
     7     status = WdfIoQueueCreate(device, &config, &attribs, queue);
     8     if (!NT_SUCCESS(status)) {
     9         TraceError(DBG_INIT, "WdfIoQueueCreate failed %d", status);
    10         return status;
    11     }

     

    发起DMA,ADMA_EngineProgramDma作为回调函数,超过ADMA_MAX_TRANSFER_SIZE,传输会被分多次,WDF为我们做了很多工作,这些我们都是看不到的。

     1     status = WdfDmaTransactionInitializeUsingRequest(queue->engine->dmaTransaction, Request,
     2                                                      ADMA_EngineProgramDma,
     3                                                      WdfDmaDirectionReadFromDevice);
     4     if (!NT_SUCCESS(status)) {
     5         TraceError(DBG_IO, "WdfDmaTransactionInitializeUsingRequest failed: %!STATUS!",
     6                    status);
     7         goto ErrExit;
     8     }
     9     status = WdfDmaTransactionExecute(queue->engine->dmaTransaction, queue->engine);
    10     if (!NT_SUCCESS(status)) {
    11         TraceError(DBG_IO, "WdfDmaTransactionExecute failed: %!STATUS!", status);
    12         goto ErrExit;
    13     }

     

    回调函数,填入描述符表。

     1     for (ULONG i = 0; i < SgList->NumberOfElements; i++) {
     2         descriptor[i].control = XDMA_DESC_MAGIC;
     3         descriptor[i].numBytes = SgList->Elements[i].Length;
     4         ULONG hostAddrLo = SgList->Elements[i].Address.LowPart;
     5         LONG hostAddrHi = SgList->Elements[i].Address.HighPart;
     6         if (Direction == WdfDmaDirectionWriteToDevice) {
     7             // source is host memory
     8             descriptor[i].srcAddrLo = hostAddrLo;
     9             descriptor[i].srcAddrHi = hostAddrHi;
    10             descriptor[i].dstAddrLo = LIMIT_TO_32(deviceOffset);
    11             descriptor[i].dstAddrHi = LIMIT_TO_32(deviceOffset >> 32);
    12         } else {
    13             // destination is host memory
    14             descriptor[i].srcAddrLo = LIMIT_TO_32(deviceOffset);
    15             descriptor[i].srcAddrHi = LIMIT_TO_32(deviceOffset >> 32);
    16             descriptor[i].dstAddrLo = hostAddrLo;
    17             descriptor[i].dstAddrHi = hostAddrHi;
    18         }
    19     }

     

    转载于:https://www.cnblogs.com/tubujia/p/11430213.html

    展开全文
  • altera pcie fifo 测试

    2013-06-25 09:53:07
    altera pcie fifo 测试
  • 一般情况下寻址方式是按字节寻址的,PCIe的开发主要是intel Byte:8位 Word:16位 Dword:32位 qword:64位 qword aligned,表示在内存中地址以0x0,0x8,0x16,0x24开头。

    一般情况下寻址方式是按字节寻址的,PCIe的开发主要是intel

    Byte:8位

    Word:16位

    Dword:32位

    qword:64位

    qword aligned,表示在内存中地址以0x0,0x8,0x16,0x24开头。

    展开全文
  • Altera FPGA PCIE 例程仿真

    千次阅读 2018-07-31 22:56:39
    由于刚开始学PCIE接口,所以按照官方给的例程进行仿真操作。下面主要介绍下仿真的具体步骤。该例子是采用Cyclone V器件进行仿真,PCIE为gen1X4 的。Quartus II 版本号为15.0。Modelsim为ModelsimSE-64 10.4 1、拷贝...
  • 自己在使用AlteraPCIE IP核的过程中,对于中断方面的应用的一些总结,主要是从 "IP Compiler for PCI Express User Guide( ug_pci_express.pdf )"摘录出来的,方便大家的入门,希望对大家有帮助吧!
  • 1.1 Arria10 Avalon-MM DMA 接口PCIe 数据表................................................................... 5 1.2 特性....................................................................................
  • PCIe硬核实现了物理层、链路层、传输层,但是,这并不说明这是一个完整的PCIe实现方案。还需要“收发器模块”实现PHY芯片的功能,其通过PIPE接口与PCIe硬核连接,通过插槽与PCIe 背板连接。 ↑ , 每个PCIe硬核...
  • 使用Altera提供的参考设计进行仿真(C:\altera\15.0\ip\altera\altera_pcie\altera_pcie_hip_ast_ed\example_design\av)。  3. 使用Quartus II编译你的设计;  4. 下载到开发套件或者你自己的开发板中; ...
  • altera/xlinx pcie dma应用

    千次阅读 热门讨论 2019-07-29 22:19:14
    1. PCIe DMA应用屏蔽了复杂的协议,将FPGA的RAM直接映射到PC的物理地址内存中,A10 pcie DMA控制器可以例化在IP核内部,DAM的寄存器端口被接到BAR0上,pc通过对BAR0地址的读写就可以操作DMA,BAR0-BAR1都是32位,...
  • Altera Arria10 FPGA PCIe Avalon-MM DMA设计

    千次阅读 2018-06-24 20:15:34
    DMA原理框图如下,实际应用中把双口RAM换成自己的IP即可,首先使能了内部Descriptor Controller,那么BAR0默认连接到了Descriptor,若想通过PCIe BAR来访问寄存器,就必须得添加一个BAR4,其实可以不用使能内部的...
  • 基于xilinx--ML605的一个开发例程,对于刚入门PCIe的开发人员来说,不失为一个很好的参考
  • Altera EP4CGX15 start kit DEMO 驱动源码
  • 实际应用中把双口RAM换成自己的IP即可,首先使能了内部Descriptor Controller,那么BAR0默认连接到了Descriptor,若想通过PCIe BAR来访问寄存器,就必须得添加一个BAR4,其实可以不用使能内部...
  • Altera的PCI core的使用手册,用Altera的FPGA开发PCI接口时必读

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 650
精华内容 260
关键字:

alterapcie