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

浏览: 作者:Rocky 来源:AGM 时间:2025-03-10 分类:FPGA应用

 

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中查看端口定义 

9. 联系信息 


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》。不必关注此文档。

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

2. AG32+CPLD开发基础了解

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

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

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

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

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

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

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

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

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

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

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

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

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

5. 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.

1 

example 样例程序中,默认是没有打开自定义ip 的。

首先,要通过配置打开自定义ip

打开Visual Studio Code软件:

2 

软件界面如下:

1 

打开工作文件夹:

2 

找到example文件夹,选中打开:

5 

备注:当中example_www.hizyuan.com的文件夹不是默认生成的,是后面新建的。是为了保存根据不同的型号配置好参数的exmple用。

打开后的界面如下,在左边栏,没有看到创建logic 框架工程的选项(prepare LOGIC)。

3 

 

platformio.ini 中打开以下两项:

ip_name = analog_ip

logic_dir = logic

注意:这两行去掉注释的时候,前边不要留空格。要顶格写。

具体步骤是将以下的:

7 

更改为:

8 

修改后,点击文件保存。

8_B 

软件界面右下角提示是否覆盖,选择覆盖。

 9

覆盖后,左边窗口会重新刷新,但是也还是没有找到prepare LOGIC

11 

点击Build按钮。

4 

 

Build后有错误提示信息:……example_board.vx拒绝访问

检查发现,是因为刚才修改去掉注释的2行代码,没有顶格,导致编译器识别出错。

(另外,将example文件夹放到下一级的文件夹,比如examplesàexample_hizyuan-àexample,Build也可能出现拒绝访问的错误。)

在本例中,重新将修改的2行代码顶格后,错误就没有了。

14 

 

2行顶格后,点击保存,左边栏就出现Prepare LOGIC了。

5 

 

打开以上两项后,才能在左边栏看到创建logic 框架工程的选项(prepare LOGIC):

点击该功能【Prepare LOGIC】后,

6 

可以看到在example 工程目录下生成一个logic 文件夹,自动生成的文件如下图:

16 

 

这里生成的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. 打开Project文件(CPLD工程)

使用前边安装的Quartus II,打开example\logic 下的工程。

如果是初次使用Quartus II,在安装完器件库后,AG32 要选用器件库中里Cyclone IV E EP4CE75F23C8 来模拟。(默认打开example\logic 工程后已经是该项了,确认下即可)

4.1.1 打开已经生成的project

具体步骤:

17 

 

7 

 

工程如下,型号默认是EP4CE75F23C8,不用修改。

8 

切换到Files列表:

9 

 

10 

这里除了example_board.v analog_ip.v 外,还有个系统的alta_sim.v,这个文件是提供芯片系统的功能,类似函数库,可不用关注。

此时,这个工程是个空的工程,用户要根据需求在analog_ip.v 中实现功能

4.1.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,如下图所示:

11 

 

22 

 

Run】运行成功后,弹出的2个对话框点OK。可以看到该logic 占用的资源数量。

13 

 

这个转换的过程,顺便进行了CPLD 工程的编译。

上图中斜杠前边标识的大小就是所占的逻辑单元数(后续使用中逻辑单元不能超过2K)。

注意:第一次导入工程,必须执行上图的方式来转换。后续编写和修改CPLD 代码后,可以仍然执行上图方式,也可以直接点下图的“编译”按钮来编译。

25 

 

双击top,也可以打开对应的module了。

14 

执行到这里,会在logic 下生成vo 文件出来(在\logic\simulation\modelsim 下),Quartus工具的任务完成。

接下来打开Supra 来继续生成bin 文件。

 

6. Supra 编译

Supra 工具里,打开该工程(example\logic)。

27 

 

15 

上述窗口点击打开,弹出的小对话框点OK。然后,点击【左上角Tool-> Compile】。

29 

在弹出的画面中点右下角的【run】。

30 

编译成功后,画面会有提示。

Compile design example_board done with code 0

31 

然后在logic 路径下可以看到新编译出来的bin

这个bin 就是要烧录到芯片的CPLD.bin

32 

