目 录
AG32 + FPGA 使用入门手册。
在AG32 芯片(所有型号)中,都有内嵌2KLE 的FPGA/CPLD 逻辑。
也就是说,使用AG32 的芯片时,有三种选择:
如果:
用于1(仅用做MCU),不必关注此文档。
用于2(仅用做CPLD),硬件设计和操作流程,请参考《MANUAL_AGRV2K_3.0.pdf》,或者《AGRV2K Manual入门详细版v3.0》。不必关注此文档。
用于3(MCU 和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。
以上都是精简描述,先有一个整体印象。下边是详细描述。
该部分会对AG32 下使用CPLD 的过程做详细介绍。
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文件,也就是最终的可烧录文件。
这里默认是安装过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 脚。
使用前边安装的Quartus II,打开example\logic 下的工程。
如果是初次使用 Quartus II ,在安装完器件库后,AG32 要选用器件库中里Cyclone IV E 的EP4CE75F23C8 来模拟。(默认打开example\logic 工程后已经是该项了,确认下即可)。
具体步骤:
工程如下,型号默认是EP4CE75F23C8,不用修改。
切换到Files列表:
这里除了example_board.v 和analog_ip.v 外,还有个系统的alta_sim.v,这个文件是提供芯片系统的功能,类似函数库,可不用关注。
此时,这个工程是个空的工程,用户要根据需求在analog_ip.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 。不要修改该文件。
接下来进行空工程的转换和编译。
注意:这里的空工程不能马上添加自己的代码,首先要进行工程转换(参考下个步骤)
工程转换的目的,是把CPLD 模板工程真正转换成quartus 实际运行的状态。
操作步骤:
打开Quartus 的tools->TCL Scripts,如下图所示:
【Run】运行成功后,弹出的2个对话框点OK。可以看到该logic 占用的资源数量。
这个转换的过程,顺便进行了CPLD 工程的编译。
上图中斜杠前边标识的大小就是所占的逻辑单元数(后续使用中逻辑单元不能超过 2K )。
注意:第一次导入工程,必须执行上图的方式来转换。后续编写和修改CPLD 代码后,可以仍然执行上图方式,也可以直接点下图的“编译”按钮来编译。
双击top,也可以打开对应的module了。
执行到这里,会在logic 下生成vo 文件出来(在\logic\simulation\modelsim 下),Quartus工具的任务完成。
接下来打开Supra 来继续生成bin 文件。
在Supra 工具里,打开该工程(example\logic)。
上述窗口点击打开,弹出的小对话框点OK。然后,点击【左上角Tool】-> 【Compile】。
在弹出的画面中点右下角的【run】。
编译成功后,画面会有提示。
Compile design example_board done with code 0
然后在logic 路径下可以看到新编译出来的bin。
这个bin 就是要烧录到芯片的CPLD.bin。
执行到这里, supra 工具的任务就完成了。
烧录需要回到vscode 下烧录。
如果在vscode 下烧录,如下图:
到这里,新建一个空工程、转换、编译、烧录的整个流程描述完毕。
强调:
后续如果在VE 里修改过配置,则需要走一个全过程: vscode 下prepare LOGIC 再生成一遍CPLD 模板、合并analog_ip_tmpl.v 到analog_ip.v 中去、启动quartus 去转换、 supra 下编译,回到vscode 下烧录 logic 。
后续如果只是在quartus 下编写CPLD 代码,需要走的几步: quartus 下编译、 supra 下编译、回到vscode 下烧录 logic 。
上述流程中涉及两个比较关键的点:
自定义的逻辑,自定义文件名必须与自定义模块名相同,就是在platformio.ini 中设置的
ip_name 的名字。
这个对应关系,在上述流程点prepare LOGIC 自动生成代码时,会自动完成。
如果是手工编辑的逻辑代码,或者对这里的命名进行过改动,会出现后续Quartus 中使用的异常。
在AG32 中,mcu 和cpld 和外部引脚,三者是相互独立的。
所以,ve 是很关键的一个桥梁。
在ve 中定义好以后,运行prepare LOGIC 会自动产生cpld 的顶层模块的输入输出接口,
这些接口就是cpld 和mcu 与外部引脚关联的信号通路。
这里着重描述下3 种情况在VE 文件里的定义。
比如,定义gpio 到外部引脚:GPIO4_3 PIN_32
比如,定义串口0 到外部引脚:UART0_UARTRXD PIN_69
定义格式为:MCU的FunctionName + 空格 + PIN脚 ID 。
这部分在mcu 使用里描述的很多了,不再赘述。
比如,定义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 》。
比如,定义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 。
为了避免引脚冲突,VE文件对引脚的配置,我们重新定义如下:
Build成功后:
执行Prepare Logic.
Prepare LOGIC成功后,有【SUCCESS】提示。
接着,在Quartus II打开对应的工程文件:
然后双击Files对应的anlog_ip.v,查看端口的定义:
如果在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文件,就看到新增的端口定义了。
为何在anlog_ip.v中查看端口定义,是因为该文件名称,是在VSCODE里面定义好的。如果要换其他名称,也需要对ip_name的值进行修改。
以上本章节完结。
下个章节,即第二部分,将以样例为基础,描述mcu+cpld在具体使用中怎么体现。
更多回帖