
1.器件配置
platformio.ini为PlatformIO的⼯程⽂件,所有⼯程设置均可以在这个⽂件中进⾏修改。
根据所使⽤器件修改board_logic.device, 缺省为100 PIN的AGRV2KL100 。如果使⽤的是64或48PIN的器件, 需要修改为AGRV2KL64或AGRV2KL48。
逻辑配置⽂件⼤⼩固定为100KB 。⽀持压缩功能,压缩之后的⽂件⼤⼩与设计有关,但⼀般不会超过40KB 。可以通过设置board_logic.compress = true来打开压缩, 默认为false 。逻辑配置⽂件默认占⽤内部flash的最后部分, 可以通过board_upload.logic_address来改变。
2.引脚设置

通过逻辑改变引脚定义 :在platformio.ini中加⼊:
board_logic.ve = my_board.ve
将指定的ve⽂件放在platformio.ini同⼀⽬录下,然后点击PROJECT TASKS下的Upload
LOGIC 。VE⽂件格式为每个引脚⼀⾏ ,每⾏由Function_Pin和Device_Pin组成, 可参考
AgRV_pio\platforms\AgRV\boards\agrv2k_103\board.ve。Device_Pin 由封装决定, ⼀般为PIN_xx的形式 。指定的VE⽂件名称可以是相对路径(基于当前项⽬⽬录, 亦即platformio.ini⽂件所在⽬录) 或绝对路径。
Function_Pin 列表:
SYSCLKSystem clock frequency (MHz)Required
HSECLKHSE oscillator frequency (MHz)Default:8
BUSCLKAHB bus clock frequency (MHz)Optional, must be divided from SYSCLK
USB0USB mode, must be host, device, or OTGOptional
USB0_ID
USB external ID pin
USB mode is OTG if this pin is defined
EXT_INT0External Interrupt 0
EXT_INT1
EXT_INT2
EXT_INT3
EXT_INT4
EXT_INT5
EXT_INT6
EXT_INT7External Interrupt 7
MAC0_CLK_OUTMAC output clock pinCan be used to drive MAC PHY
GPIO0_0SPI0_SI_IO0(INOUT)
GPIO0_ 1SPI0_SO_IO 1(INOUT)
GPIO0_2SPI0_WPN_IO2(INOUT)
GPIO0_3SPI0_HOLDN_IO3(INOUT)
GPIO0_4SPI1_SI_IO0(INOUT)
GPIO0_5SPI1_SO_IO 1(INOUT)
GPIO0_6SPI1_WPN_IO2(INOUT)
GPIO0_7SPI1_HOLDN_IO3(INOUT)
GPIO 1_0GPTIMER0_CH0(INOUT)
GPIO 1_ 1GPTIMER0_CH1(INOUT)
GPIO 1_2GPTIMER0_CH2(INOUT)
GPIO 1_3GPTIMER0_CH3(INOUT)
GPIO 1_4GPTIMER1_CH0(INOUT)
GPIO 1_5GPTIMER1_CH1(INOUT)
GPIO 1_6GPTIMER1_CH2(INOUT)
GPIO 1_7GPTIMER1_CH3(INOUT)
GPIO2_0GPTIMER2_CH0(INOUT)
GPIO2_ 1GPTIMER2_CH1(INOUT)
GPIO2_2GPTIMER2_CH2(INOUT)
GPIO2_3GPTIMER2_CH3(INOUT)
GPIO2_4GPTIMER3_CH0(INOUT)
GPIO2_5GPTIMER3_CH1(INOUT)
GPIO2_6GPTIMER3_CH2(INOUT)
GPIO2 7GPTIMER3 CH3(INOUT)
GPIO3_0GPTIMER4_CH0(INOUT)
GPIO3_1GPTIMER4_CH1(INOUT)
GPIO3_2GPTIMER4_CH2(INOUT)
GPIO3_3GPTIMER4_CH3(INOUT)
GPIO3_4I2C0_SCL(INOUT)
GPIO3_5I2C0_SDA(INOUT)
GPIO3_6I2C1_SCL(INOUT)
GPIO3_7I2C1_SDA(INOUT)
GPIO4_0MAC0_MDIO(INOUT)
GPIO4_1GPTIMER0_BRK(INPUT)
GPIO4_2GPTIMER0_ETR(INPUT)
GPIO4_3GPTIMER0_OCREF_CLR(INPUT)
GPIO4_4GPTIMER1_BRK(INPUT)
GPIO4_5GPTIMER1_ETR(INPUT)SPI0_SCK(OUTPUT)
GPIO4_6GPTIMER1_OCREF_CLR(INPUT)SPI0_CSN(OUTPUT)
GPIO4_7GPTIMER2_BRK(INPUT)SPI1_SCK(OUTPUT)
GPIO5_0GPTIMER2_ETR(INPUT)SPI1_CSN(OUTPUT)
GPIO5_1GPTIMER2_OCREF_CLR(INPUT)GPTIMER0_CHN0(OUTPUT)
GPIO5_2GPTIMER3_BRK(INPUT)GPTIMER0_CHN1(OUTPUT)
GPIO5_3GPTIMER3_ETR(INPUT)GPTIMER0_CHN2(OUTPUT)
GPIO5_4GPTIMER3_OCREF_CLR(INPUT)GPTIMER0_CHN3(OUTPUT)
GPIO5_5GPTIMER4_BRK(INPUT)GPTIMER1_CHN0(OUTPUT)
GPIO5_6GPTIMER4_ETR(INPUT)GPTIMER1_CHN1(OUTPUT)
GPIO5_7GPTIMER4_OCREF_CLR(INPUT)GPTIMER1_CHN2(OUTPUT)
GPIO6_0UART0_NUARTCTS(INPUT)GPTIMER1_CHN3(OUTPUT)
GPIO6_1UART0_UARTRXD(INPUT)GPTIMER2_CHN0(OUTPUT)
GPIO6_2UART1_NUARTCTS(INPUT)GPTIMER2_CHN1(OUTPUT)
GPIO6_3UART1_UARTRXD(INPUT)GPTIMER2_CHN2(OUTPUT)
GPIO6_4UART2_NUARTCTS(INPUT)GPTIMER2_CHN3(OUTPUT)
GPIO6_5UART2_UARTRXD(INPUT)GPTIMER3_CHN0(OUTPUT)
GPIO6_6UART3_NUARTCTS(INPUT)GPTIMER3_CHN1(OUTPUT)
GPIO6_7UART3_UARTRXD(INPUT)GPTIMER3_CHN2(OUTPUT)
GPIO7_0UART4_NUARTCTS(INPUT)GPTIMER3_CHN3(OUTPUT)
GPIO7_1UART4_UARTRXD(INPUT)GPTIMER4_CHN0(OUTPUT)
GPIO7_2CAN0_INT_IN(INPUT)GPTIMER4_CHN1(OUTPUT)
GPIO7_3CAN0_RX0(INPUT)GPTIMER4_CHN2(OUTPUT)
GPIO7_4MAC0_PHY_INTB(INPUT)GPTIMER4_CHN3(OUTPUT)
GPIO7_5MAC0_TX_CLK(INPUT)UART0_NUARTRTS(OUTPUT)
GPIO7_6MAC0_RX_CLK(INPUT)UART0_UARTTXD(OUTPUT)
GPIO7_7MAC0_RXD0(INPUT)UART1_NUARTRTS(OUTPUT)
GPIO8_0MAC0_RXD1(INPUT)UART1_UARTTXD(OUTPUT)
GPIO8_ 1MAC0_RXD2(INPUT)UART2_NUARTRTS(OUTPUT)
GPIO8_2MAC0_RXD3(INPUT)UART2_UARTTXD(OUTPUT)
GPIO8_3MAC0_RX_DV(INPUT)UART3_NUARTRTS(OUTPUT)
GPIO8_4MAC0_RX_ER(INPUT)UART3_UARTTXD(OUTPUT)
GPIO8_5MAC0_CRS(INPUT)UART4_NUARTRTS(OUTPUT)
GPIO8_6MAC0_COL(INPUT)UART4_UARTTXD(OUTPUT)
GPIO8_7CAN0_TX0(OUTPUT)
GPIO9_0
GPIO9_ 1MAC0_TXD0(OUTPUT)
GPIO9_2MAC0_TXD1(OUTPUT)
GPIO9_3MAC0_TXD2(OUTPUT)
GPIO9_4MAC0_TXD3(OUTPUT)
GPIO9_5MAC0_TX_EN(OUTPUT)
GPIO9_6MAC0_TX_ER(OUTPUT)
GPIO9_7MAC0_MDC(OUTPUT)
PIN_HSE_OUTHSE clock outputCan drive any logic
PLL_CLKINPLL input clockUse HSE clock if not specified
PLL_LOCKPLL lock (OUTPUT)
PLL_CLKOUT0 …
PLL_CLKOUT4
PLL output clock 0-4
Can drive any logic
PLLINCLKFrequency for PLL input clock (MHz)Use HSE frequency if not specified
PLLCLK1Frequency for PLL clock 1 (MHz)Fixed to 60MHz if USB0 is used
PLLCLK2Frequency for PLL clock 2 (MHz)Fixed to 25/50MHz if MAC0 is used
PLLCLK3Frequency for PLL clock 3 (MHz)
PLLCLK4Frequency for PLL clock 4 (MHz)
PLLCLK0_PHASE …
PLLCLK4_PHASE
PLL output clock phase 0-4
In Degrees
每一行的GPIO和外设引脚同一时间只能使用一个, 可以在程序中使用
GPIO_AF_ENABLE(MAC0_MDC) 或 GPIO_AF_DISABLE(MAC0_MDC) 来打开或关闭外设 。同一行的输入和输出外设引脚可以同时使用 ,例如UART1_UARTRXD可以和GPTIMER2_CHN2同时使用 ,但使用了二者任意一个均不可使用GPIO6_3。
每个引脚的其他设置可以通过在platformio.ini中指定board_logic.asf来实现:
board_logic.asf = my_board.asf
在指定的asf文件中加入具体设置:
# 将指定的PIN设为弱上拉(缺省为OFF)
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to PIN_1
# 打开Slew Rate(缺省为0)
set_instance_assignment -name SLEW_RATE 1 -to PIN_68
# 设置驱动强度(缺省为8MA,支持4MA/8MA/12MA/16MA)
set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to PIN_1
# 打开Bus Hold(缺省为OFF)
set_instance_assignment -name ENABLE_BUS_HOLD_CIRCUITRY ON -to PIN_1
3.预定义IP

