AG32 MCU+CPLD 联合编程(概念及流程)

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

目录

一、前述

二、基础了解

三、安装软件

四、CPLD使用流程

  1.在VE里定义引脚和信号关系

  2.生成空的CPLD工程

  3. Quartus下进行工程转换

  4.Supra下编译出最终的bin

五、上述过程中的说明

  1. 自定义模块的命名

  2. Ve中定义的信号关联

    A. MCU和外部引脚的关联

    B. CPLD和外部引脚的关联

    C. MCU和CPLD之间的关联


前言:


AGM是AG32 MCU, 可编程SoC和异构MCU的解决方案提供商, 海振远科技可提供全系列的开发板及SDK资料,方便用户从0开始,快速上手开发。

AGM AG32 MCU和FPGA 目前广泛应用于工业,消费,测试测量和医疗等场景。

AG32内置的FPGA( AGRV2K) 可升级替代EP570, EPM1270, LATTICE XO2-256,XO2-640, XO2-1200 等。

AG32 的管脚可以灵活定义,引脚与STM32。并且内置2KLE FPGA, 非常适合MCU + FPGA/CPLD的应用场景。


在使用MCU+CPLD联合编程之前,请确认已经熟练掌握MCU的使用方法,并且对CPLD编程(verilog语言)有一定的基础。

另外,对AHB总线也需要有一定的了解。

这个章节分为两部分:

第一部分,展示联合编程中各种概念和操作流程;

第二部分,从具体案例出发,由浅到深来描述各种常用的编程技巧。

一、前述

在AG32芯片(所有型号)中,都有内嵌2K的逻辑门,可供FPGA/CPLD来使用。

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

  1. 只使用MCU部分;

  2. 只使用CPLD部分;

  3. 同时使用MCUCPLD(即:MCUCPLD联合编程);

如果:

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

用于2(仅用做CPLD),硬件设计和操作流程,也不必关注此文档。

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

.

二、基础了解

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

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

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

2. MCUCPLD到外部Pin脚的连通,是通过VE文件来配置的。

  跟ST芯片每个Gpio对应某个固定Pin脚不同,在AG32中,所有的Gpio/大部分的外设,对外引脚并不是定死的。而是需要在VE文件中指定对应。

  VE中,除了配置Gpio到Pin的关联,还可以配置MCUCPLD之间的信号关联。

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

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

  CPLD的对外接口,也是依托于vscode工程来的,不再是孤立的。

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

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

  整颗芯片运行时,需要两个bin:MCU的bin和CPLD的bin。

  如果芯片中只使用MCU不使用CPLD:

  此时,VE文件里只配置MCU用到的Pin脚即可。

  这种情况下,vscode工程中点“upload LOGIC”时,会自动生成默认logic(该logic中“用户逻辑”为空而已),并编译出bin并烧录。

  整个过程中,logic部分对开发者来说是无感的。

   如果芯片中同时使用MCU和CPLD:

  那么要把工程配置成“自定义logic”。

  此时VE文件里需要配置用到的MCU和PIN之间、MCUCPLD之间、CPLD和PIN之间,三种情况下的信号关联。

  这种情况下,VSCode下点“prepare LOGIC”按钮,会为开发者生成CPLD的框架工程。开发者需要在这个框架下完成CPLD逻辑的编写。这个编写调试中,开发者持有主动权。等全部开发完成,并编译出BIN,烧录就又回到VSCode去烧录。

这个过程,除了logic需要用户自己编写编译外,从更外层的视角看,整个流程还是跟“默认Logic”是相同的。

.

三、安装软件

MCU需要使用到的VSCode前边已经安装过了。

FPGA/CPLD需要使用Supra和Altera Quartus II两个软件来编程。

其中:

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工具用来编写vlog代码并导出vo文件,Supra工具使用vo文件来生成最终的bin。

.

四、CPLD使用流程

从使用角度来说,整体需要4个步骤:

  • 1.在VE文件里配置引脚关系;

  • 2.建立CPLD空工程(使用prepare LOGIC命令)并编写逻辑;

  • 3.Quartus下进行工程转换(和综合);

  • 4.Supra下编译出最终的logic.bin;

下边进入详细描述。

1.在VE里定义引脚和信号关系

这部分和MCU使用是相仿的。

MCU里,都是MCU信号直接到PIN脚的映射。比如:


1