执行到这里,supra 工具的任务就完成了。

 

 

 

 

7. 烧录

烧录需要回到vscode 下烧录。

如果在vscode 下烧录,如下图:

33 

到这里,新建一个空工程、转换、编译、烧录的整个流程描述完毕。

 

强调:

 

后续如果在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 和外部引脚的关联:

16 

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

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

35 

定义格式为:MCUFunctionName + 空格 + PINID

这部分在mcu 使用里描述的很多了,不再赘述。

 

8.2.2 cpld 和外部引脚的关联:

比如,定义led 到外部引脚:LED_D3 PIN_32:OUTPUT

36 

定义格式为:cpld 信号名称 + 空格 + PINID: 方向

其中,

cpld 信号名称,是自定义名称,这个名称随后可以在 cpld 中引用;

方向,有3 种:OUTPUTINPUT INOUT(这个方向是cpld 对外部引脚来说的)

方向是可选的,可加可不加。如果不加,则是默认的 INOUT(双向)。

上述定义在 ve 里添加后,执行 prepare LOGIC 命令,在自动生成的 cpld 工程中,可以看到输出到 cpld 顶层模块接口中的 item 如下:17

那么,

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 信号到cpldGPIO4_1 iocvt_chn

比如,定义串口1 tx 信号到cpldUART1_UARTTXD txd_chn

38 

定义格式为:MCUFunctionName + 空格 + 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 如下:

39 

对于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 的输出:

40 

prepare LOGIC 后生成的item 只有input 的两项。如下:

41 

注意:在mcu cpld 信号连接中,mcu output 就是cpld input

 

8.3 VE配置实操演示补充:

8.3.1 VE配置流程

为了避免引脚冲突,VE文件对引脚的配置,我们重新定义如下:

18 

Build成功后:

20 

 

执行Prepare Logic.

45A 

Prepare LOGIC成功后,有SUCCESS提示。

接着,在Quartus II打开对应的工程文件:

21 

然后双击Files对应的anlog_ip.v,查看端口的定义:

50 

 

8.3.2 意外情况处理办法

如果在anlog_ip.v端口列表看不到新增的端口,我们该如何处理?

47 

 

上述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看到更新后的端口列表。

49 

以下是通过Quartus软件打开anlog_ip_tmpl.v

23 

解决办法:要么把自己改过的代码复制过来,或者把anlog_ip_tmpl.v的接口复制到源文件里。或者把logic目录删了,重新Prepare LOGIC

这里因为是空工程文件,还没有添加自己的设计代码,所以我们关闭Quartus II,然后删除logic文件夹。然后重新点Prepare LOGIC

51 

当状态栏提示 [SUCCESS] 后,软件自动生成新的logic文件夹。

我们重新打开Quartus II工程的anlog_ip.v文件,就看到新增的端口定义了。

52 

 

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

为何在anlog_ip.v中查看端口定义,是因为该文件名称,是在VSCODE里面定义好的。如果要换其他名称,也需要对ip_name的值进行修改。

22 

 

以上本章节完结。

下个章节,第二部分,将以样例为基础,描述mcu+cpld在具体使用中怎么体现。

9. 联系信息

深圳

  址:深圳市宝安区新安街道广兴源互联网智慧科技园D508

  话:+86-139 2466 7001

  真:+86-755-2300 9565

E-mail:  tech@hizyuan.com

 

         杭州

            址:浙江省杭州市钱塘区白杨街道科技园路57号新加坡科技园17

            话:+86-755-2780 9180

          E-mail:   Jane@hizyuan.com

 

         上海

            址:上海市青浦区沪青平公路39381号楼29

            话:+86-755-2780 9180

          E-mail:   Steven@hizyuan.com

 

香港

HIYUAN TECH (HONG KONG) CO., LIMITED

Address: FLAT/RM 704 7/F, BRIGHT WAY TOWER, 33MONG KOK ROAD, MONG KOK, HONG KONG.

TEL:    +852-36458129  /  +86-135 3822 3953         

FAX:    +852-36458092

E-mail:  robin@hizyuan.com

Website: www.hizyuan.com