首先,我们来看一个demo,这个demo实现自动下载SOF和ELF文件。其目录结构如图1所示。这是一个在DE2上实现从SD卡中读取文档的工程。SOF和ELF文件分别是FPGA硬件配置程序和NiosII 软件程序。
![](https://i-blog.csdnimg.cn/blog_migrate/ce5ce5030e6f5f750b79a43495a4dca8.jpeg)
(图1)
需要准备一张SD卡,格式化成FAT16格式,卡中的内容如图2所示。
(图2)
将SD卡插入DE2的SD卡插槽,将DE2与电脑连接,上电。双击test.bat批处理文件。此时会弹出DOS窗口,实验现象如图3,图4所示。可见,这个批处理文件实现了自动下载SOF配置文件和下载运行Nios程序。
(图3)
(图4)
我们来看看test.bat中到底是什么内容。用文本编辑器打开test.bat,其内容如图5所示。
(图5)
第一行:%QUARTUS_ROOTDIR%\\bin\\quartus_pgm.exe -m jtag -c USB-Blaster[USB-0] -o "p;DE2_SDCARD.sof"
这个批处理首先调用了quartus_pgm.exe这个程序实现下载DE2_SDCARD.SOF, quartus_pgm.exe在QuartusII的安装目录下的bin目录下,我们进入C:\altera\90\quartus\bin目录(路径因机器而异),可以看到以下文件,如图6所示。由图标可以看出,quartus_pgm.exe是一个dos程序,双击它是无法运行的,只能在DOS窗口下使用。名字与它相近的quartus_pgmw.exe正是quartus_pgm.exe的图形化界面,也正是我们在QuartusII中进行下载时调用的程序,如图7所示。
(图6)
(图7)
至于那些参数“-m jtag -c USB-Blaster[USB-0] -o "p;DE2_SDCARD.sof" ”,都表示什么含义呢,我们进入DOS窗口,进入C:\altera\90\quartus\bin目录,运行“quartus_pgm/?”帮助命令,如图8所示。由显示的结果得知,-m 参数表示下载模式,这里是jtag模式,-c 表示下载电缆,这里是用USB-Blaster下载,-o 表示下载操作(?不理解),但还有“p;”这个参数怎么解释呢。看来我们需要更详细的解释。图中最后一行提示我们,如果需要更详细的说明,可以输入“ –help=<option|topic>”命令。于是,运行“c:\altera\90\quartus\bin\quartus_pgm --help=o”,出现了更加详细的说明,如图9所示。
(图8)
(图9)
第2-6行:
@ set SOPC_BUILDER_PATH_71=%SOPC_KIT_NIOS2%+%SOPC_BUILDER_PATH_71%
@ set SOPC_BUILDER_PATH_72=%SOPC_KIT_NIOS2%+%SOPC_BUILDER_PATH_72%
@ set SOPC_BUILDER_PATH_80=%SOPC_KIT_NIOS2%+%SOPC_BUILDER_PATH_80%
@ set SOPC_BUILDER_PATH_81=%SOPC_KIT_NIOS2%+%SOPC_BUILDER_PATH_81%
@ set SOPC_BUILDER_PATH_90=%SOPC_KIT_NIOS2%+%SOPC_BUILDER_PATH_90%
这5行的作用是设置环境变量,这取决于你机器装的QuartusII的版本,如果你装的是9.0,那么只保留最后一行内容就行了。
第8-9行:
@ "%QUARTUS_ROOTDIR%\bin\cygwin\bin\bash.exe" --rcfile ".\test_bashrc"
pause
接着,调用C:\altera\90\quartus\bin\cygwin\bin目录下的bash.exe去解释执行当前目录下(即test.bat所在目录)下的test_bashrc脚本文件。(稍微懂linux的人应该知道,bash是linux常见的shell)。
到目前为止,我们光看到了DE2_SDCARD.sof的踪影,DE2_SDCARD.elf还没有现身,是不是藏在了 test_bashrc 这个脚本中呢。我们用文本编辑器打开test_bashrc 继续探索。如图10所示(为了能截在一张图中,删除了一些注释信息和空白行)。
![](https://i-blog.csdnimg.cn/blog_migrate/0f2101ad03c5faed63b9ceec304e9e25.jpeg)
(图10)
看第27行画红线处,DE2_SDCARD.elf果然隐藏在这里。
nios2-download DE2_SDCARD.elf -c USB-Blaster[USB-0] -r -g
nios2-terminal -c USB-Blaster[USB-0]
很明显,脚本首先调用nios2-download这个程序实现下载DE2_SDCARD.elf,-c –r –g 是这个程序的参数(或是选项),-c 应该就是选择下载电缆的选项,所以后面的值是USB-Blaster,那么 –r –g 分别又表示什么含义呢。同理,我们使用帮助。因为nios2-download是一个linux程序,所以要先进入模拟linux环境,即先运行bash.exe。(不知这样表述是否正确),然后运行 ./nios2-download –help 命令,如图11所示。
(图11)
只可惜这不是真正的linux环境,所以连最简单的显示命令 cat 都没有,使用帮助失败。只能作罢,再想其它办法。
一种方法是找一台在linux环境中装好NiosII IDE的计算机,使用 ./nios2-download –help命令,如图12所示。
(图12)
另一种方法是仍然在Windows下,进入C:\altera\90\nios2eds\bin目录,如图13所示。双击,使用文本编辑器打开(我其实没想到这竟然也是一个脚本文件,还以为是编译后的二进制代码呢),在脚本的中间部分,向我们描述了这些选项的作用。如图14所示。
-r/--reset-target Reset the target SOPC system before use. (使用前复位)
-g/--go Run processor from entry point after downloading. (?不明白)
(图13)
(图14)
最后,调用nios2-terminal,这相当于NiosII IDE中的控制台,可以和在硬件上运行的程序进行交互,接收从jtag-uart返回的信息,也可能通过jtag-uart给硬件发信息(取决定NiosII程序的功能),本例中,Nios程序通过jtag-uart返回了SD卡中的内容。
总结:
所以,只要对这个模版稍做修改,我们就能下载自己所需要的工程。首先,把SOF文件和ELF文件替换成要自己工程的文件,然后,修改test.bat中的这句话:“
%QUARTUS_ROOTDIR%\\bin\\quartus_pgm.exe -m jtag -c USB-Blaster[USB-0] -o "p;DE2_SDCARD.sof"”,把DE2_SDCARD.sof改成自己需要下载的文件名,然后,修改test_bashrc中的这句话:“nios2-download DE2_SDCARD.elf -c USB-Blaster[USB-0] -r -g”,同样把DE2_SDCARD.elf改成自己需要下载的文件名。
ELF文件从哪找呢,NiosII 工程生成的ELF文件会存放在当前工程目录下的Debug目录下。如图15所示。
(图15)