环境
- Quartus 13.0(Quartus 不能使用Lite 版本,需要使用Full 版本)
- AGM SDK
- Supra(快捷方式在SDK目录下,具体路径为
AgRV_pio\packages\tool-agrv_logic\bin
)
FPGA编程
在AG32芯片中,拥有异构双核(RISC-V+FPGA)处理器,包含2K逻辑单元。两者可以同时使用并进行交互,但是FPGA通常是作为MCU的一个外设设备来使用。
简要概述
如果芯片中同时使用mcu 和cpld,cpld的开发流程的简要描述:
- 在VE 文件里配置用到的mcu 和pin 之间、mcu 和cpld 之间、cpld 和pin 之间的信号关联。
- 在VS code中点击"prepare LOGIC"按钮,生成cpld 的框架工程。
- 用quartus 打开该工程并添加自己的逻辑代码,最后转换工程,生成vo;
- 用supra 打开转换后的工程,编译出bin,最后回到VS code进行烧录。
fpga使用具体步骤
1. VE文件修改
在AG32 中,mcu 和cpld 和外部引脚,三者是相互独立的。
- mcu 用的IO,在ve 里,可以关联到外部引脚Pin_xx。
- cpld 用的IO,在ve 里,可以关联到外部引脚pin_xx。
- mcu 的某一路信号又可以直接和cpld 的某一路信号,在ve 里,关联起来。
在ve 中定义好以后,运行prepare LOGIC 会自动产生cpld 的顶层模块的输入输出接口,这些接口就是cpld 和mcu 与外部引脚关联的信号通路。
引脚关联格式
-
MCU:
-
CPLD:这里的方向是CPLD对外部引脚而言,共有OUTPUT、INPUT和INOUT三种格式,SIGNAL则会在生成LOGIC工程时自动添加到顶级逻辑模块中。
-
MCU<->CPLD:其中的FunctionName为mcu 端可用的FunctionName,详细定义可参考《AGRV2K_逻辑设置.pdf》;direction可以省略,为MCU对CPLD而言,如果省略则分别会生成输入和输出信号。
如果cpld 里想用信号量数组,并使每个元素对应到不同PIN,可以在ve 里定义如下:
mcu_a[0] PIN_31
mcu_a[1] PIN_32
mcu_a[2] PIN_33
mcu_a[3] PIN_34
2. cpld工程创建
首先,需要在platformio.ini 中添加如下两行,打开自定义ip:
ip_name = analog_ip
logic_dir = logic
其中ip_name就是之后生成自定义verilog文件的文件名,设置过后不可随意更改;而生成工程的顶层文件名则与logic_ve的名称相同。
之后在VS code中点击Prepare LOGIC
后,可以看到在当前工程目录下生成一个logic 文件夹,里面存放的就是fpga部分的工程代码。
其中需要注意的两个verilog文件是analog_ip.v 和example_board.v。其中用户需要实现的功能在analog_ip.v文件中进行编写;example_board.v 是根据VGE中的pin配置,自动转换出来的verilog源码,也是supra工程的top module,不要手工改动。
注意:在后期若对VE文件有所修改,重新Prepare LOGIC 时,会重新生成cpld 工程模板,但 analog_ip.v 对应新增出analog_ip_tmpl.v 文件,而example_board.v 则是直接覆盖 。
3.工程简介
我们使用Quartus打开logic文件夹中的qdf
工程,如下:
其中各文件定义如下:
- analog_ip.v:用户自定义logic 的入口。用户logic 实现在这里编写。
- example_board.v:整个logic 的top module。会关联analog_ip 的module 和atla_sim 下的各module。 不要修改该文件 。
- alta_sim.v:封装过的跟AG32 相关的各module。 不要修改该文件 。
注意:这里的空工程不能马上添加自己的代码,首先要进行工程转换。
工程转换
打开Quartus 的tools->TCL Scripts,如下图所示:
打开TCL Scripts窗口后,选中af_quartus.tcl并点击run。
这个转换的过程,顺便进行了cpld 工程的编译。 第一次导入工程,必须执行以上方式来转换。 后续编写和修改cpld 代码后,可以仍然执行上图方式,也可以直接点击菜单栏中的"编译"按钮来编译。
编译运行成功后,可以看到该logic 占用的资源数量,需要确保使用到的 逻辑单元不能超过2K 。
编译完成后,会在logic
目录的simulation\modelsim
目录下生成vo文件,接下来打开Supra来生成bin文件。
Supra编译
首先打开logic
目录下的工程文件
之后在菜单栏中依次点击【Tool】-> 【Compile】
在打开的界面中点击【Run】按钮
编译成功后,会弹窗提示:Compile design example_board done with code 0。然后在logic 路径下可以看到新编译出来的example_board.bin
文件。
烧录
完成上面的步骤后,就能够进行代码的烧录了,首先进入VS code,点击Upload LOGIC
即可。
FPGA点亮LED
下面以点LED灯为例进行进行fpga使用的介绍。
首先修改VE文件如下
SYSCLK 200
BUSCLK 100
HSECLK 8
LED1 PIN_34:OUTPUT # LED1
这里我们将PIN_34接到了LED1信号线上。
之后在VS code中点击Prepare LOGIC
,生成LOGIC工程,并对其中的user_ip.v文件进行如下修改
module user_ip (
output tri0 LED1,
input sys_clock,
input bus_clock,
input resetn,
input stop,
input [1:0] mem_ahb_htrans,
input mem_ahb_hready,
input mem_ahb_hwrite,
input [31:0] mem_ahb_haddr,
input [2:0] mem_ahb_hsize,
input [2:0] mem_ahb_hburst,
input [31:0] mem_ahb_hwdata,
output tri1 mem_ahb_hreadyout,
output tri0 mem_ahb_hresp,
output tri0 [31:0] mem_ahb_hrdata,
output tri0 slave_ahb_hsel,
output tri1 slave_ahb_hready,
input slave_ahb_hreadyout,
output tri0 [1:0] slave_ahb_htrans,
output tri0 [2:0] slave_ahb_hsize,
output tri0 [2:0] slave_ahb_hburst,
output tri0 slave_ahb_hwrite,
output tri0 [31:0] slave_ahb_haddr,
output tri0 [31:0] slave_ahb_hwdata,
input slave_ahb_hresp,
input [31:0] slave_ahb_hrdata,
output tri0 [3:0] ext_dma_DMACBREQ,
output tri0 [3:0] ext_dma_DMACLBREQ,
output tri0 [3:0] ext_dma_DMACSREQ,
output tri0 [3:0] ext_dma_DMACLSREQ,
input [3:0] ext_dma_DMACCLR,
input [3:0] ext_dma_DMACTC,
output tri0 [3:0] local_int
);
assign mem_ahb_hreadyout = 1'b1;
assign slave_ahb_hready = 1'b1;
reg LED;
reg [24:0] clkcount;
assign LED1 = LED;
always @ (posedge sys_clock)
begin
clkcount <= clkcount+1;
case(clkcount[24])
0: LED <= 0;
1: LED <= 1;
endcase
end
endmodule
编译结束后可以看到逻辑资源使用非常少,没有超过2K的限制。
之后进行Supra编译,编译完成后如下图。
最后执行Upload LOGIC
烧录,烧录完成后,就能够看到LED在疯狂闪烁啦。