AG32 FPGA部分简单开发

环境

  • 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的开发流程的简要描述:

  1. 在VE 文件里配置用到的mcu 和pin 之间、mcu 和cpld 之间、cpld 和pin 之间的信号关联。
  2. 在VS code中点击"prepare LOGIC"按钮,生成cpld 的框架工程。
  3. 用quartus 打开该工程并添加自己的逻辑代码,最后转换工程,生成vo;
  4. 用supra 打开转换后的工程,编译出bin,最后回到VS code进行烧录。

fpga使用具体步骤

1. VE文件修改

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

  1. mcu 用的IO,在ve 里,可以关联到外部引脚Pin_xx。
  2. cpld 用的IO,在ve 里,可以关联到外部引脚pin_xx。
  3. mcu 的某一路信号又可以直接和cpld 的某一路信号,在ve 里,关联起来。

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

引脚关联格式
  1. MCU:

  2. CPLD:这里的方向是CPLD对外部引脚而言,共有OUTPUT、INPUT和INOUT三种格式,SIGNAL则会在生成LOGIC工程时自动添加到顶级逻辑模块中。

  3. 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工程,如下:

其中各文件定义如下:

  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。 不要修改该文件

注意:这里的空工程不能马上添加自己的代码,首先要进行工程转换。

工程转换

打开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在疯狂闪烁啦。

相关推荐
A-code8 小时前
C/C++ 中 void* 深度解析:从概念到实战
c语言·开发语言·c++·经验分享·嵌入式
FakeOccupational10 小时前
fpga系列 HDL : Microchip FPGA开发软件 Libero 中导出和导入引脚约束配置
fpga开发
贝塔实验室14 小时前
LDPC 码的构造方法
算法·fpga开发·硬件工程·动态规划·信息与通信·信号处理·基带工程
Moonnnn.17 小时前
【FPGA】时序逻辑计数器——仿真验证
fpga开发
三贝勒文子19 小时前
Synopsys 逻辑综合之 ICG
fpga开发·eda·synopsys·时序综合
byte轻骑兵19 小时前
【驱动设计的硬件基础】CPLD和FPGA
fpga开发·cpld
dadaobusi19 小时前
看到一段SVA代码,让AI解释了一下
单片机·嵌入式硬件·fpga开发
G2突破手25919 小时前
FMC、FMC+ 详解
fpga开发
fpga和matlab19 小时前
FPGA时序约束分析4——Reg2Reg路径的建立时间与保持时间分析
fpga开发·reg2reg·建立时间·保持时间
高沉19 小时前
2025华为海思数字IC面经
华为·fpga开发