PS的流水灯设计分析

Posted on 2020-06-15 21:13  绿叶落秋风  阅读(481)  评论(0编辑  收藏  举报

PS的流水灯设计分析

1、实验原理

PS设计流水灯就是采用ARM的硬核实现流水灯设计。ARM内核采用的就是一个可以执行软件程序的平台。这里采用C语言设计。基于前面构建的GPIO外设的硬件平台,这里实现基本的流水的操作。

2、实验操作

(1)软件部分

这里采用简单的C代码实验,就使用delay和XGpio_WriteReg两个函数来实现。

#include"xgpio_l.h"
#include<stdio.h>
#include"xparameters.h"

#define LED_DATA XPAR_GPIO_0_BASEADDR

void delay(){
    int i,j;
    for(i=1;i<1000;i++)
        for(j=1;j<10000;j++);
}
int main(){
    while(1){
    XGpio_WriteReg(LED_DATA,0x00,0x01);
    delay();
    XGpio_WriteReg(LED_DATA,0x00,0x02);
    delay();
    XGpio_WriteReg(LED_DATA,0x00,0x04);
    delay();
    XGpio_WriteReg(LED_DATA,0x00,0x08);
    delay();
    }
    return 0;
}

可以看到这个寄存器写函数是专用的,如果是自制的AXI4的IP,xilinx有更加普适的函数。这个在后面的学习会接触到。这里可以看一下这个函数。在前一篇博文中已经提到了如何调用这个函数及查看其性质。如果只是想掌握到可以调试硬件的水平,能够使用这些函数就足够了。

(2)硬件部分

官方的IP核一般比较复杂,一项一项的分析是不可能的。这里大致地从接口看一下AXI4在GPIO设计中使用的基本结构。

 

PORT MAP (
      s_axi_aclk => s_axi_aclk,
      s_axi_aresetn => s_axi_aresetn,
      s_axi_awaddr => s_axi_awaddr,
      s_axi_awvalid => s_axi_awvalid,
      s_axi_awready => s_axi_awready,
      s_axi_wdata => s_axi_wdata,
      s_axi_wstrb => s_axi_wstrb,
      s_axi_wvalid => s_axi_wvalid,
      s_axi_wready => s_axi_wready,
      s_axi_bresp => s_axi_bresp,
      s_axi_bvalid => s_axi_bvalid,
      s_axi_bready => s_axi_bready,
      s_axi_araddr => s_axi_araddr,
      s_axi_arvalid => s_axi_arvalid,
      s_axi_arready => s_axi_arready,
      s_axi_rdata => s_axi_rdata,
      s_axi_rresp => s_axi_rresp,
      s_axi_rvalid => s_axi_rvalid,
      s_axi_rready => s_axi_rready,
      gpio_io_i => STD_LOGIC_VECTOR(TO_UNSIGNED(0, 4)),
      gpio_io_o => gpio_io_o,
      gpio2_io_i => STD_LOGIC_VECTOR(TO_UNSIGNED(0, 32))
    );

这里的调用使用的VHDL语言,所以看起来不大熟悉。从端口列表中可以看到valid、ready这两个握手信号。通道的话目前还不是特别明显。这里可以初步地认识一个AXI4协议所需的信号。在后面的学习中,会有基于vivado的AXI4的IP核设计。这里暂时不深入研究如何写仲裁和其他模块。

3、结果反思

这里主要加深对AXI4工作模式的映象,了解AXI4的地址工作的原理以及如何基于软件工具在硬核上调试。下一步则是自主设计可用的AXI4的IP核。最终的目标是可以自己构建AXI4从机的通信逻辑。包括握手、通道仲裁和其他配套的功能,实现FPGA和ARM的设计连接。

这里给一下上次实验的结果: