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的设计连接。
这里给一下上次实验的结果:
======== ======\\ ======= -
|| || \\ // \\ /-\
|| || || // // \\
|| || // || // \\
====== ======= || === ========
|| || || \\ // \\
|| || \\ || // \\
|| || \\ // // \\
|| || ======= // \\
作者:绿叶落秋风,专注FPGA技术分析和分享,转载请注明原文链接:https://www.cnblogs.com/electricdream/p/13137715.html,文中资源链接如下:
1. GITHUB开源仓库