目 录 1. 文档概述AG32 + FPGA 使用入门手册。 在AG32 芯片(所有型号)中,都有内嵌2KLE 的FPGA/CPLD 逻辑。 也就是说,使用AG32 的芯片时,有三种选择:
如果: 用于1(仅用做MCU),不必关注此文档。 用于2(仅用做CPLD),硬件设计和操作流程,请参考《MANUAL_AGRV2K_3.0.pdf》,或者《AGRV2K Manual入门详细版v3.0》。不必关注此文档。 用于3(MCU 和CPLD 联合编程):请按照该文档的描述,先完整走一个流程。 2. AG32+CPLD开发基础了解
这两部分是相互独立的(各自编译、各自下载),但又可以相互连通起来(信号连通)。 芯片要把这两部分的bin 都烧录进去,才能运行起来。
跟ST 芯片每个GPIO 固定对应某个PIN 脚不同,在AG32 中,所有的GPIO/大部分的外设, 对外引脚并不是定死的。而是需要在VE 文件中指定对应。 VE文件中,除了配置GPIO 到PIN 的关联,还可以配置MCU 到CPLD 之间的信号关联。
注意:联合编程时,CPLD 工程不能手工通过supra 建立。 CPLD 的操作也是依托vscode 工程来的,不再是孤立的。 CPLD 中的top module 的信号输入,是关联到MCU 工程的(由VE 配置出来)。
整颗芯片运行时,需要两个bin:MCU 的bin 和CPLD 的bin。 如果芯片中只使用MCU 不使用 CPLD : 此时,VE 文件里只配置MCU 用到的PIN 脚即可。 这种情况下,vscode 工程中点“upload LOGIC”时,会自动生成默认logic(该logic 中“用户逻辑”为空而已),并编译出bin 并烧录。 整个过程中,logic 部分对开发者来说是无感的。 如果芯片中同时使用MCU 和 CPLD : 那么工程配置是“自定义logic”。 此时VE 文件里需要配置用到的MCU 和pin 之间、MCU 和CPLD 之间、CPLD 和pin 之间,三种情况下的信号关联。 这种情况下,vsode 下点“prepare LOGIC”按钮,会为开发者生成CPLD 的框架工程。开发者需要在这个框架下完成**CPLD **逻辑的编写。这个编写调试中,开发者持有主动权。等全部开发完成,并编译出bin,烧录就又回到VSCODE 去烧录。 这个过程,除了logic 需要用户自己编写编译外,更外层的流程还是跟“默认Logic”是相同的。
A. 在vscode 里定义好VE 配置; B. 在vscode 里使用prepare LOGIC 命令,生成CPLD 的工程框架; C. 用quartus 打开该工程并添加自己的逻辑代码,最后转换工程,生成vo; D. 用supra 打开转换后的工程,编译出bin。 以上都是精简描述,先有一个整体印象。下边是详细描述。 3. CPLD 开发流程该部分会对AG32 下使用CPLD 的过程做详细介绍。 3.1 安装工具软件fpga/CPLD 使用Supra 和 Altera Quartus II 两个软件来编程。 (使用最新版本的Supra软件,可以只使用Supra完成整个流程) 其中: Supra.exe 软件在安装完SDK 后,已经在SDK 路径下了,可直接使用(无需额外安装Supra)。 (注:如果在SDK 路径下没有找到Supra.exe,可进入AgRV_pio\packages\tool-agrv_logic\bin 去打开。同时建议手工新建一个快捷方式到SDK 路径下以方便后续使用) Altera Quartus II 软件需要用户自行安装,安装后再安装对应的器件库。 (注意:Quartus 不能使用Lite 版本,需要使用Full 版本。最好使用版本:Quartus II 64-Bit Version 13.0.1 Build 232 06/12/2013 SJ Full Version) 在这两个软件中, Quartus 工具用来编写Verilog HDL代码并导出 .vo文件的, Supra 工具使用 .vo 文件来生成最终的bin文件,也就是最终的可烧录文件。 3.2 建立CPLD 空工程这里默认是安装过VSCODE 以及MCU 的SDK 开发包的。如果没有安装,请参考《AG32 开发环境搭建.pdf》先搭建MCU 开发环境。 搭建好SDK 环境后,这里以example(路径:...\AgRV_pio\platforms\AgRV\examples\example)为例建立工程。 SDK安装好后,默认会生成以下路径的example. 在example 样例程序中,默认是没有打开自定义ip 的。 首先,要通过配置打开自定义ip: 打开Visual Studio Code软件: 软件界面如下: 打开工作文件夹: 找到example文件夹,选中打开: 备注:当中example_www.hizyuan.com的文件夹不是默认生成的,是后面新建的。是为了保存根据不同的型号配置好参数的exmple用。 打开后的界面如下,在左边栏,没有看到创建logic 框架工程的选项(prepare LOGIC)。 在platformio.ini 中打开以下两项: ip_name = analog_ip logic_dir = logic 注意:这两行去掉注释的时候,前边不要留空格。要顶格写。 具体步骤是将以下的: 更改为: 修改后,点击文件保存。 软件界面右下角提示是否覆盖,选择覆盖。 覆盖后,左边窗口会重新刷新,但是也还是没有找到prepare LOGIC。 点击Build按钮。 Build后有错误提示信息:……example_board.vx拒绝访问。 检查发现,是因为刚才修改去掉注释的2行代码,没有顶格,导致编译器识别出错。 (另外,将example文件夹放到下一级的文件夹,比如examplesàexample_hizyuan-àexample,Build也可能出现拒绝访问的错误。) 在本例中,重新将修改的2行代码顶格后,错误就没有了。 2行顶格后,点击保存,左边栏就出现Prepare LOGIC了。 打开以上两项后,才能在左边栏看到创建logic 框架工程的选项(prepare LOGIC): 点击该功能【Prepare LOGIC】后, 可以看到在example 工程目录下生成一个logic 文件夹,自动生成的文件如下图: 这里生成的logic 文件夹,就是后续编写CPLD的模板。 关于改写文件名: 这里的文件名字,是根据 platformio.ini 里边的配置项来的: board_logic.ve = example_board.ve ip_name = analog_ip logic_dir = logic 如果想改文件名字,可先在 platformio.ini 中更改名字,更改后再点生成按钮来自动生成。可更改的名字,就是上边的三项: board_logic.ve 对应logic 文件夹内example_board.v 的名字 Ip_name 对应logic 文件夹内analog_ip.v 的名字 Logic_dir 对应文件夹logic 的文件夹名字 在生成后的文件夹内,注意其中的两个.v 文件:analog_ip.v 和 example_board.v 。 这两个文件是vlog 的源码文件。 其中: analog_ip.v 是一份空的模板,用户自己要实现的功能,就在这个空模板上展开;这个空的模板里边,主要就是module analog_ip 的接口定义。 example_board.v 是根据工程中example_board.ve 里的pin 配置,Logic prepare 时自动转换出来的v 源码,也是supra 工程的top module。这部分不要手工改动。 到这里,空工程建立完毕。 注意: 后期修改完VE 的配置后,Prepare LOGIC 时,会重新生成CPLD 工程模板,这个模板文件都仍然存到logic文件夹下,且仍然是这两个.v 文件。 只不过 analog_ip.v 对应新增出analog_ip_tmpl.v 文件,而example_board.v 则是直接覆盖。 由于analog_ip.v 是用户程序的入口,用户程序会从这里开始写。这个文件一定是会修改的。所以,每次prepare LOGIC 时,这个文件会对应生成analog_ip_tmpl.v 文件,而不是覆盖。 生成出analog_ip_tmpl.v 后,用户要根据自己的情况,把新接口手动合并到analog_ip.v 去。 注:这里只是以example 来举例。实际应用中,在导出空工程前,需要先配置好platformio.ini的其他项和example_board.ve 所需要的引脚。 建议用户直接在example例程上修改自己的用户代码,避免配置上的错误。 包括:board_logic.device 配置32/48/64/100 脚。 4. 打开P roject文件( CPLD工程)使用前边安装的Quartus II,打开example\logic 下的工程。 如果是初次使用 Quartus II ,在安装完器件库后,AG32 要选用器件库中里Cyclone IV E 的EP4CE75F23C8 来模拟。(默认打开example\logic 工程后已经是该项了,确认下即可)。 4.0.1 打开已经生成的project具体步骤: 工程如下,型号默认是EP4CE75F23C8,不用修改。 切换到Files列表: 这里除了example_board.v 和analog_ip.v 外,还有个系统的alta_sim.v,这个文件是提供芯片系统的功能,类似函数库,可不用关注。 此时,这个工程是个空的工程,用户要根据需求在analog_ip.v 中实现功能。 4.0.2 自动生成的3 个 . v文件说明再次回顾下3 个.v 文件: 1. analog_ip.v :用户自定义logic 的入口。用户logic 实现在这里展开; 2. * example_board.v :整个logic 的 top module 。会关联analog_ip 的module 和atla_sim 下的各 module 。不要修改该文件。 3. alta_sim.v :封装过的跟AG32 *相关的各 module 。不要修改该文件。 接下来进行空工程的转换和编译。 注意:这里的空工程不能马上添加自己的代码,首先要进行工程转换(参考下个步骤) 5. 工程转换工程转换的目的,是把CPLD 模板工程真正转换成quartus 实际运行的状态。 操作步骤: 打开Quartus 的tools->TCL Scripts,如下图所示: 【Run】运行成功后,弹出的2个对话框点OK。可以看到该logic 占用的资源数量。 这个转换的过程,顺便进行了CPLD 工程的编译。 上图中斜杠前边标识的大小就是所占的逻辑单元数(后续使用中逻辑单元不能超过 2K )。 注意:第一次导入工程,必须执行上图的方式来转换。后续编写和修改CPLD 代码后,可以仍然执行上图方式,也可以直接点下图的“编译”按钮来编译。 双击top,也可以打开对应的module了。 执行到这里,会在logic 下生成vo 文件出来(在\logic\simulation\modelsim 下),Quartus工具的任务完成。 接下来打开Supra 来继续生成bin 文件。 6. Supra 编译在Supra 工具里,打开该工程(example\logic)。 上述窗口点击打开,弹出的小对话框点OK。然后,点击【左上角Tool】-> 【Compile】。 在弹出的画面中点右下角的【run】。 编译成功后,画面会有提示。 Compile design example_board done with code 0 然后在logic 路径下可以看到新编译出来的bin。 这个bin 就是要烧录到芯片的CPLD.bin。 执行到这里, supra 工具的任务就完成了。 7. 烧录烧录需要回到vscode 下烧录。 如果在vscode 下烧录,如下图: 到这里,新建一个空工程、转换、编译、烧录的整个流程描述完毕。 强调: 后续如果在VE 里修改过配置,则需要走一个全过程: vscode 下prepare LOGIC 再生成一遍CPLD 模板、合并analog_ip_tmpl.v 到analog_ip.v 中去、启动quartus 去转换、 supra 下编译,回到vscode 下烧录 logic 。 后续如果只是在quartus 下编写CPLD 代码,需要走的几步: quartus 下编译、 supra 下编译、回到vscode 下烧录 logic 。 8. 上述过程中的说明上述流程中涉及两个比较关键的点: 8.1 自定义模块的命名:自定义的逻辑,自定义文件名必须与自定义模块名相同,就是在platformio.ini 中设置的 ip_name 的名字。 这个对应关系,在上述流程点prepare LOGIC 自动生成代码时,会自动完成。 如果是手工编辑的逻辑代码,或者对这里的命名进行过改动,会出现后续Quartus 中使用的异常。 8.2 VE 中定义的信号关联:在AG32 中,mcu 和cpld 和外部引脚,三者是相互独立的。
所以,ve 是很关键的一个桥梁。 在ve 中定义好以后,运行prepare LOGIC 会自动产生cpld 的顶层模块的输入输出接口, 这些接口就是cpld 和mcu 与外部引脚关联的信号通路。 这里着重描述下3 种情况在VE 文件里的定义。 8.2.1 mcu 和外部引脚的关联:比如,定义gpio 到外部引脚:GPIO4_3 PIN_32 比如,定义串口0 到外部引脚:UART0_UARTRXD PIN_69 定义格式为:MCU的FunctionName + 空格 + PIN脚 ID 。 这部分在mcu 使用里描述的很多了,不再赘述。 8.2.2 cpld 和外部引脚的关联:比如,定义led 到外部引脚:LED_D3 PIN_32:OUTPUT 定义格式为:cpld 信号名称 + 空格 + PIN脚ID: 方向 其中, cpld 信号名称,是自定义名称,这个名称随后可以在 cpld 中引用; 方向,有3 种:OUTPUT、INPUT 和INOUT(这个方向是cpld 对外部引脚来说的)。 方向是可选的,可加可不加。如果不加,则是默认的 INOUT(双向)。 上述定义在 ve 里添加后,执行 prepare LOGIC 命令,在自动生成的 cpld 工程中,可以看到输出到 cpld 顶层模块接口中的 item 如下: 那么, input BTN_L1 : 是 pin 到 cpld 的信号; output LED_D2 : 是 cpld 到 pin 的信号; output LED_D3 : 是 cpld 到 pin 的信号; 然后在 cpld 代码中操作 LED_D3 这个信号的高低,最终操作的 PIN_32 管脚的高低。 (注:VE 里每行最后定义的方向是可选的) 这部分的使用,也可以参考样例《 cpld 控制 led 》。 8.2.3 mcu 和cpld 之间的信号关联:比如,定义gpio 信号到cpld:GPIO4_1 iocvt_chn 比如,定义串口1 的tx 信号到cpld:UART1_UARTTXD txd_chn 定义格式为:MCU的FunctionName + 空格 + cpld信号名称 其中, 这里的FunctionName,同1 中的FunctionName,就是mcu 里的通路定义。更多定义参考《AGRV2K_逻辑设置.pdf》,里边有全部的mcu 端可用的FunctionName 列表。 除了mcu 的FunctionName(映射到引脚)外,mcu 对cpld 还开放出更多的内核级通路接口,如:mem_ahb_各通道,dma 各通道,mcu 的reset 和stop 等信号,具体定义也参考《AGRV2K_逻辑设置.pdf》。 而cpld 信号名称,则会在cpld 的顶层模块接口中自动生成,供cpld 中使用。 上述的两条VE 配置,prepare LOGIC 后生成的item 如下: 对于iocvt_chn 来说,是没有指定方向的普通gpio 口,则有输入和输出信号对应。 iocvt_chn_in :对cpld 来说是输出到mcu 的数据信号; iocvt_chn_out_data :对cpld 来说是输入到mcu 的数据信号; iocvt_chn_out_en :对cpld 来说是输入到mcu 的使能信号; 对于txd_chn 来说,由于mcu 的串口TX 是定义好方向的,是mcu 的output 方向。所以在cpld 里只有两个item 项: txd_chn_out_data :对cpld 来说是输出到mcu 的数据信号; txd_chn_out_en :对cpld 来说是输入到mcu 的使能信号; 如果对普通GPIO 也设置了方向,则导出到cpld 的方向也就只有对应方向的信号了。 如:VE 里设置GPIO4_1 iocvt_chn 为mcu 的输出: 则prepare LOGIC 后生成的item 只有input 的两项。如下: 注意:在mcu 和cpld 信号连接中,mcu 的output 就是cpld 的 input 。 8.3 VE配置实操演示补充:8.3.1 VE配置流程为了避免引脚冲突,VE文件对引脚的配置,我们重新定义如下: Build成功后: 执行Prepare Logic. Prepare LOGIC成功后,有【SUCCESS】提示。 接着,在Quartus II打开对应的工程文件: 然后双击Files对应的anlog_ip.v,查看端口的定义: 8.3.2 意外情况处理办法如果在anlog_ip.v的端口列表看不到新增的端口,我们该如何处理? 上述anlog_ip.v的端口的定义,没有看到新定义的以下端口: LED_D2 PIN_15:OUTPUT LED_D3 PIN_16:OUTPUT BTN_L1 PIN_17:INPUT GPIO4_1 iocvt_chn UART1_UARTTXD txd_chn 造成的原因: 上述INPUT/OUTPUT端口是后面加的,原来有的anlog_ip.v文件不会被覆盖(否则会冲掉用户代码),所以端口信息没有更新。我们可以从logic文件夹下的[]()anlog_ip_tmpl.v看到更新后的端口列表。 以下是通过Quartus软件打开anlog_ip_tmpl.v。 解决办法:要么把自己改过的代码复制过来,或者把anlog_ip_tmpl.v的接口复制到源文件里。或者把logic目录删了,重新Prepare LOGIC。 这里因为是空工程文件,还没有添加自己的设计代码,所以我们关闭Quartus II,然后删除logic文件夹。然后重新点Prepare LOGIC。 当状态栏提示 [SUCCESS] 后,软件自动生成新的logic文件夹。 我们重新打开Quartus II工程的anlog_ip.v文件,就看到新增的端口定义了。 8.3.3 为何在anlog_ip.v中查看端口定义为何在anlog_ip.v中查看端口定义,是因为该文件名称,是在VSCODE里面定义好的。如果要换其他名称,也需要对ip_name的值进行修改。 以上本章节完结。 下个章节,即第二部分,将以样例为基础,描述mcu+cpld在具体使用中怎么体现。 |
555 浏览 0 评论
675 浏览 0 评论
516 浏览 0 评论
AG32软件包SDK更新:加入新例程(可实现至少15个UART串口)
1201 浏览 0 评论
从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析
2579 浏览 0 评论
6541 浏览 114 评论
2643 浏览 58 评论