AXI_LITE源码学习笔记

1. axi_awready信号的产生

准备接收写地址信号

  1. // Implement axi_awready generation
  2. // axi_awready is asserted for one S_AXI_ACLK clock cycle when both
  3. // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is
  4. // de-asserted when reset is low.
  5.  
  6. always @( posedge S_AXI_ACLK )
  7. begin
  8. if ( S_AXI_ARESETN == 'b0 )
  9. begin
  10. axi_awready <= 'b0;
  11. aw_en <= 'b1;
  12. end
  13. else
  14. begin
  15. if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)
    //当满足输入信号 S_AXI_AWVALID写地址有效,S_AXI_WVALID 写数据有效 都为‘1’时,axi_awready被置‘1’ ~axi_awready作为触发条件,互锁的设计
  16. begin
  17. // slave is ready to accept write address when
  18. // there is a valid write address and write data
  19. // on the write address and data bus. This design
  20. // expects no outstanding transactions.
  21. axi_awready <= 'b1;
  22. aw_en <= 'b0;
  23. end
  24. else if (S_AXI_BREADY && axi_bvalid)
    //aw_en 写地址使能置‘1’的条件:
    // S_AXI_BREADY 输入信号为‘1’,即主机准备接收写响应信号,说明上一个写操作已经完成了
    // axi_bvalid 表示写操作有效信号
  25. begin
  26. aw_en <= 'b1;
  27. axi_awready <= 'b0;
  28. end
  29. else
  30. begin
  31. axi_awready <= 'b0;
  32. end
  33. end
  34. end

2.axi_awaddr信号的锁存

  1. // Implement axi_awaddr latching
  2. // This process is used to latch the address when both
  3. // S_AXI_AWVALID and S_AXI_WVALID are valid.
  4.  
  5. always @( posedge S_AXI_ACLK )
  6. begin
  7. if ( S_AXI_ARESETN == 'b0 )
  8. begin
  9. axi_awaddr <= ;
  10. end
  11. else
  12. begin
  13. if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)
    //锁存awaddr的条件为:
    //axi_awready 写地址ready为0,表示正在接收写地址信号,
    //S_AXI_AWVALID S_AXI_WVALID 为1 表示 写地址信号和写数据信号均有效
  14. begin
  15. // Write Address latching
  16. axi_awaddr <= S_AXI_AWADDR; //锁存awaddr 写地址信号
  17. end
  18. end
  19. end

3.axi_wready信号的产生,准备接收写数据信号

  1. // Implement axi_wready generation
  2. // axi_wready is asserted for one S_AXI_ACLK clock cycle when both
  3. // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is
  4. // de-asserted when reset is low.
  5.  
  6. always @( posedge S_AXI_ACLK )
  7. begin
  8. if ( S_AXI_ARESETN == 'b0 )
  9. begin
  10. axi_wready <= 'b0;
  11. end
  12. else
  13. begin
  14. if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID && aw_en )
    // axi_wready信号产生的条件为:
    // S_AXI_WVALID S_AXI_AWVALID 为‘1’ 表示写数据有效,写地址有效
  15. begin
  16. // slave is ready to accept write data when
  17. // there is a valid write address and write data
  18. // on the write address and data bus. This design
  19. // expects no outstanding transactions.
  20. axi_wready <= 'b1; //产生 write data ready 信号
  21. end
  22. else
  23. begin
  24. axi_wready <= 'b0;
  25. end
  26. end
  27. end

