• Axi_Lite接口的IP核与地址与缓冲与AxiGP0


            AXI Interconnect互连内核将一个或多个 AXI 内存映射主设备连接到一个或多个内存映射从设备。

            本质上设置此类缓冲是生成了一组寄存器挂在GP接口,使得能够让Arm通过amba总线去访问RAM。

    AXI_GP 接口
           

            AXI_GP 接口是直接连接主机互联和从机互联的端口的。

            AXI_HP 接口具有一个 1kB 的数据 FIFO 来做缓冲 [4],但是 AXI_GP 接口与它不同,没有额外的缓冲。因此 性能就受到主机端口和从机互联的制约,突发长度为1。

            这些接口仅用于通用的目的,而且不应该 被用于高性能的任务。

            AXI_GP 接口的特性包括 [4]:

            • 32 位数据总线宽度。

            • 12 位总线端口 ID 宽度。

            • 6 位从机端口 ID 宽度。

            • 主机和从机端口接受一次 8 个读取和 8 个写入。

            AXI_GP 接口的每个端口能支持多个外设。

    通过已经给好的例子建立函数:

    	void AXI_REG_LIST_mWriteReg(u32 BaseAddress, unsigned RegOffset, u32 Data)
    1. void Axi_Write(u8 *Data_addr_point,u32 Write_ByteLong){
    2. int i;
    3. for ( i = 0; i < Write_ByteLong; i++)
    4. {
    5. AXI_REG_LIST_mWriteReg(Axi_RamA_BaseAddr,i * 4,*(Data_addr_point + i));
    6. }
    7. }

    实验结果:
    Axi_Lite

    一个地址存储一个字节数据,

            操作的最低精度是一个字节,但AXI_GP或者说Lite支持的最低数据宽度为32位,所以一次要操作四个地址,地址的每次偏移量需要为i * 4,i为第i次操作,每次操作写入数组的第i个元素,实验中每个元素只有一个字节的长度,所以每次是将一个字节写入了四个字节长度的空间里。

    官方代码:写Axi缓冲区

    源码在生成XSA文件以后在src里寻找。

    1. /**************************** 类型定义 ****************** **********/
    2. /** * * 将值写入 AXI_REG_LIST 寄存器。执行 32 位写入。
    3. * 如果组件以较小的宽度实现,则仅写入最不重要的数据。
    4. * * @param BaseAddress 是 AXI_REG_LIST 设备的基地址。
    5. * @param RegOffset 是要写入的寄存器距基址的偏移量。
    6. * @param Data 是写入寄存器的数据。
    7. * * @返回无。
    8. * * @note
    9. * C 风格签名:
    10. * void AXI_REG_LIST_mWriteReg(u32 BaseAddress, unsigned RegOffset, u32 Data) * */
    1. /**************************** Type Definitions *****************************/
    2. /**
    3. *
    4. * Write a value to a AXI_REG_LIST register. A 32 bit write is performed.
    5. * If the component is implemented in a smaller width, only the least
    6. * significant data is written.
    7. *
    8. * @param BaseAddress is the base address of the AXI_REG_LISTdevice.
    9. * @param RegOffset is the register offset from the base to write to.
    10. * @param Data is the data written to the register.
    11. *
    12. * @return None.
    13. *
    14. * @note
    15. * C-style signature:
    16. * void AXI_REG_LIST_mWriteReg(u32 BaseAddress, unsigned RegOffset, u32 Data)
    17. *
    18. */
    19. #define AXI_REG_LIST_mWriteReg(BaseAddress, RegOffset, Data) \
    20. Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data))

    读Axi缓冲区
          

    1. /** * * 从 AXI_REG_LIST 寄存器读取值。执行 32 位读取。
    2. * 如果组件以较小的宽度实现,则仅从寄存器中读取最低有效数据。最重要的数据
    3. * 将被读取为 0。
    4. *
    5. * @param BaseAddress 是 AXI_REG_LIST 设备的基地址。
    6. * @param RegOffset 是要写入的寄存器距基址的偏移量。
    7. * * @return Data 是来自寄存器的数据。
    8. * * @note * C 风格签名:
    9. * u32 AXI_REG_LIST_mReadReg(u32 BaseAddress, unsigned RegOffset) *
    10. */
    1. /**
    2. *
    3. * Read a value from a AXI_REG_LIST register. A 32 bit read is performed.
    4. * If the component is implemented in a smaller width, only the least
    5. * significant data is read from the register. The most significant data
    6. * will be read as 0.
    7. *
    8. * @param BaseAddress is the base address of the AXI_REG_LIST device.
    9. * @param RegOffset is the register offset from the base to write to.
    10. *
    11. * @return Data is the data from the register.
    12. *
    13. * @note
    14. * C-style signature:
    15. * u32 AXI_REG_LIST_mReadReg(u32 BaseAddress, unsigned RegOffset)
    16. *
    17. */
    18. #define AXI_REG_LIST_mReadReg(BaseAddress, RegOffset) \
    19. Xil_In32((BaseAddress) + (RegOffset))

    封装: 

    1. /**
    2. *
    3. * @param BaseAddress : 写入缓冲区基地址
    4. * @param Addr_Offset : 写入缓冲区的地址偏移量(会占用多少空间)
    5. * @param data :写入缓冲区的具体数据
    6. * @return none
    7. *
    8. ***************************************************************************/
    9. void AxiLite_W_Single(u32 BaseAddress, u32 Addr_Offset, u32 data){
    10. AXILITE_REG_DEEPTH256_mWriteReg(BaseAddress, Addr_Offset << 2, data);
    11. }
    12. /**
    13. *
    14. * @param BaseAddress : 写入缓冲区基地址
    15. * @param Data_addr_point : 即将写入缓冲区的数组所在的基地址
    16. * @param Write_ByteLong :即将写入缓冲区的数组长度
    17. * @return none
    18. *
    19. ***************************************************************************/
    20. void AxiLite_W_Serial(u32 BaseAddress, u8 *Data_addr_point, u32 Write_ByteLong){
    21. int i;
    22. for ( i = 0; i < Write_ByteLong; i++)
    23. {
    24. AXILITE_REG_DEEPTH256_mWriteReg(BaseAddress,i*4 ,*(Data_addr_point + i));
    25. }
    26. }
    27. /**
    28. *
    29. * @param BaseAddress : 读出缓冲区基地址
    30. * @param Data_addr_point :存放读出数组的缓冲区基地址
    31. * @param Read_ByteLong :读出数组的长度
    32. * @return 读出数据.
    33. * * 读出指定缓冲区的指定长度的数据存入某个区域
    34. * * (Data_addr_point + i) = (u32) Read_Data_Origin;将所读出的数据赋值给指定的区域
    35. *
    36. ***************************************************************************/
    37. u32 AxiLite_R_Single(u32 BaseAddress, u32 Addr_Offset){
    38. return AXILITE_REG_DEEPTH256_mReadReg(BaseAddress, Addr_Offset <<2);
    39. }
    40. /**
    41. *
    42. * @param BaseAddress : 读出缓冲区基地址
    43. * @param Data_addr_point :存放读出数组的缓冲区基地址
    44. * @param Read_ByteLong :读出数组的长度
    45. * @return 读出数据.
    46. * * 读出指定缓冲区的指定长度的数据存入某个区域
    47. * * (Data_addr_point + i) = (u32) Read_Data_Origin;将所读出的数据赋值给指定的区域
    48. *
    49. ***************************************************************************/
    50. void AxiLite_R_Serial(u32 BaseAddress, u32 *Data_addr_point, u32 Read_ByteLong){
    51. int i;
    52. u32 Read_Data_Origin;
    53. for ( i = 0; i < Read_ByteLong; i++)
    54. {
    55. Read_Data_Origin = AXILITE_REG_DEEPTH256_mReadReg(BaseAddress, i*4);
    56. *(Data_addr_point + i) = (u32) Read_Data_Origin;
    57. }
    58. }

  • 相关阅读:
    3.7设计模式——Observer 观察者模式(行为型)
    ZED相机获取图像python
    独立站引流技巧和营销思路
    [常用工具] Python视频解码库DeFFcode使用指北
    重学JavaScript Promise API
    11.10
    浅析即时通讯开发前置 HTTP SSO 单点登陆接口的原理
    swiper3 无缝滚动 + 鼠标悬停停止/继续
    Python实现WOA智能鲸鱼优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战
    5.5-6.2读书笔记
  • 原文地址:https://blog.csdn.net/NoNoUnknow/article/details/133846819