那么,在使用CPLD里,除了上述的“MCU信号到PIN脚”关联外,还允许“MCU信号到CPLD信号”和“CPLD信号到PIN脚”的两种关联。这里描述的三种关联,是常见的三种信号关联方式。详细使用方法,后续会介绍。

这里需要知道的是,每次VE文件修改完以后,都要重新走一遍整个流程(从prepare LOGIC开始)。

其实不光修改完VE需要重新走一遍流程,有时修改platformio.ini也需要重新走一遍流程(比如,修改管脚数量)。

如果是第一次试验example例程,可以不用修改,使用默认的VE文件即可。

2.生成空的cpld工程

仍然以example(路径:...\AgRV_pio\platforms\AgRV\examples\example)为例建立工程。

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

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

方法:在platformio.ini中打开以下两项:

ip_name = analog_ip

logic_dir = logic

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

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


2_conew1


点击该功能【Prepare LOGIC】后,可以看到在example工程目录下生成一个logic文件夹,自动生成的文件如下图:


3_conew1


这里生成的logic文件夹,就是空的CPLD工程。也是后续编写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.vexample_board.v

 

这两个文件是vlog的源码文件。

 

其中:

 

analog_ip.v是一份空的模板,用户自己要实现的功能,就在这个空模板上展开;这个空的模板里边,主要就是module analog_ip的接口定义。

 

example_board.v是根据工程中example_board.ve里的pin配置,Logic prepare时自动转换出来的v源码,也是supra工程的top module。这部分不要手工改动。

到这里,CPLD空工程建立完毕。

注意:

后期修改完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所需要的引脚。包括:board_logic.device配置32/48/64/100脚。

也就是第一步要做的内容。

3. Quartus下进行工程转换

使用前边安装过的Quartus II软件,打开\example\logic\的工程文件。打开后如图:


4_conew1


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

 

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

 

再次回顾下3.v文件:

 

1、analog_ip.v:用户自定义logic的入口。用户logic实现在这里展开;

 

2、example_board.v:整个logictop module。会关联analog_ipmoduleatla_sim下的各module。不要修改该文件。

 

3、alta_sim.v:封装过的跟AG32相关的各module。不要修改该文件。

 

接下来进行空工程的转换和编译。


注意:如果不是很熟练,这里的空工程最好不要马上添加自己的代码。而是应该首先工程转换。

工程转换的目的,是把CPLD模板工程真正转换成quartus实际运行的状态。

 

操作步骤:

 

打开Quartus菜单的【tools->Tcl Scripts...】,弹出框如下图:


5_conew1


【Run】运行成功后,可以看到该logic占用的资源数量。


6_conew1


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

 

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

 

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


7_conew1


执行到这里,会在logic下生成vo文件出来(在\logic\simulation\modelsim下)。

 

如果用户有自己的逻辑,可以在这时,把逻辑加入到analog_ip.v中去,并点上图的三角号重新编译。

 

到这里,Quartus工具的任务也完成了。

 

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


4.Supra下编译出最终的bin

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

 

然后,点击【左上角Tool->Compile】,在弹出的画面中点右下角的【run】。


8_conew1


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

 

Compile design example_board done with code 0

 

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

 

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

 

到这里,supra工具的任务完成。

 

至于烧录,重新回到VSCode下烧录logic即可。如下图:


9_conew1


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

 

强调:

 

后续如果在VE里修改过配置,则需要走一个全过程:vscodeprepare LOGIC再生成一遍CPLD模板、合并analog_ip_tmpl.vanalog_ip.v中去、启动quartus去转换、supra下编译,回到vscode下烧录logic

 

后续如果只是在quartus下编写CPLD代码,需要走的几步:quartus下编译、supra下编译、回到vscode下烧录logic


五、上述过程中的说明

上述流程中涉及两个比较关键的点:


1. 自定义模块的命名

自定义的逻辑,自定义文件名必须与自定义模块名相同,就是在platformio.ini中设置的ip_name的名字。

 

这个对应关系,在上述流程点prepare LOGIC自动生成代码时,会自动完成。

 

如果是手工编辑的逻辑代码,或者对这里的命名进行过改动,会出现后续Quartus中使用的异常。


2. Ve中定义的信号关联

AG32中,MCUcpld和外部引脚,三者是相互独立的。

 

MCU用的IO,在ve里,可以关联到外部引脚Pin_xx

 

CPLD用的IO,在ve里,可以关联到外部引脚pin_xx

 

MCU的某一路信号又可以直接和CPLD的某一路信号,在ve里,关联起来;

 

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

 