4. S_AXI_WDATA信号的锁存

  1. // Implement memory mapped register select and write logic generation
  2. // The write data is accepted and written to memory mapped registers when
  3. // axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to
  4. // select byte enables of slave registers while writing.
  5. // These registers are cleared when reset (active low) is applied.
  6. // Slave register write enable is asserted when valid address and data are available
  7. // and the slave is ready to accept the write address and write data.
  8. assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;
     //锁存S_AXI_WDATA信号的条件为:
    //两个ready 两个valid
  9. //axi_wready , 输出信号, 从设备可以接受写数据
  10. //S_AXI_WVALID, 输入信号,主设备写数据有效
  11. //axi_awready, 输出信号,表示从设备可以接受写地址信号
  12. //S_AXI_AWVALID, 输入信号,表示主设备写地址有效
  13. //input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR,
  14.  
  15. always @( posedge S_AXI_ACLK )
  16. begin
  17. if ( S_AXI_ARESETN == 'b0 )
  18. begin
  19. slv_reg0 <= ;
  20. slv_reg1 <= ;
  21. slv_reg2 <= ;
  22. slv_reg3 <= ;
  23. end
  24. else begin
  25. if (slv_reg_wren) //接受写地址和写数据使能
  26. begin
  27. case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
    //数据存储在哪一个寄存器中取决于axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]中的两位,即这两位中存储的是控制信号
  28. 'h0:
  29. for ( byte_index = ; byte_index <= (C_S_AXI_DATA_WIDTH/)-; byte_index = byte_index+ )
  30. if ( S_AXI_WSTRB[byte_index] == ) begin //写选通信号
  31. // Respective byte enables are asserted as per write strobes
  32. // Slave register 0
  33. slv_reg0[(byte_index*) +: ] <= S_AXI_WDATA[(byte_index*) +: ];
  34. end
  35. 'h1:
  36. for ( byte_index = ; byte_index <= (C_S_AXI_DATA_WIDTH/)-; byte_index = byte_index+ )
  37. if ( S_AXI_WSTRB[byte_index] == ) begin
  38. // Respective byte enables are asserted as per write strobes
  39. // Slave register 1
  40. slv_reg1[(byte_index*) +: ] <= S_AXI_WDATA[(byte_index*) +: ];
  41. end
  42. 'h2:
  43. for ( byte_index = ; byte_index <= (C_S_AXI_DATA_WIDTH/)-; byte_index = byte_index+ )
  44. if ( S_AXI_WSTRB[byte_index] == ) begin
  45. // Respective byte enables are asserted as per write strobes
  46. // Slave register 2
  47. slv_reg2[(byte_index*) +: ] <= S_AXI_WDATA[(byte_index*) +: ];
  48. end
  49. 'h3:
  50. for ( byte_index = ; byte_index <= (C_S_AXI_DATA_WIDTH/)-; byte_index = byte_index+ )
  51. if ( S_AXI_WSTRB[byte_index] == ) begin
  52. // Respective byte enables are asserted as per write strobes
  53. // Slave register 3
  54. slv_reg3[(byte_index*) +: ] <= S_AXI_WDATA[(byte_index*) +: ];
  55. end
  56. default : begin
  57. slv_reg0 <= slv_reg0;
  58. slv_reg1 <= slv_reg1;
  59. slv_reg2 <= slv_reg2;
  60. slv_reg3 <= slv_reg3;
  61. end
  62. endcase
  63. end
  64. end
  65. end

5.写响应信号的产生bvalid, 表示本次写操作有效(1个时钟脉冲)

  1. // Implement write response logic generation
  2. // The write response and response valid signals are asserted by the slave
  3. // when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted.
  4. // This marks the acceptance of address and indicates the status of
  5. // write transaction.
  6.  
  7. always @( posedge S_AXI_ACLK )
  8. begin
  9. if ( S_AXI_ARESETN == 'b0 )
  10. begin
  11. axi_bvalid <= ;
  12. axi_bresp <= 'b0;
  13. end
  14. else
  15. begin
  16. if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID)
    //产生条件:
    //两个valid,两个ready, 互锁设计 ~bvalid
  17. begin
  18. // indicates a valid write response is available
  19. axi_bvalid <= 'b1;
  20. axi_bresp <= 'b0; // 'OKAY' response
  21. end // work error responses in future
  22. else
  23. begin
  24. if (S_AXI_BREADY && axi_bvalid)
    //条件:
    // S_AXI_BREADY 主机准备接收写响应信号
    // axi_bvalid 信号为‘1’
  25. //check if bready is asserted while bvalid is high)
  26. //(there is a possibility that bready is always asserted high)
  27. begin
  28. axi_bvalid <= 'b0;
  29. end
  30. end
  31. end
  32. end

6.axi_arready (准备接收读地址信号)信号的产生与S_AXI_ARADDR信号的锁存

  1. // Implement axi_arready generation
  2. // axi_arready is asserted for one S_AXI_ACLK clock cycle when
  3. // S_AXI_ARVALID is asserted. axi_awready is
  4. // de-asserted when reset (active low) is asserted.
  5. // The read address is also latched when S_AXI_ARVALID is
  6. // asserted. axi_araddr is reset to zero on reset assertion.
  7.  
  8. always @( posedge S_AXI_ACLK )
  9. begin
  10. if ( S_AXI_ARESETN == 'b0 )
  11. begin
  12. axi_arready <= 'b0;
  13. axi_araddr <= 'b0;
  14. end
  15. else
  16. begin
  17. if (~axi_arready && S_AXI_ARVALID)
    //S_AXI_ARVALID 主机给定读地址有效信号
    //~axi_arready 为互锁设计
  18. begin
  19. // indicates that the slave has acceped the valid read address
  20. axi_arready <= 'b1; //读地址操作
  21. // Read address latching
  22. axi_araddr <= S_AXI_ARADDR;
  23.  
  24. // ready 信号置位的同时,锁存读地址信号
  25. end
  26. else
  27. begin
  28. axi_arready <= 'b0;
  29. end
  30. end
  31. end

7. axi_rvalid(读数据有效)信号的产生(为1个脉冲信号)

  1. // Implement axi_arvalid generation
  2. // axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both
  3. // S_AXI_ARVALID and axi_arready are asserted. The slave registers
  4. // data are available on the axi_rdata bus at this instance. The
  5. // assertion of axi_rvalid marks the validity of read data on the
  6. // bus and axi_rresp indicates the status of read transaction.axi_rvalid
  7. // is deasserted on reset (active low). axi_rresp and axi_rdata are
  8. // cleared to zero on reset (active low).
  9. always @( posedge S_AXI_ACLK )
  10. begin
  11. if ( S_AXI_ARESETN == 'b0 )
  12. begin
  13. axi_rvalid <= ;
  14. axi_rresp <= ;
  15. end
  16. else
  17. begin
  18. if (axi_arready && S_AXI_ARVALID && ~axi_rvalid)
    //置位的条件为:
    // 读地址ready信号置‘1’
    // 读地址有效
    // ~axi_rvalid 为互锁设计
  19. begin
  20. // Valid read data is available at the read data bus
  21. axi_rvalid <= 'b1;
  22. axi_rresp <= 'b0; // 'OKAY' response
  23. end
  24. else if (axi_rvalid && S_AXI_RREADY)
    // S_AXI_RREADY 表示主机准备接收读取出来的数据
  25. begin
  26. // Read data is accepted by the master
  27. axi_rvalid <= 'b0;
  28. end
  29. end
  30. end

8.axi_rdata读出数据的驱动

  1. // Implement memory mapped register select and read logic generation
  2. // Slave register read enable is asserted when valid address is available
  3. // and the slave is ready to accept the read address.
  4. assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;
  5.  
  6. // axi_arready, 输出信号, 表示从设备可以接受读地址信号
  7. // S_AXI_ARVALID 输入信号,表示读地址信号有效
  8. // axi_rvalid 输出信号, 表示读取的数据有效
  9.  
  10. // read
  11.  
  12. always @(*)
  13. begin
  14. // Address decoding for reading registers
  15. case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
    //由给定的axi_araddr信号中的[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]中的两位来决定哪一个寄存器中的值来驱动reg_data_out
  16. 'h0 : reg_data_out <= slv_reg0;
  17. 'h1 : reg_data_out <= slv_reg1;
  18. 'h2 : reg_data_out <= slv_reg2;
  19. 'h3 : reg_data_out <= slv_reg3;
  20. default : reg_data_out <= ;
  21. endcase
  22. end
  23.  
  24. // Output register or memory read data
  25. always @( posedge S_AXI_ACLK )
  26. begin
  27. if ( S_AXI_ARESETN == 'b0 )
  28. begin
  29. axi_rdata <= ;
  30. end
  31. else
  32. begin
  33. // When there is a valid read address (S_AXI_ARVALID) with
  34. // acceptance of read address by the slave (axi_arready),
  35. // output the read dada
  36. if (slv_reg_rden)
  37. begin
  38. axi_rdata <= reg_data_out; // register read data
  39. end
  40. end
  41. end

AXI_LITE源码学习笔记的更多相关文章

  1. Underscore.js 源码学习笔记(下)

    上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...

  2. Underscore.js 源码学习笔记(上)

    版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}());  这样的东西,我们应该知道这是一个 IIFE(立即执行 ...

  3. Hadoop源码学习笔记(6)——从ls命令一路解剖

    Hadoop源码学习笔记(6) ——从ls命令一路解剖 Hadoop几个模块的程序我们大致有了点了解,现在我们得细看一下这个程序是如何处理命令的. 我们就从原头开始,然后一步步追查. 我们先选中ls命 ...

  4. Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构

    Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构 之前我们简要的看过了DataNode的main函数以及整个类的大至,现在结合前面我们研究的线程和RPC,则可以进一步 ...

  5. Hadoop源码学习笔记(4) ——Socket到RPC调用

    Hadoop源码学习笔记(4) ——Socket到RPC调用 Hadoop是一个分布式程序,分布在多台机器上运行,事必会涉及到网络编程.那这里如何让网络编程变得简单.透明的呢? 网络编程中,首先我们要 ...

  6. Hadoop源码学习笔记(3) ——初览DataNode及学习线程

    Hadoop源码学习笔记(3) ——初览DataNode及学习线程 进入了main函数,我们走出了第一步,接下来看看再怎么走: public class DataNode extends Config ...

  7. Hadoop源码学习笔记(2) ——进入main函数打印包信息

    Hadoop源码学习笔记(2) ——进入main函数打印包信息 找到了main函数,也建立了快速启动的方法,然后我们就进去看一看. 进入NameNode和DataNode的主函数后,发现形式差不多: ...

  8. Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类

    Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何 ...

  9. JDK源码学习笔记——LinkedHashMap

    HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序. LinkedHashMap保证了元素迭代的顺序.该迭代顺序可以是插入顺序或者是访问顺序.通过维护一个 ...

随机推荐

  1. Kafka实践

    1. kafka发送方法 @Component@Import(KafkaAutoProperties.class)public class KafkaProducer { @Autowired pri ...

  2. PAT 乙级 1061. 判断题(15)

    判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过100的正整数N和M,分别是学生人数和判断题数量.第二行给出M个不超过5的正 ...

  3. 【转载】 详解BN(Batch Normalization)算法

    原文地址: http://blog.csdn.net/hjimce/article/details/50866313 作者:hjimce ------------------------------- ...

  4. Putty CentOS SSH 总是自动断开连接

    /********************************************************************** * Putty CentOS SSH 总是自动断开连接 ...

  5. 创建文件夹c++

    linux #include <sys/types.h> #include <sys/stat.h> string filepath; mkdir(filepath.c_str ...

  6. 获取图像的ROI模板区域

    前言 项目需要得到视频帧图像的某一区域作为模板,首先需要确定ROI区域的坐标范围,很简单,直接上代码. % /********************************************* ...

  7. JAVA基础部分复习(四、抽象类与接口)

    抽象类与接口的定义: package cn.review.day02; /** * 抽象类 * 定义: * 1.抽象类使用关键字abstract修饰 * 2.抽象方法必须定义在抽象类中,抽象方法没有方 ...

  8. scrapy常用命令

    终端命令 创建一个项目: scrapy startproject name 利用蜘蛛名创建一个py文件: scrapy genspider name domain.name 在终端运行:scrapy ...

  9. kmp--看毛片算法

    string str; int next[N];// 核♥: next[k] 字符串前(k-1)个元素有next[k]个相等前后缀 // 初始化 next[0]=-1; next[1]=0; void ...

  10. PHP学习-类

    类属性: 在类的成员方法里面,可以用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性.静态属性则是用 ::(双冒号):se ...