在platformio.ini中加入 :ip_name,然后同上点击Upload LOGIC 。预定义逻辑不能与自定义逻辑同时使用 。
4. 自定义IP
在platformio.ini中加入logic_dir和ip_name 。logic_dir是存放自定义逻辑的子目录, 如果该目录不存在将自动创建 。ip_name为自定逻辑的模块名称, 不能与预定义IP同时使用 。然后点击
PROJECT TASKS下的Prepare LOGIC, 工具将在指定的目录下产生一个Supra工程, 工程文件以上图为例是 .\logic\agrv2k_103.proj 。Supra软件可以通过AgRV_pio目录下的快捷方式
Supra.exe启动,在软件中打开这个工程文件并选择 Tools -> Compile, 详细使用请参见Supra的使用手册 。在Supra工具成功编译完成之后, 再点击Upload LOGIC更新逻辑配置 。以上图为例, 逻辑配置文件将产生于 .\logic\agrv2k_103.bin 。例程可参考
AgRV_pio\platforms\AgRV\examples\analog。
自定义逻辑的ve文件中除上述 “Function_Pin Device_Pin” 的引脚设置外, 还可以加入另外两种引脚设置:
1. 与自定义逻辑连接的顶层管脚,格式为 :”Name Device_Pin:DIR”, DIR可以是INPUT,
OUTPUT, 或者INOUT 。工具将把一个指定方向的管脚加入自定义逻辑, 并连接到对应的芯片顶层管脚。
2. 与自定义逻辑连接的某个MCU功能,格式为 :”Function_Pin Name” 。根据Function_Pin的方向, 工具将自动在Name后面加入后缀 _in (用于驱动Function_Pin输入), 以及
_out_data/_out_en (用于接收Function_Pin的输出数据和使能) 作为自定义逻辑的管脚。
ve文件配置自定义逻辑模块信号
Name Device_Pin:INPUTinput Name
Name Device_Pin:OUTPUToutput Name
Name Device_Pin:INOUTinout Name
Function_Pin Nameoutput Name_in当Function_Pin为INPUT
input Name_out_data
input Name_out_en当Function_Pin为OUTPUT
output Name_in
input Name_out_data
input Name_out_en当Function_Pin为INOUT
自动创建的Supra工程缺省将包含两个Verilog文件, 分别对应芯片顶层和自定义逻辑模块。以上面为例名称分别是agrv2k_103.v和custom_ip.v 。其中芯片顶层文件agrv2k_103.v每次运行Prepare LOGIC的时候都会根据ve文件自动生成覆盖, 请勿手工修改 。 自定义逻辑模块文件
custom_ip.v则不会被覆盖, 如果已经存在,新生成的文件将被命名为custom_ip_tmpl.v 。生成的文件中包含根据ve文件生成的所有自定义逻辑模块管脚。
例如一个下面的ve配置:
txd_top PIN_67:OUTPUT
rxd_top PIN_66:INPUT UART4_UARTTXD txd_ip UART4_UARTRXD rxd_ip
将生成如下的自动逻辑模块:
input txd_ip_out_en
除根据ve⽂件⽣成的管脚外, ⾃定义模块中还包含以下信号与MCU连接:
信号⽅向
sys_clockinputMCU system clock
bus_clockinputOptional clock defined in ve. Same as sys_clock if undefined.
resetninputSystem reset, active low
stopinputMCU has entered stop mode, active high
mem_ahb_*MCU as masterAHB bus controlled by MCU.
Address range: 0x60000000 – 0x7FFFFFFF
slave_ahb_*MCU as slaveAHB bus controlled by logic. Can access all valid address.
ext_dma_*DMAC as controller4 external DMA request signals, defined as EXT_DMA0_REQ – EXT_DMA3_REQ in SDK. Detailed waveform can be found in DMAC document.
local_int[3:0]output4 local interrupt signals, defined as LOCAL_INT0_IRQn –
LOCAL_INT3_IRQn in SDK. Can be enabled with SDK function INT_EnableIntLocal().
5.可移植IP

