精华内容
下载资源
问答
  • dma设计
    千次阅读
    2018-05-12 10:48:49

           高性能DMA并没有一种统一的设计方法,根据不同的应用场景,大体上可以分为2种:用于传递报文的多通道DMA和用于块数据传输及运算。他们的主要区别其实是buffer descriptor的差别。

           首先是用于传递报文的DMA。这种设计的典型代表是intel网卡的DMA实现方式,他的实现机制一般是这样:每个通道一般分为收和发两个方向独立的队列。队列中的报文描述符一般包含以下信息:报文在CPU的主内存中的地址,长度信息,报文在FPGA上需要做的处理动作、处理结果状态等。由于报文的特点是数量巨大,而每个报文都不大,一般是在2K以下(更大的报文可以用多个buffer链在一起的方式实现),因此每个描述符描述对应的buffer一般是2K左右。

            第2种就是用于计算加速协处理的块传输DMA,这个典型芯片有mellanox的网卡芯片。一般也是通过多个队列进行设计,队列中的描述符一般包含几个信息:取数据的位置、长度,回写数据的地址;需要加速处理的action动作编码、及计算携带的参数;处理结束后状态回写等。当需要计算大量的小块数据时,可以在一个描述符中携带多个数据块信息以提升性能。

            这些描述符设计完成后,如何利用CPU多核的性能呢?一种方法是设计一种通道绑定机制,把不同通道绑定到不同的核中。当然也可以用散列的方式把单通道数据散列到多个核上。另外队列深度的设计也会影响到性能和延迟,要在这两个中间找到平衡。有没有进一步提升的办法呢?其实软件上也可以做些优化,在初始化时固定分配一些内存,这样就不必每次向系统申请内存。

            硬件上如何支持虚拟化,一个就是DMA的通道间要做隔离,当一个通道创建或者拆除时要做好内部信息隔离,避免通道间互相影响。第2个就是支持逻辑地址,一般可以选用那些支持IOMMU的CPU。

            另外一个经常会被忽略的设计是PCIE接口适配器的设计,这个性能差距很大,比如Tagid取多大、是否要进行不同传输类型帧的流控设计、是否要做乱序重排等等。。。

            DMA的设计包含东西挺多,他是软硬件融合进行高性能设计的一个关键部分,但可惜的是相当多的公司都不太愿意在上面做长期积累,其实我们的很多企业更愿意做各种集成,而不愿意做某个领域的工匠。

     

     

     

     




    更多相关内容
  • DMA设计

    千次阅读 2019-01-05 17:33:00
    目录 DMA设计 DMA框架 手册请看英文手册 芯片特性 请求来源 协议简述 基本时序 模式 协议 数据大小的描述 具体完整的实例时序 代码设计 ...

    title: DMA设计
    tags: linux
    date: 2019年1月5日 17:27:08
    toc: true
    ---

    DMA设计

    DMA框架

    一个简单的DMA框图如下DREQ→HOLD→HLDA→DACK

    mark

    DMAC的一些必备特性:

    • 能发出地址信息,对存储器寻址,并修改地址指针,DMAC内部必须有能自动加1或减1的地址寄存
    • 能决定传送的字节数,并能判断DMA传送是否结束。DMA内部必须有能自动减1的字计数寄存器,计数结束产生终止计数信号;
    • 能发出DMA结束信号,释放总线,使CPU恢复总线控制权;
    • 能发出读、写控制信号,包括存储器访问信号和I/O访问信号。DMAC内部必须有时序和读写控制逻辑。

    信号线如下

    • DRQ:DMA请求信号。是外设向DMA控制器提出要求DMA操作的申请信号。
    • DACK:DMA响应信号。是DMA控制器向提出DMA请求的外设表示已收到请求和正进行处理的信号。
    • HOLD:总线请求信号。是DMA控制器向CPU要求让出总线的请求信号。
    • HLDA:总线响应信号,是CPU向DMA控制器表示允许总线请求的应答信号。

    流程顺序

    1. 当外设有DMA需求,并且准备就绪,就向DMAC控制器发出DMA请求信号DREQ
    2. DMAC接到DMA请求信号后向CPU发出总线请求信号HRQ。该信号连接到CPU的HOLD信号。
    3. CPU接到总线请求信号以后,如果允许DMA传输,则会在当前总线周期结束后,发出DMA响应信号HLDA。一方面CPU将控制总线、数据总线和地址总线置高阻态,即放弃对总线的控制权;另一方面CPU将有效的HLDA信号送给DMAC,通知DMAC,CPU已经放弃了对总线的控制权。
    4. DMAC获得对总线的控制权,并且向外设送出DMAC的应答信号DACK,通知外设可以开始进行DMA传输了。
    5. DMAC向存储器发送地址信号和向存储器及外设发出读/写控制信号,控制数据按初始化设定的方向传送,实现外设与内存的数据传输。
    6. 数据全部传输结束后,DMAC向CPU发HOLD信号,要求撤销总线请求信号。CPU收到该信号以后,使HLDA无效,同时收回对总线的控制权。

    DMA控制器的基本组成

    • 内存地址计数器:用于存放内存中要交换的数据的地址。
    • 字计数器:用于记录传送数据块的长度(多少字数)。
    • 数据缓冲寄存器:用于暂存每次传送的数据(一个字)。
    • "DMA请求"标志:每当设备准备好一个数据字后给出一个控制信号,使"DMA请求"标志置"1"。该标志置位后向"控制/状态"逻辑发出DMA请求,后者又向CPU发出总线使用权的请求(HOLD),CPU响应此请求后发回响应信号HLDA,"控制/状态"逻辑接收此信号后发出DMA响应信号,使"DMA 请求"标志复位,为交换下一个字做好准备。
    • "控制/状态"逻辑:由控制和时序电路以及状态标志等组成,用于修改内存地址计数器和字计数器,指定传送类型(输入或输出),并对"DMA请求"信号和CPU响应信号进行协调和同步。
    • 中断机构:当字计数器溢出时,意味着一组数据交换完毕,由溢出信号触发中断机构,向CPU提出中断报告。

    手册请看英文手册

    芯片特性

    请求来源

    • 软件触发

    • 外设触发

    • 外部引脚触发,这个是STM32所没有的,这个是有具体的时序的,STM32应该是可以用中断引脚触发

      mark

    2440通道传输类型

    • 源和目标都在系统总线上(比如:两个物理内存地址)
    • 目标在外设总线上时,源在系统总线上(外设指:串口,定时器,I2C,I2S等)
    • 目标在系统总线上时,源在外设总线上
    • 源和目标都在外设总线上----------这个ST的也没有

    外部引脚的DMA协议

    这个貌似有点复杂,暂时也没用过,暂时不做深入分析了

    协议简述

    2440里面的DMA传输分为两个层次,一个是REQ/ACK协议,还一个是单模式和全模式,所谓单模式个全模式是指的在一次DMA请求中的传输数量

    mark

    基本时序

    mark

    时序参数

    • 信号的有效性: 高电平无效,低电平有效,这里称为assert

    • REQ有效

      REQ的只能在ACK释放(high)的时候才能被asserted(high),也就是说 请求信号只能在ACK为高的时候才能被MCU的DMA识别到

    • 信号生效识别

      nXDREQ请求生效并经过2CLK周期同步后,nXDACK响应并开始生效,但至少还要经过3CLK的周期延迟,DMA控制器才可获得总线的控制权,并开始数据传输。

    模式

    • Single service : 当没有原子传输(unit/burst)后,停止传输,等待下一次请求

    • Whole service : 重复原子传输,直到计数器到0.这个模式下,不需要另外的请求.这个是重点
      在全模式下,DMA也会在每个原子传输后释放总线然后去尝试获得总线,以防止总线被占据

    也就是说,全模式是我们一般使用的模式,使用计数器,一次请求会传输所有数据.单模式一次传输一个原子操作.

    ACK清零:

    • 单服务是完成一个原子操作
    • 全服务是完成所有传输

    中断发生:

    • 都在计数器为0的时候

    协议

    这里的协议,指的是请求应答协议,分为两种.

    • Demand Mode 请求/查询模式

      如果REQ信号有效,则一直保持传输,这个时候的ACK只是告诉你这一次传输完成

      这个模式会霸占总线的,不像全服务中完成一个原子操作释放一下总线

    • Handshake Mode 握手模式

      如果REQ信号释放,这个时候DMA控制器释放ACK两个周期,否则DMA会一直等到REQ的释放

      也就是启动下一次传输前,需要请求端先释放,然后MCU完成后会无效ACK两个周期告诉请求端,请求端再来请求,否则一直等待

    在Demond模式下,如果DMA完成一次请求后如果Request仍然有效,那么DMA就认为这是下一次DMA请求,并立即开始下一次的传输;

    在Handshake模式下,DMA完成一次请求后等待Request信号无效,如果Request无效,DMA会无效ACK两个时钟周期,再等待下一次Request。

    mark

    数据大小的描述

    数据传输的大小=数据传输次数 * 每次传输的读写次数 * 一次读或者写的大小

    • 每次传输的读写次数可以是1个或者4个 unit/burst
    • 一次读或者写的大小可以是1字节,2字节,4字节

    mark

    具体完整的实例时序

    单服务查询请求模式

    mark

    单服务握手模式

    mark

    全服务握手模式

    在这里其实无所谓hand了,因为在全模式下只需要一次请求就能完成后续的所有操作

    mark

    代码设计

    这里的代码就是驱动实现一个内存的拷贝,不涉及到上面长篇大论的时序分析,只是需要设置好相关的寄存器配置配置DMA的模式,然后启动DMA后进入休眠,完成后DMA中断唤醒后退出.

    测试程序调用字符驱动程序的接口ioctl来测试即可

    写程序前需要查看用到的DMA

    cat /proc/interrupts

    驱动程序

    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/fs.h>
    #include <linux/init.h>
    #include <linux/delay.h>
    #include <linux/irq.h>   
    #include <asm/irq.h>
    #include <asm/arch/regs-gpio.h>
    #include <asm/hardware.h>
    #include <asm/uaccess.h>
    #include <asm/io.h>
    #include <linux/dma-mapping.h>
    
    #define  S3C_DMA_SIZE   512*1024          //DMA传输长度   512KB
    
    #define NORMAL_COPY     0                 //两个地址之间的正常拷贝
    #define DMA_COPY        1                 //两个地址之间的DMA拷贝
    
    /*函数声明*/
    static DECLARE_WAIT_QUEUE_HEAD(s3c_dma_queue);          //声明等待队列
    static int s3c_dma_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long flags);
    
      /*
       * 定义中断事件标志
       * 0:进入等待队列        1:退出等待队列
       */
         static int s3c_dma_even=0;
    
    
    static unsigned char   *source_virt;            //源虚拟地址
    static unsigned int     source_phys;            //源物理地址
    
    static unsigned char *dest_virt;              //目的虚拟地址
    static unsigned int   dest_phys;              //目的虚拟地址
    
    
    /*DMA3寄存器*/
    struct  S3c_dma3_regs{
        unsigned int disrc3    ;          //0x4b0000c0
        unsigned int disrcc3   ;                    
        unsigned int didst3    ;                    
        unsigned int didstc3   ;               
        unsigned int dcon3     ;                
        unsigned int dstat3    ; 
        unsigned int dcsrc3    ; 
        unsigned int dcdst3    ;        
        unsigned int dmasktrig3;        //0x4b0000e0
    };
    
    
     static volatile struct S3c_dma3_regs   *s3c_dma3_regs;
    
    /*字符设备操作*/
    static struct file_operations  s3c_dma_fops={
            .owner  = THIS_MODULE,
            .ioctl     = s3c_dma_ioctl,
    };
    
    /*中断服务函数*/
    static irqreturn_t  s3c_dma_irq (int irq, void *dev_id)   
    {
        s3c_dma_even=1;                             //退出等待队列
        wake_up_interruptible(&s3c_dma_queue);      //唤醒 中断
        return IRQ_HANDLED;
    }
    
    /*ioctl函数*/
    static int s3c_dma_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long flags)
    {
        int i;
        memset(source_virt, 0xAA, S3C_DMA_SIZE);          
        memset(dest_virt, 0x55, S3C_DMA_SIZE);   
        
        switch(cmd)
        {
        case NORMAL_COPY:                           //正常拷贝
                
                 for(i=0;i<S3C_DMA_SIZE;i++)
                     dest_virt[i] =  source_virt[i];
    
                 if(memcmp(dest_virt, source_virt, S3C_DMA_SIZE)==0)
               {
             printk("NORMAL_COPY OK\n");
                    return 0;
             }
             else
            {
             printk("NORMAL_COPY ERROR\n");
                   return -EAGAIN;
            }             
                
        case DMA_COPY:                               //DMA拷贝
    
            s3c_dma_even=0;     //进入等待队列
            
            /*设置DMA寄存器,启动一次DMA传输 */
            /* 源的物理地址 */
            s3c_dma3_regs->disrc3      = source_phys;      
            /* 源位于AHB总线, 源地址递增 */  
            s3c_dma3_regs->disrcc3     = (0<<1) | (0<<0);
            /* 目的的物理地址 */
            s3c_dma3_regs->didst3      = dest_phys;      
            /* 目的位于AHB总线, 目的地址递增 */
            s3c_dma3_regs->didstc3     = (0<<2) | (0<<1) | (0<<0);     
            /* 使能中断,单个传输,软件触发, */
            s3c_dma3_regs->dcon3=(1<<30)|(1<<29)|(0<<28)|(1<<27)|(0<<23)|(0<<20)|(S3C_DMA_SIZE<<0);  
            //启动一次DMA传输
            s3c_dma3_regs->dmasktrig3  = (1<<1) | (1<<0);     
            
            wait_event_interruptible(s3c_dma_queue, s3c_dma_even);    //进入睡眠,等待DMA传输中断到来才退出
            
            if(memcmp(dest_virt, source_virt, S3C_DMA_SIZE)==0)
            {
             printk("DMA_COPY OK\n");
                    return 0;
             }
            else
            {
           printk("DMA_COPY ERROR\n");
                 return -EAGAIN;
               }  
    
                break;
        }
        return 0;
    }
    
    
    static unsigned int major;
    static struct class *cls;
    static int s3c_dma_init(void)
    {
        /*1.1 注册DMA3 中断  */
        if(request_irq(IRQ_DMA3, s3c_dma_irq,NULL, "s3c_dma",1)) 
        {
            printk("Can't    request_irq   \"IRQ_DMA3\"!!!\n ");
            return -EBUSY;
        }
        
        /*1.2 分配两个DMA缓冲区(源、目的)*/
        source_virt=dma_alloc_writecombine(NULL,S3C_DMA_SIZE, &source_phys, GFP_KERNEL);
        if(source_virt==NULL)       
       {
            printk("Can't  dma_alloc   \n ");
            return -ENOMEM;
       }
        
        dest_virt=dma_alloc_writecombine(NULL,S3C_DMA_SIZE, &dest_phys, GFP_KERNEL);
        if(dest_virt==NULL)       
       {
            printk("Can't  dma_alloc   \n ");
            return -ENOMEM;
       }
        
        
        /*2.注册字符设备,并提供文件操作集合fops*/
        major=register_chrdev(0, "s3c_dma",&s3c_dma_fops);
        cls= class_create(THIS_MODULE, "s3c_dma");
        class_device_create(cls, NULL,MKDEV(major,0), NULL, "s3c_dma");
    
        s3c_dma3_regs=ioremap(0x4b0000c0, sizeof(struct S3c_dma3_regs));
        
        return 0;  
    }
    
    static void s3c_dma_exit(void)
    {
        iounmap(s3c_dma3_regs);
        
        class_device_destroy(cls, MKDEV(major,0));
        class_destroy(cls);
    
        dma_free_writecombine(NULL, S3C_DMA_SIZE, dest_virt, dest_phys);
        dma_free_writecombine(NULL, S3C_DMA_SIZE, source_virt, source_phys);   
    
        free_irq(IRQ_DMA3, 1);
    
    }
    module_init(s3c_dma_init);
    module_exit(s3c_dma_exit);
    MODULE_LICENSE("GPL");

    测试程序

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <string.h>
    
    /* ./dma_test NORMAL
     * ./dma_test DMA
     */
    #define NORMAL_COPY     0               //两个地址之间的正常拷贝
    #define DMA_COPY        1              //两个地址之间的DMA拷贝
    
    void print_usage(char *name)
    {
        printf("Usage:\n");
        printf("%s <NORMAL | DMA>\n", name);
    }
    
    int main(int argc, char **argv)
    {
        int fd,i=30;
        
         if (argc != 2)
        {
            print_usage(argv[0]);
            return -1;
        }
    
        fd = open("/dev/s3c_dma", O_RDWR);
        if (fd < 0)
        {
            printf("can't open /dev/s3c_dma\n");
            return -1;
        }
    
        if (strcmp(argv[1], "NORMAL") == 0)
        {
            while (i--)                //调用驱动的ioctl(),30次
            {
                ioctl(fd, NORMAL_COPY);
            }
        }
        else if (strcmp(argv[1], "DMA") == 0)
        {
            while (i--)                //调用驱动的ioctl(),30次        
            {
                ioctl(fd, DMA_COPY);
            }
        }
        else
        {
            print_usage(argv[0]);
            return -1;
        }
        return 0;     
    }

    测试

    1. ./dma_test NORMAL &卡住
    2. ./dma_test DMA &,输入命令有反应

    参考链接

    csdn DMA框架

    cnblog DMA请求应答协议

    cnblog 笔记

    转载于:https://www.cnblogs.com/zongzi10010/p/10225384.html

    展开全文
  • UART数据传输主要通过中断或DMA的方式实现。  中断方式是在接收到数据或需要发送数据时产生中断,在中断服务程序中读写UART的缓冲区(FIFO)实现数据传输。由于串口通信速率一般比较低(典型值不超过115 200 bps),...
  • 状态跳转图通道优先级译码表设计讲解RTL代码testbench波形 状态跳转图 通道优先级译码表 当处于不同状态时,不同通道的request有不同的优先级编码,00最高,11最低。 设计讲解 当有多个外设同时发起req请求,DMA的...

    状态跳转图

    在这里插入图片描述

    通道优先级译码表

    当处于不同状态时,不同通道的request有不同的优先级编码,00最高,11最低。
    在这里插入图片描述

    设计讲解

    当有多个外设同时发起req请求,DMA的仲裁器将按照其规定的优先级顺序,处理DMA请求。

    展开全文
  • 可以借鉴用于设计pcie,希望对大家有帮助
  • 随着上层应用软件的日趋多样化,现在的便携式电子产品对嵌入式芯片的功能需求越来越高,单一或仅可以局部定制的传统芯片已经不能满足需要。因此数字系统和模拟系统都可以根据需要灵活定制成为芯片设计、开发的发
  • FPGA实现PCIe总线DMA设计.pdf
  • 因此数字系统和模拟系统都可以根据需要灵活定制成为芯片设计、开发的发展方向。Cypress为满足业界需要继PSoC1之后开发了PSoC3和PSoC5全新可编程模拟和数字嵌入式芯片。其中PSoC3使用基于单循环流水线的高性能8051...
  • 基于FPGA的PXIe总线DMA设计与实现.pdf
  • 随着上层应用软件的日趋多样化,现在的便携式电子产品对嵌入式芯片的功能需求...本文重点讲述了PSoC3在多通讯接口设计中的应用,以及如何使用多DMA技术提高通讯的速度和效率。 此内容为AET网站原创,未经授权禁止转载。
  • 基于xilinx—pcie-core的DMA设计,是设计文档,源码索取可以邮件联系,chauncey_wu@163.com
  • 这是xilinx给出来的基于pcie总线的DMA参考设计,有涉及到pcie或者DMA项目的朋友可以参考一下
  • 文中提出了一种功能较为完备的通用多通道 DMA 控制器的设计方法,给出了系统仿真和测试结果.该控制器具有8 通道,支持优先级和轮转相结合的仲裁机制,利用地址掩码和指针实现 FIFO 型环形缓冲.采用流水线结构设计...
  • 介绍了一种基于PCIE总线主模式DMA高速数据传输系统的设计。该系统利用Xilinx公司V5系列的FPGA芯片搭建了x1通道的PCIE系统。实验利用自行开发的PCIE接口板实现了单字读写及DMA读写的传输方式,并在上位机软件界面上及...
  • 基于Xilinx PCIe Core的DMA设计,很好的参考资料。
  • 本文讲述以包含单个AHB master接口的DMA控制器为基础的SoC系统架构蓝本,分析存在的不足之处,并引入一种以新型DMA控制器为基础的SoC系统架构的设计,解决提出的问题。  1 对异步事件响应速度  系统实时性是指能...
  • 摘要:在分析传统DMA控制器结构的基础上,针对实时图象处理系统的数据传输要求,提出了多端口模块设计、增加RoundRobin通道优先级仲裁算法和优化数据传输通道等优化方法,以提高数据传输速度,并改进了地址产生模式...
  • Altera Cyclone 4 GX FPGA PCIe SGDMA设计

    千次阅读 2018-10-07 14:37:17
    参考 PCI Express in Qsys Example Designs https://fpgawiki.intel.com/wiki/Modular_SGDMA ...设计 Cyclone IV GX不像Arria10的pcie-avmm带自带SGDMA,只能用altera提供的Modular SGDMA,这个模块还是以ver...

    作者

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

    参考

    PCI Express in Qsys Example Designs
    https://fpgawiki.intel.com/wiki/Modular_SGDMA
    Modular SGDMA Video Frame Buffer

    设计

    Cyclone IV GX不像Arria10的pcie-avmm带自带SGDMA,只能用altera提供的Modular SGDMA,这个模块还是以verilog源代码形式提供,其实是个学习verilog的好例子,整体架构如下,很清晰了,Modular SGDMA控制数据在DDR和PC直接互相传输。
    在这里插入图片描述
    再看Modular SGDMA内部实现,将数据从一个MM端口,搬运到另一个MM端口,数据流单向流动,怎么搬运由Descriptors和CSR端口来控制,这两个端口为寄存器,可通过PCIe BAR来访问。
    在这里插入图片描述
    Modular SGDMA的Dispatcher实现如下,
    在这里插入图片描述

    PCI Express-to-Avalon-MM地址翻译

    这里就是Bar的地址翻译,
    在这里插入图片描述
    看下IP配置,这里的偏移都是0,altera设置死了,无法更改,手册说的是Hard-code,硬编码的。
    在这里插入图片描述

    Avalon-MM-to-PCI Express地址翻译

    For example, if the core is configured with an address translation table with the
    following attributes:
    ■ Number of Address Pages—16
    ■ Size of Address Pages—1 MByte
    ■ PCI Express Address Size—64 bits
    then the values in Figure 4–12 are:
    ■ N = 20 (due to the 1 MByte page size)
    ■ Q = 16 (number of pages)
    ■ M = 24 (20 + 4 bit page selection)
    ■ P = 64
    In this case, the Avalon address is interpreted as follows:
    ■ Bits [31:24] select the TX slave module port from among other slaves connected to
    the same master by the system interconnect fabric. The decode is based on the base
    addresses assigned in Qsys.
    ■ Bits [23:20] select the address translation table entry.
    ■ Bits [63:20] of the address translation table entry become PCI Express address bits
    [63:20].
    ■ Bits [19:0] are passed through and become PCI Express address bits [19:0].
    看下IP核配置,首先选择翻译表项,最大支持512个,每个表项的长度也可设置。注意,翻译表的位置在CRA的0x1000处。截图来自quartus14.1。
    在这里插入图片描述

    产生PCI Express中断

    RX模块有16个Avalon-MM中断输入(RXmirq_irq[n:0],n ≤ 15),设置这16个信号或者设置对应PCIe邮箱寄存器,会在中断寄存器相应位置1,中断使能寄存器在0x50处,中断状态寄存器在0x40处,中断发生后,软件必须清除相应的中断状态寄存器位。IP支持传统中断和MSI中断,
    The PCI Express Avalon-MM bridge selects either MSI or legacy interrupts automatically based on the standard interrupt controls in the PCI Express configuration space registers. The Interrupt Disable bit, which is bit 10 of the
    Command register (at configuration space offset 0x4) can be used to disable legacy interrupts. The MSI Enable bit, which is bit 0 of the MSI Control Status register in the MSI capability register (bit 16 at configuration space offset 0x50), can be used to enable MSI interrupts.
    Only one type of interrupt can be enabled at a time. However, to change the selection of MSI or legacy interrupts during operation, software must ensure that no interrupt request is dropped. Therefore, software must first enable the new selection and then disable the old selection. To set up legacy interrupts, software must first clear the Interrupt Disable bit and then clear the MSI enable bit. To set up MSI interrupts, software must first set the MSI enable bit and then set the Interrupt Disable bit.
    看下Qsys中配置,有一个Auto-enable PCIe interrupt的配置,需要测试一下。
    在这里插入图片描述
    看下手册关于邮箱寄存器的描述,写和读在不同的位置,应该是为了避免信号冲突。
    在这里插入图片描述
    中断处理函数中必须清除中断状态寄存器和SGDMA的中断状态寄存器

    产生Avalon-MM中断

    Generation of Avalon-MM interrupts requires the instantiation of the CRA slave module where the interrupt registers and control logic are implemented. The CRA slave port has an Avalon-MM Interrupt (CraIrq_irq in Qsys systems) output signal. A write access to an Avalon-MM mailbox register sets one of the P2A_MAILBOX_INTn bits in the “PCI Express to Avalon-MM Interrupt Status Register Address: 0x3060” on page 6–11 and asserts the CraIrq_o or CraIrq_irq output, if enabled. Software can enable the interrupt by writing to the “PCI Express to Avalon-MM Interrupt Enable Register Address: 0x3070” on page 6–11 through the CRA slave. After servicing the interrupt, software must clear the appropriate serviced interrupt status bit in the PCI-Express-to-Avalon-MM Interrupt Status register and ensure that there is no other interrupt pending.

    展开全文
  • DMA方式A/D采样控制电路设计,输出数据
  • DMA的verilog硬件实现,此版本为东南大学2005年版本。目测可用。 网上有很多该版本,但是不全,此次为收集齐全的版本方便大家学习研究。(没有找到文档说明,代码注释较详细)
  • STM32f103的数电采集电路的DMA设计和使用优化程序http://blog.csdn.net/DevinTT/article/details/46998173 DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也...
  • 为嵌入式链式DMA设计了主从复合接口,使其具有控制总线、发起总线传输的功能;使用65 nm CMOS工艺标准单元库对嵌入式链式DMA模块进行了ASIC实现;搭建了仿真验证平台。实验结果表明,嵌入式链式DMA可以明显提升密码...
  • 在双核移动终端中进行验证,两芯片通过串口进行芯片间通信,实验结果证明了设计的高速串口驱动具有较好的可靠性和可行性。
  • 在嵌入式实时操作系统中,经常需要实时读写硬盘数据,为了提高VxWorks5.5系统下IDE电子盘读写速度,提出了一种基于ICH7-M南桥芯片的DMA模式驱动软件的设计方法。该方法采用风河公司提供的磁盘驱动程序框架,设计了新...
  • Altera Arria10 FPGA PCIe Avalon-MM DMA设计

    千次阅读 2018-06-24 20:15:34
    FPGA设计 DMA原理框图如下,实际应用中把双口RAM换成自己的IP即可,首先使能了内部Descriptor Controller,那么BAR0默认连接到了Descriptor,若想通过PCIe BAR来访问寄存器,就必须得添加一个BAR4,其实可以不用...
  • 针对数字图像处理过程中的大量数据传输需求,设计了基于FPGA的DMA数据传输系统。上位机基于WinDriver驱动开发工具开发了DMA传输控制程序,下位机基于Xilinx PCIe IP硬核设计DMA控制逻辑,实现了上位机控制命令发送...
  • 基于蜂鸟E203riscv系统的DMA外设代码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,844
精华内容 14,337
关键字:

dma设计