原创 【博客大赛】Zynq构建SoC系统深度学习笔记-01_利用IP集成器构建嵌入式SoC系统(02)

2016-1-20 20:26 1642 11 11 分类: FPGA/CPLD 文集: Zynq构建SoC系统深度学习笔记

【声明】纯属原创,未经允许,禁止转载。

【接前文】
    前文提到通过界面可以定制修改Zynq子系统的配置,通过Import配置文件可以批量导入一套Zynq的配置,通过Presets菜单可以导入Vivado软件自带的针对官方开发板的配置。

【思考】先想一下,Zynq系统的配置是如何实现的呢?
    有过ARM嵌入式开发经验的应该能够向导,对于一个数字集成电路,所有的配置不过就是对芯片内部的功能寄存器进行配置,特定地址的寄存器中的某一个或几个bit对应的就是一个功能。
    因此,上述的配置文件也好,默认配置也好都是批量对Zynq的功能寄存器进行初始化配置,而界面配置中,每一个选项对应一个功能寄存器的配置,仅此而已。
    不过以上仅是猜想,下面我们来证实一下。下面这张图是前一篇文章的最后一张图,就是zynq导入Vivado软件中保存的官方配置后的结果(针对Zedboard开发板)。

图片1.jpg

    上图右上角,有一个开关“Summary Report”,点击之后将会打开Zynq子系统的功能寄存器窗口,如下所示。

图片2-s.jpg

    上图所示是Zynq子系统的复用管脚的配置信息,可以看到MIO1~MIO6配置给了SPI Flash接口。
    【注意】上图表中显示的是参数信息,而非前文讨论的寄存器配置信息。别急后面会看到功能寄存器。
    再往下翻看,或者点击上图左侧的超链接“DDR REGISTERS”就可以快速跳转到DDR相关的功能寄存器处。

图片3_s.jpg

    图中所示的都是DDR相关的信息,本系列笔记后面会重点用到DDR,这里先关注一下。这些配置都跟板上的DDR芯片相关,这些信息均来源于前面选择开发板 时指定了ZedBoard开发板的缘故。
    【注意】同样,上图表中显示的是参数信息,而非前文讨论的寄存器配置信息。
    如果是自己的开发板,这些参数就需要人为手工填写了。这个Report页面是只能看不能写的,手动修改配置的页面 如下:

图片4.jpg

    可以看到配置页面和Report页面信息是一致的。
    再翻翻可以看到时钟信息,如下所示:

图片5.jpg

    上图中,上半部分是参数信息,而下半部分就是寄存器信息了,包括功能寄存器的名称,地址和初始化配置。
    通过原理图,可以看出根据选择的开发板选项以及相应版本的ARM配置文件,可以确定告知ARM输入的晶振是33.333333MHz,对应的原理图信息如下所示:

图片6.jpg

    再往下的信息就是ARM内核的寄存器地址,读写属性,掩码(那几个比特有效),复位后初始值,功能描述等信息。具体信息可以参考ARM内核手册。
    其中,信息页面最开头的MIO信息中的MIO是与普通ARM芯片类似的复用IO管脚。点击下图所示的“Peripheral I/O Pins”,将会弹出相应的配置页面,左侧的模块选择是ARM内核里面已将包含的常用外设功能IP核,这些IP核将会服用Zynq这个Xinlinx公司 裁剪出的ARM内核所设计的0~53共计54个多功能复用IO管教。跟普通ARM类似,用一个管教也只能服务于规定好的几个固定的外设功能模块,比如下图 所示的Bank1中的16~21管脚,既可以用于SD卡进行数据交互的SD0控制模块,也可以用于网络控制模块Enet0,因此这两个模块只能二选一。下 图即勾选了Ethernet0,也勾选了SD0,就是想让这两个Zynq内的外设模块都工作,但是这两个会用到相同的IO口,因此将会异常。

图片7.jpg

    这时候,对于有些功能模块,可以在MIO Configuration页面中选择不同的默认配置管脚,从而有限的规避上述异常风险。

图片8.jpg

    从而修改SD0在Zynq内核中指定的IO管脚,如图所示,将其从16~21号管脚重新映射到28~33号管脚。

