查看: 3043|回复: 0

“瑞苏盈科 水星XU5 开发套件试用活动”调试记录#5

[复制链接]
  • TA的每日心情
    开心
    2021-12-29 14:09
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2022-2-17 16:03:57 | 显示全部楼层 |阅读模式
    分享到:
    在ZYNQ中有支持三种AXI总线, 拥有三种AXI接口, 当然用的都是AXI协议。 其中三
    种AXI总线分别为:
    AXI4: ( For high-performance memory-mapped requirements.) 主要面向高性能
    地址映射通信的需求, 是面向地址映射的接口, 允许最大256轮的数据突发传输;
    AXI4-Lite: ( For simple, low-throughput memory-mapped communication ) 是
    一个轻量级的地址映射单次传输接口, 占用很少的逻辑单元。
    AXI4-Stream: ( For high-speed streaming data.) 面向高速流数据传输; 去掉
    了地址项, 允许无限制的数据突发传输规模。
    在第四期报告中针对第三种AXI4-Stream数据流进行了解析处理,并在PL设置简单接口的FIFO以便于后期具体项目中的使用。
    本期通过对AXI4-Lite总线进行解析,并通过一个简单的小例子进行验证。
    首先说AXI4总线和AXI4-Lite总线具有相同的组成部分:
    ( 1) 读地址通道, 包含ARVALID, ARADDR, ARREADY信号;
    ( 2) 读数据通道, 包含RVALID, RDATA, RREADY, RRESP信号;
    ( 3) 写地址通道, 包含AWVALID, AWADDR, AWREADY信号;
    ( 4) 写数据通道, 包含WVALID, WDATA, WSTRB, WREADY信号;
    ( 5) 写应答通道, 包含BVALID, BRESP, BREADY信号;
    ( 6) 系统通道, 包含: ACLK, ARESETN信号。
    通过vivado软件可建立相应的AXI总线端口程序:
    菜单栏->Tools->Creat and Package IP
        截图.png
    如图选择最后一项建立一个新的总线接口IP。

        截图2.png
    选择总线接口形式及寄存器数量,三种总线区别已在上文中进行解释。本次选择AXI4-Lite,下一步。

    截图1.png
    选择Edit IP,vivado会打开一个新的窗口,如下图所示,可打开程序,每个信号都有官方的注释,可详细阅读,已了解总线的时序。
        截图3.png
    在此段代码中,可看见4个寄存器,该部分为PS写寄存器,通过PS端对该寄存器进行配置。
    1. assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;
    2. always @( posedge S_AXI_ACLK )
    3. begin
    4. if ( S_AXI_ARESETN == 1'b0 )
    5. begin
    6. slv_reg0 <= 0;
    7. slv_reg1 <= 0;
    8. slv_reg2 <= 0;
    9. slv_reg3 <= 0;
    10. end
    11. else begin
    12. if (slv_reg_wren)
    13. begin
    14. case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
    15. 2'h0:
    16. for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    17. if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    18. // Respective byte enables are asserted as per write strobes
    19. // Slave register 0
    20. slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    21. end
    22. 2'h1:
    23. for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    24. if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    25. // Respective byte enables are asserted as per write strobes
    26. // Slave register 1
    27. slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    28. end
    29. 2'h2:
    30. for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    31. if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    32. // Respective byte enables are asserted as per write strobes
    33. // Slave register 2
    34. slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    35. end
    36. 2'h3:
    37. for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    38. if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    39. // Respective byte enables are asserted as per write strobes
    40. // Slave register 3
    41. slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    42. end
    43. default : begin
    44. slv_reg0 <= slv_reg0;
    45. slv_reg1 <= slv_reg1;
    46. slv_reg2 <= slv_reg2;
    47. slv_reg3 <= slv_reg3;
    48. end
    49. endcase
    50. end
    51. end
    52. end
    复制代码


    在此段代码中,也可看见4个寄存器,该部分为PL写寄存器,通过PS端对该寄存器进行读取。对整体代码进行修改。将读写寄存器进行区分,并引出。
    修改完成后将.V文件复制粘贴至原工程文件中,并将其加入到Block Design中,并添加DDS模块。
    1. <span style="white-space: pre-wrap;">assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;</span>
    2. <span style="white-space: pre-wrap;">    always @(*)</span>
    3. <span style="white-space: pre-wrap;">    begin</span>
    4. <span style="white-space: pre-wrap;">          // Address decoding for reading registers</span>
    5. <span style="white-space: pre-wrap;">          case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )</span>
    6. <span style="white-space: pre-wrap;">            2'h0   : reg_data_out <= slv_reg0;</span>
    7. <span style="white-space: pre-wrap;">            2'h1   : reg_data_out <= slv_reg1;</span>
    8. <span style="white-space: pre-wrap;">            2'h2   : reg_data_out <= slv_reg2;</span>
    9. <span style="white-space: pre-wrap;">            2'h3   : reg_data_out <= slv_reg3;</span>
    10. <span style="white-space: pre-wrap;">            default : reg_data_out <= 0;</span>
    11. <span style="white-space: pre-wrap;">          endcase</span>
    12. <span style="white-space: pre-wrap;">    end</span>
    复制代码
    在此段代码中,可看见4个寄存器,该部分为PS写寄存器,通过PS端对该寄存器进行配置。
    截图4.png 截图5.png
    DDS模块参数设置如上图所示,最终将DDS模块相关接口与寄存器0相连接,将其余接口与相应信号连接,最终引出DDS的M_AXIS_DATA端口并对其进行Debug。
    并将所有PS输出配置寄存器信号进行引出,并加1赋值给PS读取寄存器。以便PS端调试使用并对其进行Debug。
    将PL端程序进行综合实现。最终导出XSA文件(本文最终将提供该文件以便大家下载测试)。
    ////////////////////*******************幼稚的分割线*****************************////////////
    PS端程序


    1. int main()
    2. {
    3.     XAxiDma_Config *CfgPtr;
    4.         int Tries = NUMBER_OF_TRANSFERS;
    5.         int Index;
    6.         u8 *TxBufferPtr;
    7.         u8 *RxBufferPtr;
    8.         u8 Value;
    9.         int Status;
    10.     UartPsHelloWorldExample(UART_DEVICE);
    11.     Status = XAxiDma_INT(DMA_DEV_ID);
    12.     Status = XGpio_Initialize(&Gpio, GPIO_EXAMPLE_DEVICE_ID);
    13.     XGpio_DiscreteWrite(&Gpio, fifo_en, 0);
    14.     XGpio_DiscreteWrite(&Gpio, fifo_en, 1);
    15.     TxBufferPtr = (u8 *)TX_BUFFER_BASE ;
    16.     RxBufferPtr = (u8 *)RX_BUFFER_BASE ;
    17.     u32 data  = 0;
    18.     u32 reg  = 0;
    19. while (1){
    20.         XUartPs_Recv(&Uart_Ps,RxBufferPtr,8);
    21.         XUartPs_Send(&Uart_Ps,TxBufferPtr,8);
    22.         sleep(1);
    23.         memcpy(®,RxBufferPtr+4,4);
    24.         memcpy(&data,RxBufferPtr,4);
    25.         switch(reg){
    26.             case 1: out_slv_reg(out_slv_reg0,data);
    27.         }

    28.     // data  = in_slv_reg(in_slv_reg0 );   //

    29. }
    30.     return XST_SUCCESS;
    31. }
    32. int UartPsHelloWorldExample(u16 DeviceId)
    33. {
    34.     int Status;
    35.     XUartPs_Config *Config;
    36.     Config = XUartPs_LookupConfig(DeviceId);
    37.     Status = XUartPs_CfgInitialize(&Uart_Ps, Config, Config->BaseAddress);
    38.     XUartPs_SetBaudRate(&Uart_Ps, 115200);
    39. }
    复制代码


    PS端调用串口,通过对串口数据进行读取并将其值进行处理创送至寄存器0,(预留寄存器读取程序供测试)供PS配置PL端DDS。完成不同频率正弦波的输出。PS端程序通过case可对不同寄存器进行配置。通过串口对寄存器进行配置,可通过debug观察DDS输出信号频率会发生变化。
    但由于串口数据大小端装换问题,本文并未对其进行处理,在串口配置时应注意。

    游客,如果您要查看本帖隐藏内容请回复


    desk.zip (1.72 MB, 下载次数: 1, 售价: 1 与非币)
    回复

    举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 1/2 下一条

    【预约|参会享"豪"礼】2025慕尼黑上海设备展
    “2025慕尼黑上海电子生产设备展”将于2025年03月26-28日上海新国际博览中心开幕诚邀您的光临!

    查看 »

    手机版|小黑屋|与非网

    GMT+8, 2025-3-4 02:35 , Processed in 0.114083 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.