软件版本:VIVADO2017.4 操作系统:WIN10 硬件平台: ARTIX-7 系列开发板 米联客(MSXBO)论坛www.osrc.cn答疑解惑专栏开通,欢迎大家给我提供!!! 3.1概述 上一章我们介绍了MicroBlaze控制GPIO完成LED流水操作,GPIO是官方自带的IP,那么如果用户想将自己写的HDL文件用于MicroBlaze中,那该如何操作呢?本章就将为大家介绍在VIVADO中如何封装用户IP的方法。 3.2创建IP Step1:打开VIVADO软件,新建一个工程。 Step2:单击Add Source,选择Add or Creat design Sources,然后单击Next。
Step3:单击Create File,输入文件名,单击OK。
Step4:单击Finish,完成Verilog文件的创建。
Step5:将以下代码复制入文本编辑区内。 module LED_ML( input CLK_i,//100MHZ input RSTn_i, output reg [3:0]LED_o ); reg [31:0]C0; always @(posedge CLK_i) if(!RSTn_i) begin LED_o <= 4'b0001; C0 <= 32'h0; end else begin if(C0 == 32'd49_999_999)//1s begin C0 <= 32'h0; if(LED_o == 4'b1000) LED_o <= 4'b0001; else LED_o <= LED_o << 1; end else begin C0 <= C0 + 1'b1; LED_o <= LED_o; end end endmodule |
Step6:单击Tools—>Create and package IP,单击Next。
Step7:选择IP的保存路径,单击Next。
Step8:单击Finish。 Step9:在新弹出来的编辑IP工程中,直接选择Review and Package,然后单击Package IP。
3.3硬件工程搭建 IP封装完成之后,接下来教大家如何调用我们刚才封装好的这个IP。 Step1:再创建一个新的vivado工程。 Step2:将第一章生成的tcl文件复制到当前文件目录中来,并在tcl控制台中输入如下指令(注意tcl文件路径根据自身情况进行调整): Step3:工程创建完成之后,单击Settings。 Step4: 选择IP设置区中的repository Step5:单击+号图标,将上一节封装的IP的路径存放进去,单击OK完成修改。 Step6:单击添加IP图标,然后输入刚才创建的IP的名字关键字LED,双击将其添加到工程当中来。 Step7:再添加一个GPIO,双击IP图标,修改配置如下。 Step8:点击Run connection Automation,在弹出来的窗口中注意不勾选GPIO
Step12:在弹出来的窗口中,如下图所示,然后单击OK。 Step13:选中top.bd,右单击然后选择Create HDL Wrapper,在弹出来的窗口中直接点击OK。 Step18:单击File-Launch SDK。 3.4软件设计Step1:单击File-New-Application Project开始创建一个SDK工程。 Step2:在新弹出来的窗口中,输入工程名字GPIO_Test (注意不能有非法字符)。 Step3:单击Next,然后在左侧选择Empty Application(空白工程),最后选择Finish。 Step4:展开GPIO_Test,然后选中src,右单击选择New-Source file。 Step5:命名为Main.c. Step6:双击main.c,将以下程序拷贝进去: /***************************** Include Files *********************************/
#include "xparameters.h" #include "xgpio.h" #include "sleep.h"
/************************** Constant Definitions *****************************/
/* * The following constants map to the XPAR parameters created in the * xparameters.h file. They are defined here such that a user can easily * change all the needed parameters in one place. */ #define GPIO_EXAMPLE_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
/* * The following constant is used to determine which channel of the GPIO is * used for the LED if there are 2 channels supported. */ #define LED_CHANNEL 1
/* * The following are declared globally so they are zeroed and so they are * easily accessible from a debugger */
XGpio Gpio; /* The Instance of the GPIO Driver */
/*****************************************************************************/ /** * * The purpose of this function is to illustrate how to use the GPIO * driver to turn on and off an LED. * * @param None * * @return XST_FAILURE to indicate that the GPIO Initialization had * failed. * * @note This function will not return if the test is running. * ******************************************************************************/ int main(void) { int Status; /* Initialize the GPIO driver */ Status = XGpio_Initialize(&Gpio, GPIO_EXAMPLE_DEVICE_ID); if (Status != XST_SUCCESS) { return XST_FAILURE; }
/* Set the direction for all signals as inputs except the LED output */ XGpio_SetDataDirection(&Gpio, LED_CHANNEL, 0);
/* Loop forever blinking the LED */
XGpio_DiscreteWrite(&Gpio, LED_CHANNEL, 0); usleep(50000); XGpio_DiscreteWrite(&Gpio, LED_CHANNEL, 1);
return XST_SUCCESS; }
|
Step7:选中SDK工程文件,右单击选择Debug As-Debug configuration。 Step8:在弹出来的新窗口中,双击下图圈出部分,然后勾选箭头所示参数 Step9:单击Apply,然后单击Debug(进行这一步之前,先给开发板上电)。
3.5程序分析 本章的程序比较简单,可以看出来是由上一章的程序改动过来,这些函数在上一章已经进行过讲解,因此就不再重复讲解了。本章的核心思想就是用GPIO去控制封装IP的复位,以此达到流水的可控性。所以在程序中一开始让GPIO输出0,让IP进行复位,之后延时一段时间之后,再让GPIO输出高电平,使IP进入工作状态。 3.6本章小结 本章需要重点掌握的是IP的封装流程和怎么调用封装的IP,这在以后的设计中是一项重要的技能。 |