基于FPGA的嵌入式系统开发

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于FPGA的嵌入式系统开发的实验报告
应福军徐飞
Linux操作系统近年来在嵌入式领域中发展很快,由于其强大的性能和开源免费的特点,越来越受到嵌入式系统开发商的青睐,信息家电、网络设备、手持终端等都是嵌入式Linux应用的广大市场。

FPGA生产商Xilinx公司提供了全面的嵌入式处理器解决方案,包括PowerPC、MicroBlaze和PicoBlaze三款RISC结构的处理器核。

其中,MicroBlaze 是32位嵌入式软核处理器解决方案,支持CoreConnect总线的标准外设集合,具有兼容性、可配置性以及重复利用性,能够根据成本和性能要求提供高性价比的处理性能。

支持MicroBlaze处理器的嵌入式操作系统很多,比如μC/OS-II、BuleCat ME Linux、RTA MB、ThreadX、PetaL-inux等等。

本次项目实验是在xilinx 公司的spartan_3E开发板上移植petalinux内核一、实验目的
通过成功做一个嵌入式项目,把前期课堂学习转化成实践能力,真正具备基础的嵌入式开发能力,为今后的更大的项目实践打下基础
二、实验步骤
1.在EDK中建立基本硬件系统
新建工程,添加DCE,LED,FLASH,DDRAM,MAC,以及定时器等IP核
2. 在EDK中创建BSP
BSP是在EDK中创建BSP板级支持包(Board Support Package),是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。

BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,例如VxWorks的BSP和Linux的BSP相对于某一CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的,所以写BSP一定要按照该系统BSP的定义形式来写(BSP的编程过程大多数是在某一个成型的BSP模板上进行修改),这样才能与上层OS保持正确的接口,良好的支持上层OS。

修改debug模式以及软件环境
在菜单执行:Device Configuration->Updata Bitstream。

到这里,已经有了可工作的bit流文件以及为Linux准备的BSP文件了。

3.PetaLinux内核的移植
PetaLinux操作系统是面向MicroBlaze软核处理器的全功能嵌入式Linux 操作系统。

其发布采用了“all inone”的整合方式,将针对MicroBlaze处理器定制的Linux2.4/2.6内核源码、U-boot源码、相关的开发工具以及开发板参考硬件平台配置,集成在一个压缩包内发行,极大地方便了开发人员的使用。

3.1搭建交叉开发环境
解压压缩包:
tar zxvf petalinux-v0.40-rc2.tar.gz
设置环境变量
$ cd petalinux
$ source ./settings.csh
3.2添加新的开发平台
由于Petalinux默认配置里面没有Spartan3E开发板所以必须添加新的开发平台
$ cd $PETALINUX/software/petalinux-dist
$ petalinux-new-platform -v Xilinx -p Spartan3E -k 2.6
3.3为PetaLinux操作系统传递硬件配置信息
$ cd $PETALINUX/hardware/my_new_hardware_project(这是工程文件所在位置)$ petalinux-copy-autoconfig
3.4配置编译Petalinux
$ cd $PETALINUX/software/petalinux-dist
$ make menuconfig
进行一些必要的配置后编译
$ cd $PETALINUX/software/petalinux-dist
$ yes "" | make oldconfig dep all
编译完成后会在/tftpboot目录下生成image.bin image.elf image.srec image.ub linux.bin romfs.img u-boot.bin u-boot.srec u-boot-s.bin u-boot-s.elf u-boot-s.srec ub.config.img 内核文件和u_boot文件
3.5下载并启动内核
下载比特流文件
$ make -f system.make download
终端显示
发送u-boot srec文件镜像启动u-boot
$ cat /tftpboot/u-boot.srec > /dev/ttyS0
启动uboot,这时是在内存里面启动的
然后通过kermit下载uboot到flash,
U-Boot> loadb 0x90000000(内存起始地址)
按Ctrl-\ + C 进入Kermit下载,输入
C-Kermit>send /bin /tftpboot/ub.config.img
传送完成,按C返回uboot,
U-Boot> autoscr $(fileaddr)
配置文件写完后,写往boot分区写文件
U-Boot> loadb 0x90000000
按Ctrl-\ + C 进入Kermit下载,输入
C-Kermit>send /bin /tftpboot/u-boot-s.bin
传送完成,按C返回uboot,
U-Boot> protect off $(bootstart) +$(bootsize)
U-Boot> erase $(bootstart) +$(bootsize)
U-Boot> cp.b $(clobstart) $(bootstart) $(filesize)
写完后,断电重启就可以启动uboot了,配置好tftp就可以通过网站上的命令下载image.ub了。

上电启动成功登入系统界面
实验总结:
由于资料有限,实验室也没有在Spartan3E开发板进行Petalinux内核移植的经验,整个实验过程遇到了非常多的问题,导致进度非常的缓慢,但是也正因如此本次实验学到了很多,对在FPGA开发板上进行嵌入式开发有了更深刻的认识,我想这些都将成为我未来项目的宝贵经验
最后由于我的内核移植进度太慢,导致我组的徐飞同学无法进行Spartan3E 驱动的开发,不得已在实验室上的一块ARM开发板进行驱动移植,后面我会附上驱动的代码,请老师谅解。

// LED驱动源代码及说明//
#include<linux/config.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/miscdevice.h>
#include<linux/sched.h>
#include<linux/delay.h>
#include<linux/poll.h>
#include<linux/spinlock.h>
#include<linux/irq.h>
#include<linux/delay.h>
#include<asm/hardware.h>
#define DEVICE_NAME "leds"/*定义led设备的名字*/
#define LED_MAJOR 231 /*定义led设备的主设备号*/
static unsigned long led_table [] = { /*I/O方式led设备对应的硬件资源*/
GPIO_B7,
GPIO_B8,
GPIO_B9,
GPIO_B10,
};
/*使用ioctl控制led*/
static int matrix4_leds_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
if (arg > 4) {
return -EINVAL;
}
write_gpio_bit(led_table[arg], !cmd);
default:
return -EINVAL;
}
}
static struct file_operations matrix4_leds_fops = {
owner: THIS_MODULE,
ioctl: matrix4_leds_ioctl,
};
static devfs_handle_t devfs_handle;
static int __init matrix4_leds_init(void)
{
int ret;
int i;
/*在内核中注册设备*/
ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &matrix4_leds_fops);
if (ret < 0) {
printk(DEVICE_NAME " can't register major number\n");
return ret;
}
devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, LED_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR, &matrix4_leds_fops, NULL); /*使用宏进行端口初始化,set_gpio_ctrl 和write_gpio_bit 均为宏定义*/ for (i = 0; i < 8; i++) {
set_gpio_ctrl (led_table[i] | GPIO_PULLUP_EN | GPIO_MODE_OUT);
write_gpio_bit(led_table[i], 1);
}
printk(DEVICE_NAME " initialized\n");
return 0;
}
static void __exit matrix4_leds_exit(void)
{
devfs_unregister(devfs_handle);
unregister_chrdev(LED_MAJOR, DEVICE_NAME);
}
module_init(matrix4_leds_init);
module_exit(matrix4_leds_exit);
测试程序
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ioctl.h>
int main(int argc, char **argv)
{
int on;
int led_no;
int fd;
if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 ||
on < 0 || on > 1 || led_no < 0 || led_no > 3) {
fprintf(stderr, "Usage: leds led_no 0|1\n");
exit(1);
}
fd = open("/dev/leds", 0);
if (fd < 0) {
perror("open device leds");
exit(1);
}
ioctl(fd, on, led_no);
close(fd);
return 0;
}。

相关文档
最新文档