ve中定义好以后,运行prepare LOGIC会自动产生cpld的顶层模块的输入输出接口,这些接口就是CPLDMCU与外部引脚关联的信号通路。

 

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


A. MCU和外部引脚的关联

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

 

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


10_conew1


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

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


B. cpld和外部引脚的关联

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


11_conew1


定义格式为:CPLD信号名称 + 空格 + PIN脚ID:方向
其中,
CPLD 信号名称,是自定义名称,这个名称随后可以在 CPLD 中引用;
方向,有 3 种:OUTPUT、INPUT 和 INOUT(这个方向是 CPLD 对外部引脚来说的)。
方向是可选的,可加可不加。如果不加,则是默认的 INOUT(双向)。
上述定义在 ve 里添加后,执行 prepare LOGIC 命令,在自动生成的 CPLD 工程中,可以看到输出到 CPLD 顶层模块接口中的 item 如下:


12_conew1


那么,

input BTN_L1: PIN CPLD 的信号;

output LED_D2: CPLD PIN 的信号;

output LED_D3: CPLD PIN 的信号;

然后在 CPLD 代码中操作 LED_D3 这个信号的高低,最终操作的 PIN_32 管脚的高低。

(注:VE 里每行最后定义的方向是可选的)

 

C. mcu和cpld之间的关联

比如,定义 gpio 信号到 CPLDGPIO4_1 iocvt_chn

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


13_conew1


定义格式为:MCU的FunctionName + 空格 + CPLD信号名称
其中,
这里的 FunctionName,同 1 中的 FunctionName,就是 MCU 里的通路定义。更多定义参考《AGRV2K_逻辑设置.pdf》,里边有全部的 MCU 端可用的 FunctionName 列表。
除了 MCU 的 FunctionName(映射到引脚)外,MCU 对 CPLD 还开放出更多的内核级通路接口,如:mem_ahb_各通道,dma 各通道,MCU 的 reset 和 stop 等信号,具体定义也参考《AGRV2K_逻辑设置.pdf》。
这里定义后,执行 prepare LOGIC 命令,在自动生成的 CPLD 工程中,可以看到输出到CPLD顶层模块接口的 item 如下:


14_conew1


对于 iocvt_chn 来说,对应的是没有指定方向的普通 gpioGPIO4_3)口,则这里生成的信号同时包含有输入和输出两种。

注:这里的输入和输出,是相对于 CPLD 端来说的。蓝色的 input/output,就是该信号的方向。比如:

output iocvt_chn_in:是 CPLD 输出到 MCU 的信号;

input iocvt_chn_out_data:是 MCU 输出到 CPLD 的信号;

input iocvt_chn_out_en:是 MCU 输出到 CPLD 的信号(en 信号很少用,一般可忽略);

 

对于 txd_chn 来说,由于 MCU 的串口 TX 是定义好方向的,是 MCU output 方向。所以在 CPLD 里只有两个 item 项:

input txd_chn_out_data:是 MCU 输出到 CPLD 的信号;

input txd_chn_out_en:是 MCU 输出到 CPLD 的信号(en 信号很少用,一般可忽略);

 

如果对普通 GPIO 也设置了方向,则导出到 CPLD 的方向也就只有对应方向的信号了。

如:VE 里设置 GPIO4_1 iocvt_chn mcu 的输出:


15_conew1


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


16_conew1


注意:在MCUCPLD信号连接中,MCUoutput就是CPLDinput

 

到这里,第一部分(MCU+CPLD使用的概念和流程)描述完毕。


AG32概述:

AG32系列32位微控制器旨在为MCU用户提供新的自由度和丰富的兼容外设以及兼容的引脚和功能。AG32VF407产品系列提供卓越的品质、稳定性和非凡的价值。

器件特征:

■ 最大 CPU 速度为 248 MHZ

■ 从 Flash 执行零等待

■ SRAM 128KB.FLASH 1MB

■ 支持浮点

■ 1个CAN2.0.5个UART2个I2C

■ 2 个基本定时器,5 个高级定时器

■ 支持 SDIO 、以太网 MAC

■ 支持 USB FS+OTG

■ 看门狗

■ 3个 12 位、最高 3M SPS ADC(17 通道)、2个 DAC

■ 2x 比较器

■ RTC, SPI

■ 内置2KLE FPGA逻辑单元


联系海振远科技

电话:0755-2780 9180;  15323895320;

邮箱: tech@hizyuan.com

Lucy@hizyuan.com