上述的⾃定义IP可以被转化成可移植IP,供其他AGRV2K⼯程使⽤ 。在platformio.ini中除logic_dir和ip_name外, 再加⼊logic_ip:
logic_ip = true
然后点击PROJECT TASKS下的Prepare IP, ⼯具将在指定的⽬录下产⽣类似⾃定义IP的 Supra⼯程 。这个⼯程的顶层模块即是⾃定义逻辑的顶层, 不包括芯⽚顶层 。⼀切设置, 包括时序约束,都应当基于⾃定义逻辑的顶层 。使⽤Supra编译好之后, 可移植IP的⽬录位于指定的
logic_dir\ip_name下 。以上图为例, ⼯程的顶层模块是custom_ip.v, 可移植IP的⽬录是logic\custom_ip 。例程可参考AgRV_pio\platforms\AgRV\examples\custom_ip。
使用可移植IP的时, 把上面生成的custom_ip目录放在任意目录下,例如my_ips 。然后在platformio.ini中加入ips_dir来指定这个目录(如果在同一个工程中使用可以跳过这一步):
ips_dir = my_ips # 注意这里不是custom_ip目录,而是它的上一级
点击PROJECT TASKS下的Update LOGIC, 即可生成以及下载基于可移植IP的逻辑配置。这里使用的ve文件与生成可移植IP时使用的ve文件相比 ,必须满足如下条件:
● 由 “Function_Pin Device_Pin” 定义的管脚可以随意改变,也可以增减, 因为它们与IP没有连接关系
● 由 “Name Device_Pin:DIR” 和 “Function_Pin Name” 定义的管脚, Name不得改变,
Device_Pin以及Function_Pin则可以改变,也就是说同一个IP管脚可以在使用的时候映射到不同的顶层管脚或是MCU功能