图片9.jpg

    可以看到,修改配置后,再次选定SD0功能模块,使用的管脚就是28~33,没有别的模块占用,显示为绿色,表示可用。
    当然,软件还是很智能的,如果你只是选择需要的外设功能模块,软件会自动给你匹配最佳的管脚分组方案,只有当软件实在排不开管教分配的情况下,才会标红报告异常。因此对于普通的用户设计,不用太关注Zynq的功能模块的管脚分配,只要没有标红警告,使用软件推荐的就可以了。
    本实验,只需要一个UART作为信息输出的窗口,因此只保留UART1的配置即可,之前显示勾选的外设,均是由前面选择使用的 “zedboard_RevC_v2.xml”文件中配置的。如果实验时配置整乱了,可以重新加载该配置文件,Zynq系统会恢复成该配置文件初始的设 置。

图片10.jpg

    从这里可以看出对于Zynq系统,内部配置的IO外设有两个网口,2个USB口,2个SD卡接口,2个串口UART,2个I2C总线接口,2个SPI总线 接口,2个CAN总线接口,之所以都是2个,应该跟内含2个ARM内核有关,保证1个内核能有一组基本外设接口。

图片11.jpg

    此外,从上图看出,Zynq还包含了3类Flash接口,定时器模块,调试接口等。本实验为了裁剪一个最小的系统,后面将会把上图中的Quad SPI Flash和Timer 0都给取消勾选。这里没有勾选PJTAG,会不会是的SDK无法实现在板调试呢?有待验证。

【高级选项】
    点击打开“PS-PL Configuration”页面中还能对外设模块进行配置,比如下图就看出UART1的默认波特率是115200,通过下拉列别可以修改。根据ARM开发经验,大胆假设这些修改将会对应改变相应寄存器的默认配置,从而达到修改配置的目的。

图片12.jpg

    找一下佐证。打开Summary Report看看,记得前面说过,那里有寄存器的信息。
【个人理解】
    初略的找了一下,summary viewer配置界面中,只能看到Baud_rate_divider_reg0 /  Baud_rate_gen_reg0  / Control_reg0 等一组寄存器的信息,开始以为只显示了UART0的信息呢,所有后面的文档说明中说到,Disable UART1,改成Enable UART0。后来 突发奇想,把两个UART功能模块都激活,看了一下Summary Report。神奇的事情发生了,对比结果如下图所示。

图片13.jpg
图片14-s.jpg
图片15-s.jpg

   【对上述3副图的比较结果】可以看出寄存器的命名和功能外设并不是直接对应的,这个和普通ARM结构是不同的。
 


    判断配置是否已经被软件采用,一个经验是在其他页面修改完配置后,切换回Zynq Block Design页面。等着,直到相应的小对勾√变成你期望的配置,表示软件后台对你的配置处理完毕。此时再看summary report才比较靠谱。

图片16.jpg

    下面还是针对最常用的串口模块进行分析说明,在Report页面中,可以看到对串口硬核进行配置的功能寄存器的说明。
    【注意】下图配置跟前后文设计的参数有出入,因为不是一个工程进行的截图,但不影响说明。
    激活UART0功能模块,配置参数选择默认的115200时,相应的配置信息如下:

图片17.jpg

    当通过下拉列表选择为9600后,点击左侧“Page Navigator”列表中的“Zynq Block Design”项目后,软件将会对选择的配 置参数进行处理,等待几秒钟待处理完毕后,点击右上角的“Summary Report”,显示新的配置参数如下:

图片18.jpg

    可以看出相应的寄存器中的配置参数发生了修改。
    再往下看,可以发现对于串口的配置参数对应的寄存器bit位,以及相应的说明。如下所示:

图片19.jpg

    如果想修改串口的配置参数,可以编程对0xE000_0000的寄存器就行修改就可以了。从这可以看出Zynq是Xinlinx公司自行裁剪的一个ARM 最小系统,该系统仅包含了最基本的功能模块,其相应的开发思路就是一个普通的ARM,所有的功能配置都是基于对寄存器的配置和读取来实现的。这就是SoC 的本质。
    给予Zynq的SoC系统,不过是在Zynq这个最小系统外再加上一些有用户逻辑PL构建的自定义功能模块仅此而已。
    裁剪完Zynq的功能模块后,对应的MIO信息也将发生变化。

图片20.jpg


    本实验秉承简化的原则,只保留后面会用到的外设Uart x(包括Flash和定时器都给裁剪掉),Xilinx公司的示例建议保留的是UART1,本实 验上述分析保留的是UART0,这里仍然保留。这个配置根据设计人员的喜好自行配置即可,不会影响实验结果。

【未完待续】又够20张图了,Zynq配置还有个小尾巴,下篇继续。



 

文章评论0条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条