经过将近两个星期的摸索,对zedboard板的工作相对了解了一些些,Vivavo 这个设计工具使用起来相对于,ISE 来说会简单一些,方便一些。
进入正题。 使用到的工具:vivado 2013.4 +SDK
一)、LED流水灯 ,IP 核的调用(跟着书上P97页)
1)打开VIvado 2013.4 ,根据向导创建新的工程(注意:确保Create project subdirectory勾上),next
2)选择RTL,确保不能勾Do not specify sources.....,next
3)一路默认,选择板型号。。。finish。
4)点击左边IP Integrator -> Create Block Design 。这个就有点像quartus II 里面的原理图设计,在Diagram 里面空白的地方就可以添加现有的IP核进行设计。(具体设计步骤见书本)
5)拉完IP核器件,连好线,在Sourcs -> 下面工程名字 右击 Generat Out....,再右击生成顶层文件Create HDL Wrapper...
6)点击Generate Bitstream -> yes,进行有点像编译生成*.bit 的文件。这个过程有点久,我电脑要10多分钟.弹出Bitstream Generation successfully completed。表示成功了,点ok,然后 Export to SDK ,就可以进行C语言编程了。下面是源程序 《这个是加入了PWM IP核的,流水灯程序被改了下》
#include <stdio.h>
#include"platform.h"
<span style="color:#ff0000;">#include"axi_pwm.h"</span>
#include"xparameters.h"
#include"xgpio.h"
#include"xil_printf.h"
#include"xil_cache.h"
#define GPIO_BITWIDTH 8
#define GPIO_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID//device id
#define LED_DELAY 10000000/* times delay*/
#define LED_MAX_BLINK 0x1
#define LED_CHANNEL 1/* GPIO channel*/
#define printf xil_printf /* A smaller footprint printf */
<span style="color:#ff0000;">#define PWM_BASEADDR XPAR_AXI_PWM_0_S00_AXI_BASEADDR</span>
XGpio Gpio;
XGpio GpioOutput;
int GpioMarquee (u16 DeviceId, u32 GpioWidth)
{
volatile int Delay;
u32 LedBit;
u32 LedLoop;
int Status;
Status = XGpio_Initialize(&GpioOutput, DeviceId);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
//输出口
XGpio_SetDataDirection(&GpioOutput, LED_CHANNEL, 0x0);
// 输出低电平
XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL, 0x0);
for (LedBit = 0x0; LedBit < GpioWidth; LedBit++) {
for (LedLoop = 0; LedLoop < LED_MAX_BLINK; LedLoop++) {
//Set the GPIO Output to High
XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL, 1 << LedBit);
//Wait a small amount of time so the LED is visible
for (Delay = 0; Delay < LED_DELAY; Delay++);
//Clear the GPIO Output
XGpio_DiscreteClear(&GpioOutput, LED_CHANNEL, 1 << LedBit);
// Wait a small amount of time so the LED is visible
for (Delay = 0; Delay < LED_DELAY; Delay++);
}
}
return XST_SUCCESS;
}
int main(void)
{//Application start
/* loop forever*/
init_platform();
print("HELLO WORD\n\r");
<span style="color:#ff0000;"> AXI_PWM_mWriteReg(PWM_BASEADDR,AXI_PWM_S00_AXI_SLV_REG0_OFFSET,10);
AXI_PWM_mWriteReg(PWM_BASEADDR,AXI_PWM_S00_AXI_SLV_REG1_OFFSET,0x80000000+5);</span>
u32 status;
while(1){
status = GpioMarquee (GPIO_DEVICE_ID,GPIO_BITWIDTH);
if (status == 0)
printf("SUCESS!.\r\n");
else
printf("FAILED.\r\n");
}
return XST_SUCCESS;
}
二)、Vivado 硬件调试debug(书P115页)按书本上做就OK了 中间好象有个错误 ,但是好像没影响到使用。
三)、建立自己的IP核 PWM输出(P170)
1)打开VIOADO2013.4 新建工程,选择RTL,注意勾Do not specify sources..... 跟上面不一样,next,选好板型号,finish
2)跟着书走,一直到P178页 IP Ports 注意看里面是否有pwm_out 如果没有要要更新顶层文件,否则到后面会出错。
3)新建完IP 然后基本跟添加 LED 模块一样,添加PWM进来,EXPORT SDK进行编程,可以修改 周期,占空比。。。
四)、介绍下对zedboard板跑Linux系统的自己的一些理解。
zedboard 跑Linux系统是通过从SD卡启动,调用SD中的文件(ZImage,BOOT.BIN,devicetree_ramdisk.dtb,ramdisk8M.image.gz)进行启动的。但这是FPGA,不是完全的arm,所以跟ARM还是有点区别的。因为要进行FPGA先关硬件的配置,所以就要用到了之前在VIVADO 生成的那个*.bit的文件,来配置FPGA,所以SD卡中的BOOT.BIN 文件就是由(u-boot.elf+****.bit+FSBL.elf)三个文件合成的,包涵了启动的引导信息,和FPGA硬件的配置信息。然后Zimage 这个文件就是编译Linux内核生成的。devicetree_ramdisk.dtb,是设备树,具体什么作用还不是很了解。然后是ramdisk8M.image.gz 文件系统,通过改这个文件已成功更改了启动时OLED上显示的logo,添加自己的文件夹。。。。还有一个疑问就是,zedboard启动了Linux系统,通过串口终端 ,进行文件夹的创建啊,文件修改啊,好像在重启以后就会消失,这可以通过改ramdisk8M.image.gz 文件解决,但是很麻烦不知道还有没别的简单的方法。
五)文件系统的创键ramdisk8M.image.gz
这是根据一步一步学ZedBoard & Zynq(七):制作ZedBoard上linux根文件系统(ramdisk),这篇文档做的。
目前碰到的问题是,SD中的4个文件中BOOT.BIN自己制作的话,Linux系统启动不起来。个人分析是在制作*.bit 文件时,硬件信息没配置全,导致的。现在使用官方给的BOOT.BIN文件和自己的文件系统是可以使用的,不知道会不会出什么问题。待下周继续。
下周的任务目前计划是,结合那块AD板子,配置好相关的启动文件SD卡中的4个文件。。。。还有写Linux上的第一个驱动点灯。。由于还没自己写过Linux驱动,所以可能这里就要花很多时间在里面。。。如果这个也做好,尽量看能不能让AD芯片工作起来。。。。
这就是这周总结2014年9月26日————桥