Zynq学习笔记 (2)矿板运行SDK创建的PS简单工程
<div class='showpostmsg'> 本帖最后由 cruelfox 于 2023-7-22 17:40 编辑<p> (接前一篇 <a href="https://bbs.eeworld.com.cn/thread-1235896-1-1.html" target="_blank">Zynq学习笔记 (1)矿板小试FPGA开发流程</a> )</p>
<p> </p>
<p> Zynq PS部分的开发涉及到交叉编译ARM Cortex-A9 CPU运行的程序,也就是Zynq上面运行的程序。这部分工作不是由Vivado负责的,需要用另外一套软件工具:Xilinx SDK.</p>
<p> SDK开发软件又需要Zynq的配置信息,也就是在Vivado工程中设置的PS时钟、DDR、外设那些。根据教程的介绍,在Vivado工程完成之后,使用Export功能,将硬件信息导出给SDK用。</p>
<p></p>
<p> 在导出的时候可选择包含bit文件,也就是FPGA部分的配置码流。原因是Zynq启动是由PS部分主导的,需要PS负责PL (FPGA)的初始化,不像单纯FPGA只要将bit烧写到外部flash中就可以自动加载了。导出的文件后缀是 .hdf</p>
<p> </p>
<p> SDK的IDE是Eclipse风格的,操作起来和常见的MCU近似了。</p>
<p> 在SDK中新建工程的时候,要选择目标硬件平台,而我必须用自己的板子而非所列的硬件,于是点旁边的New按钮。</p>
<p></p>
<p> 然后就要用到从Vivado中导出的硬件信息了,点Browse选择之前生成的.hdf文件,软件会自动取一个名称(可能会长,自己可以修改)。</p>
<p></p>
<p> 再回到上一个对话框,就看到目标硬件平台已经变成新建的了。</p>
<p> </p>
<p> 先给新的软件工程取个名(比如我用的demo0),SDK还会同时创建一个BSP: demo0_bsp</p>
<p></p>
<p> 再点Next可以看到一些工程的模板供选择。作为新手有必要看一下工程怎么写的,可以选最简单的Hello World,这里选Memory Tests,顺带测试一下DDR的配置是否能工作。</p>
<p> </p>
<p> 确认以后,SDK就自动创建工程并编译了,可以在Project Explorer中看到源文件等内容</p>
<p></p>
<p> 这看起来和开发MCU用的arm-none-eabi工具链有几分相似呢,编译结果也是得到elf文件。选中erf文件,点鼠标右键弹出菜单,就可以选择Debug或者Run来运行了。当然也类似于MCU开发环境,前提是调试器要连好了,这里需要Xilinx 下载器连到了Zynq的JTAG上面。</p>
<p></p>
<p> </p>
<p> 我已经连好了矿板,确认FPGA可以下载bit文件的情况下,SDK中选择Debug或Run还是遇到了问题:</p>
<p></p>
<p> 这像是一个调试器的故障,矿板的PS部分本来已经运行起Linux了,可能不能被JTAG复位。</p>
<p> 关于Zynq的启动,我所知是有几种模式的。那么不让矿板的Linux启动,也许是可以解开这个问题。从电路图上分析,矿板是用的NAND flash启动方式,那么改一下 PS MIO脚的上拉为下拉,就可以切换到JTAG boot模式避免板子自己启动了。</p>
<p></p>
<p> </p>
<p> 矿板上的boot模式没有接死,上拉和下拉电阻都有,不用飞线直接改焊电阻就可以了。</p>
<p></p>
<p></p>
<p> 把照片上红框中R2578电阻焊下来,改焊到旁边R2585的位置上,矿板就不会从NAND启动了。</p>
<p> </p>
<p> 改启动模式之后,在SDK中选择Run,顺利看到了串口打印出来的信息:</p>
<p></p>
<p> </p>
<p> 作为模板提供的Memtest程序是在Zynq7010的片上SRAM中运行的。这一点可以由lscript.ld脚本佐证:</p>
<p></p>
<p> 为了分析程序怎么运行的,可以试着去反汇编一下demo0.elf 文件。使用SDK目录下面的arm-xilinx-eabi-objdump –d 来反汇编,可以看到所有代码部分。</p>
<p> 比如,在地址0地方是中断向量表:</p>
<p></p>
<p> 也可以查找main函数在哪里:</p>
<p></p>
<p> 整个程序的初始化部分比STM32 MCU还是显得代码量多,不过,想想能当成一个667MHz主频,有256MB DDR RAM可以用,还可以自己用verilog写外设的MCU板子来玩,可以发挥的地方就多了。</p>
</div><script> var loginstr = '<div class="locked">查看精华帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
}
</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>我把我的矿板也找出来了。</p>
<p>跟着楼主学习了</p>
<p>这个架构的软件部分还是好写,驱动和示例非常全。</p>
<p>还有继续更吗?最近也打算玩一玩</p>
<p> </p>
<p>支持楼主长期分享,正在学习ZYNQ编程中,感谢<img file="" height="28" initialized="true" inpost="1" lazyloaded="true" onclick="zoom(this, this.getAttribute('zoomfile'), 0, 0, '0')" onmouseover="showMenu({'ctrlid':this.id,'pos':'12'})" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/grinning-face-with-smiling-eyes_1f601.png" width="28" zoomfile="" /></p>
<p>现在是vitis2023.2了;建立freertos工程会报错</p>
风过不留痕 发表于 2024-1-15 13:26
现在是vitis2023.2了;建立freertos工程会报错
<p>已搞定</p>
<p>这个架构的软件部分还是好写,驱动和示例非常全。 thanks for you</p>
页:
[1]