NIOSII是altera公司针对FPGA推出的一个CPU软核,它可以综合到任何一款altera的FPGA中。用户可以基于sopc builder搭建自己的系统。一个基于NIOSII的系统如图:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
除了sopc builder提供的一些外设以外,用户可以按照avalon总线标准来实现自己的模块,而且可以很容易的集成到系统里面去。
niosii有三个不同的版本:niosii-e、niosii-s、niosii-f。
Niosii-e针对低成本应用,内部没有流水线结构,不带指令/数据CACHE,所以实现所需要的逻辑较小(600-700 LEs)。
Niosii-s有五级流水结构,带指令cache(size根据用户配置),实现需要1200-1400 LEs。
Niosii-f有六级流水结构,带指令和数据cache,实现需要1400-1800 LEs。
在建立系统之前检查一下软硬件配置:
1、使用最新版本的Quartus和Nios软件,低版本软件可能存在bug。我之前用QuartusII 5.1试了好几次都没有完全把uClinux跑起来,在boot开始以后就挂死了,百思不得其解,后来换成QuartusII 6.1以后,重新编译了一下逻辑就把跑起来了。郁闷了我好久……
2、uClinux需要在linux环境下编译(基于cygwin也可以编译,不过我说的这个过程是在linux上的),所以你必须有一个linux操作系统。有几种办法:A,装一个linux版本的QuartusII,所有的操作都在linux下完成。B,用两台计算机,一台用windows,跑quartus等软件,另一台装linux。C,在windows下装个虚拟机vmware,在虚拟机上装linux,通过虚拟机来编译uClinux,然后把image文件导入到windows下调试。我就是使用虚拟机的方法,但是要求你的PC内存比较大才行,否则系统会很慢。
3、你板子上FPGA的容量要能装的下一个系统,外部的SDRAM容量至少要<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />8M byte。我用的是一个EP1C6的FPGA加8M byte的SDRAM。不需要FLASH。
以上条件都满足了,就可以开始了。
首先,建立一个工程,然后建立一个小系统,配置如下:
最小系统至少要包括:
一个niosii cpu,一个sdram控制器,cfi_flash控制器(在单板上不需要flash),全功能的timer,用于通信的jtag uart或serial uart。
可以根据单板的硬件资源来适当配置逻辑,比如加入一些led和key等等。
在linux里面中断0是自动识别的,所以在硬件系统里面不要使用0号中断。
生成好系统以后,在Quartus里面把引脚连好,包括设置好用于SDRAM 的PLL:
系统编译好以后,先用NIOSII IDE写个程序来测试一下SDRAM和系统是不是可以运行。如果程序能正确运行的话,就可以进入下一步了。
要把uClinux放到niosii中运行首先必须把uClinux代码编译成niosii的指令。这个编译的过程需要相应的程序来完成。下载nios2gcc.tar.bz2软件包。
进入linux操作系统,打开一个shell界面,执行如下操作:
把下载的nios2gcc.tar.bz2软件包放到home下,如/home/duckfly/
然后切换到root
su
#输入root密码
tar jxf /home/duckfly/nios2gcc.tar.bz2 -C /
exit
niosii的交叉编译工具链就会安装到/opt/nios目录下,我们需要把这个目录加入到path变量中去,让shell能自动寻找。
打开home下载.bash_profile文件,这个文件是隐藏文件,需要用ls –a才能看见。
ls -a
vi .bash_profile
#把PATH变量修改为:PATH=$PATH:/opt/nios2/bin:$HOME/bin
source .bash_profile
# 让修改的环境变量生效
nios2-linux-gcc –v
# 查看是否安装好了,打印出版本信息
交叉编译环境安装好以后,就可以编译uClinux了。
首先到http://www.uclinux.org/pub/uClinux/dist/ 下载一个uClinux的代码包。
然后下载uClinux-dist-20070130-nios2-02.diff.gz 软件包,这是把uClinux移植到niosii CPU上的补丁。
在linux下使用如下命令:
# 使用普通用户登陆
cd ~
# 解压uClinux代码
tar jxf ~/download/uClinux-dist-20070130.tar.bz2
# 进入uClinux根目录
cd uClinux-dist
# 打补丁,这一步只能做一次,否则会引起错误
zcat ~/download/uClinux-dist-20070130-nios2-02.diff.gz | patch -p0
# 还是停在uClinux-dist目录,不要切换目录
# 配置uClinux 内核
make menuconfig
# 选择Vendor/Product Slection
# 配置Vendor和Product
# 回到主界面,选择Kernel/Library/Default Selection
# 配置Library和Kernel参数为默认值
# 选择
# 保存配置
# 把在QuatusII下生成的系统的ptf文件拷贝到一个目录,比如/home/duckfly/sys.ptf
# 根据系统硬件配置uClinux
make vendor_hwselect SYSPTF="/home/duckfly/"sys.ptf
# 根据硬件配置选择相应的选项
# 建立romfs目录,第一次make可能会报错,忽略。必须在第一次编译内核之前运行
make romfs
# 编译内核,第一次编译内核时可能报错,如果出错,那么重新再make一次
make
# 如果错误,重新再make一次
make
# 重新生成image文件
make linux image
# 到这里,uClinux的image文件就产生了,把它拷贝到windows下面下载并运行
在Quatus里面把编译好的系统下载到FPGA里面去
FPGA配置完以后,就可以下载软件了。
打开NIOSII的命令行
# 进入到zImage文件所在的目录,下载软件
nios2-download –g zImage
# 下载完成以后,打开nios2-terminal,接口串口发送的信息
nios2-terminal
# JTAG串口上打印如下信息
Uncompressing Linux... Ok, booting the kernel.
Linux version 2.6.19-uc1 (duckfly@localhost.localdomain) (gcc version 3.4.6) #22 PREEMPT Sun Jun 17 16:22:49 CST 2007
uClinux/Nios II
Altera Nios II support (C) 2004 Microtronix Datacom Ltd.
Built 1 zonelists. Total pages: 2032
Kernel command line: duckfly
PID hash table entries: 32 (order: 5, 128 bytes)
Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Memory available: 6892k/8192k RAM, 0k/0k ROM (871k kernel code, 336k data)
Mount-cache hash table entries: 512
io scheduler noop registered
io scheduler deadline registered (default)
NIOS serial driver version 0.0
ttyS0 (irq = 2) is a builtin NIOS UART
Freeing unused kernel memory: 260k freed (0xe2000 - 0x122000)
Shell invoked to run file: /etc/rc
Command: hostname uClinux
Command: mount -t proc proc /proc
Command: mount -t sysfs sysfs /sys
Command: mount -t usbfs none /proc/bus/usb
mount failed: No such file or directory
Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: mkdir /var/empty
Command: ifconfig lo 127.0.0.1
ifconfig: Bad command or file name
Command: route add -net 127.0.0.0 netmask 255.0.0.0 lo
route: Bad command or file name
Command: cat /etc/motd
Welcome to
____ _ _
/ __| ||_|
_ _| | | | _ ____ _ _ _ _
| | | | | | || | _ \| | | |\ \/ /
| |_| | |__| || | | | | |_| |/ \
| ___\____|_||_|_| |_|\____|\_/\_/
| |
|_|
For further information check:
http://www.uclinux.org/
Execution Finished, Exiting
Sash command shell (version 1.1.1)
/>
# 可以使用linux下的一些命令如:
/> ls
bin dev etc home lib mnt proc usr var sys tmp init sbin
/> ps
PID Uid VmSize Stat Command
1 root SW /init duckfly
2 root SWN [ksoftirqd/0]
3 root SW< [events/0]
4 root SW< [khelper]
5 root SW< [kthread]
6 root SW< [kblockd/0]
7 root SW [pdflush]
8 root SW [pdflush]
9 root SW< [kswapd0]
10 root SW< [aio/0]
15 root SW -/bin/sh
17 root RW ps
/> cd tmp
/tmp> ls
module test
/tmp> cd test
/tmp/test> ls
led string led2
用户999538 2013-7-26 13:46
用户178989 2010-4-9 13:53
用户384849 2009-7-17 13:19
用户76594 2008-8-17 15:15
用户1449065 2008-8-15 20:35
用户1449065 2008-8-15 20:25
用户1449065 2008-8-15 20:25
用户1449065 2008-8-15 20:24
用户1449065 2008-8-15 20:24
用户1449065 2008-8-15 20:23