FPGA|CPLD|ASIC论坛
直播中

AGMsemi

2年用户 23经验值
擅长:可编程逻辑
私信 关注
[经验]

AG32 MCU+CPLD联合使用入门(一)

目 录

1. 文档概述

2. AG32+CPLD开发基础了解

3. CPLD 开发流程

3.1 安装工具软件

3.2 建立CPLD 空工程

4. 打开Project文件(CPLD工程)

4.1.1 打开已经生成的project

4.1.2 自动生成的3个.v文件说明

5. 工程转换

6. Supra 编译

7. 烧录

8. 上述过程中的说明

8.1 自定义模块的命名:

8.2 VE 中定义的信号关联:

8.2.1 mcu 和外部引脚的关联:

8.2.2 cpld 和外部引脚的关联:

8.2.3 mcu 和cpld 之间的信号关联:

8.3 VE配置实操演示补充:

8.3.1 VE配置流程

8.3.2 意外情况处理办法

8.3.3 为何在anlog_ip.v中查看端口定义

1. 文档概述

AG32 + FPGA 使用入门手册。

在AG32 芯片(所有型号)中,都有内嵌2KLE 的FPGA/CPLD 逻辑。

也就是说,使用AG32 的芯片时,有三种选择:

  1. 只使用MCU 部分;
  2. 只使用CPLD 部分;
  3. 同时使用MCU 和CPLD(即:MCU 和CPLD 联合编程);

如果:

用于1(仅用做MCU),不必关注此文档。

用于2(仅用做CPLD),硬件设计和操作流程,请参考《MANUAL_AGRV2K_3.0.pdf》,或者《AGRV2K Manual入门详细版v3.0》。不必关注此文档。

用于3(MCU 和CPLD 联合编程):请按照该文档的描述,先完整走一个流程。

2. AG32+CPLD开发基础了解

  1. AG32 整颗芯片包含两部分: MCU CPLD

这两部分是相互独立的(各自编译、各自下载),但又可以相互连通起来(信号连通)。

芯片要把这两部分的bin 都烧录进去,才能运行起来。

  1. MCU CPLD 到外部PIN 脚的连通,是通过VE文件来配置的。

跟ST 芯片每个GPIO 固定对应某个PIN 脚不同,在AG32 中,所有的GPIO/大部分的外设,

对外引脚并不是定死的。而是需要在VE 文件中指定对应。

VE文件中,除了配置GPIO 到PIN 的关联,还可以配置MCU 到CPLD 之间的信号关联。

  1. MCU+CPLD ** 联合编程时,** **CPLD 工程是由vscode 的“ prepare LOGIC ”命令自动生成的。

注意:联合编程时,CPLD 工程不能手工通过supra 建立。

CPLD 的操作也是依托vscode 工程来的,不再是孤立的。

CPLD 中的top module 的信号输入,是关联到MCU 工程的(由VE 配置出来)。

  1. CPLD 在联合编程中的定位:

整颗芯片运行时,需要两个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”是相同的。

  1. CPLD 开发流程的简要描述:

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 和外部引脚,三者是相互独立的。

  1. mcu **用的 IO ,在ve 里,可以关联到外部引脚 Pin_xx
  2. cpld **用的 IO ,在ve 里,可以关联到外部引脚 pin_xx
  3. mcu 的某一路信号又可以直接和cpld 的某一路信号,在ve 里,关联起来;

所以,ve 是很关键的一个桥梁。

在ve 中定义好以后,运行prepare LOGIC 会自动产生cpld 的顶层模块的输入输出接口,

这些接口就是cpld 和mcu 与外部引脚关联的信号通路。

这里着重描述下3 种情况在VE 文件里的定义。

8.2.1 mcu 和外部引脚的关联:

比如,定义gpio 到外部引脚:GPIO4_3 PIN_32

比如,定义串口0 到外部引脚:UART0_UARTRXD PIN_69

定义格式为:MCUFunctionName + 空格 + 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在具体使用中怎么体现。

更多回帖

发帖
×
20
完善资料,
赚取积分