一、概述:
与传统单核芯片(如:ST系列)不同,AG32整颗芯片包含两个核:mcu和cpld。
这里的mcu核已经相当于ST的整颗芯片。而CPLD核是比普通芯片多出来的那个核。
这两个核是相互独立的(各自编译、各自下载),又可以相互连通起来(信号连通)共同工作。
所以,AG32工程会编译出来2个bin。一个是代码的bin,一个是逻辑的bin,称之为code.bin和logic.bin。最终使用时,需要把这两部分的bin都烧录进去,芯片才能工作起来。
mcu编译出来bin容易理解,在VScode下点编译就可以了。
cpld的bin,则根据使用方式的不同,生成方式也会不同。参照以下介绍。
.
二、两个bin怎么生成
根据使用预期的不同,分成三种情况:
1.只使用mcu部分,不使用cpld部分;
2.同时使用mcu和cpld来联合编程;
3.只使用cpld部分,不使用mcu部分;
首先说明的是,以上3种方式都是会生成2个bin的。只不过情况1和情况3生成出来的第二个bin,是系统自动做的,用户无感而已。
分别说明:
情况1:如果芯片中只使用mcu不使用cpld:
此时,VE文件里只配置mcu用到的PIN脚即可。
这种情况下,vscode工程中点“upload LOGIC”时,会自动生成默认logic(该logic中“用户逻辑”为空而已),并编译出bin,再烧录,一键完成全过程。(这里的logic可以认为是cpld.bin)
整个过程中,logic部分对开发者来说是无感的。
情况2:如果芯片中同时使用mcu和cpld:
这种开发过程参照 mcu+cpld联合开发 ,这里只简要描述cpld.bin的生成。
这种模式下,VE文件里需要配置 mcu和pin之间、mcu和cpld之间、cpld和pin之间 的信号关联。
然后在VScode下点“prepare LOGIC”按钮,会为开发者生成CPLD的空的框架工程。开发者需要在这个框架下完成cpld逻辑的编写。这个编写调试中,开发者持有主动权。等cpld逻辑全部开发完成,自己编译出bin。这个bin就是“情况1”中自动生成出来的那个bin。
生成cpld.bin以后,烧录就又回到VScode下,仍然是点“upload LOGIC”去烧录。
情况3:如果芯片中只使用cpld不使用mcu:
这种开发过程参照 纯CPLD开发 ,这里也只是简要描述bin的生成。
这种模式下,开发过程是在quartus环境下完成的,首先是生成cpld.bin运行调试。而mcu的bin则是自动生成的。
跟“情况1”刚好相反:cpld.bin是自己调试生成,mcu.bin是系统自动生成。
.
三、两个bin怎么调试和烧录
mcu的调试,在VScode下进行。
cpld的编写,需要使用quartus和supra两个工具。目前cpld的调试,不支持在线工具,可以使用modelsim进行模块级测试。
VScode下的烧录,烧录两个bin,分别使用“Upload”和“Upload LOGIC”两个按钮。
而Supra下烧录cpld,则使用Supra的upload功能。
最后,用于生产时,都是要生成二合一的batch.bin的。用downloader.exe工具来烧录这个bin。
.
四、flash大小与两个bin的烧录位置
关于芯片flash大小:
在AG32系列中,flash大小有两个型号:256K和1M.
flash起始地址从0x80000000开始。flash的可擦写块大小为4K(每次擦写的最小单位为4K,每块的擦写起始是4K对齐)。具体读、写、擦的函数,请参考example工程下的example_flash.c。
整片flash上需要存储基础的两个bin:code.bin和logic.bin(logic.bin就是cpld部分编译后的bin)。其他区域可供用户使用(存储用户信息)。
默认情况下,code.bin存储到0x80000000,logic.bin存储到最后100K。
也就是说,不管所选型号的flash是256K还是1M,最后100K都是留给fpga/cpld使用的。
如果使用的芯片是256K的flash,那么就是156K程序+100K的cpld.bin,即:用户程序不能超过156K。如果超过156K编译是可以通过的,但烧录后会冲掉logic部分。
logic被冲掉后,程序运行会表现出各种异常(通常是系统时钟初始化失败)。
如果程序code.bin的size比较大,cpld.bin又刚好比较小,可以调整这个界限的值。调整方法如下:
board_logic.compress = true //(可选)对cpld.bin部分进行压缩,更省空间。压缩后小于48K。通常程序可能小于30K。
board_upload.logic_address = 0x80034000 //存放cpld.bin的起始点。根据实际情况调整该边界值。
//flash的大小是在agrv2k_103.json 中定义的。
//flash起始地址是0x80000000,ram是0x20000000。
bin的存储与运行:
code.bin和cpld.bin都是存储在flash上的。
运行时,cpld.bin被加载到cpld内核区域运行(注意,这个区域不是芯片的128K的ram区)。code.bin则仍然在flash区域运行。
.
五、其他说明
在使用MCU时,如果不用CPLD部分,是不是CPLD就是多余的?
不是的。
整个芯片的开发,依赖于配置文件.ve。在这个配置文件里,需要用户配置需要使用到的时钟和全部引脚。这里边配置的引脚,就是生成到cpld.bin去的。
这里又引入另一个概念:mcu信号和引脚。这部分内容比较多,详情请参考 引脚配置 。这里只要知道,需要该cpld的参与,mcu的信号才能最终使能到引脚。