AG RV2K逻辑设置

6 min read CPLD

AG RV2K逻辑设置

 

 

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功能

这篇文档有帮助吗?