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

相关推荐
DIY机器人工房4 小时前
一个可以检测本机的字节顺序,并对任意数据进行字节顺序的反转操作的代码。
嵌入式硬件·算法·嵌入式·diy机器人工房
ChipCamp16 小时前
Chisel芯片开发入门系列 -- 14. CPU芯片开发和解释4(Load/Store指令再探)
arm开发·青少年编程·fpga开发·scala·dsp开发·risc-v·chisel
霖0017 小时前
深入讲讲异步FIFO
笔记·vscode·单片机·嵌入式硬件·学习·fpga开发
水果里面有苹果19 小时前
3-verilog的使用-1
fpga开发
嵌入式-老费20 小时前
再谈fpga开发(总结篇)
fpga开发
minglie11 天前
基于 AXI-Lite 实现可扩展的硬件函数 RPC 框架(附完整源码)
fpga开发
朱古力(音视频开发)1 天前
NDI开发指南
fpga开发·音视频·实时音视频·视频编解码·流媒体
DIY机器人工房2 天前
【科普】在STM32中有哪些定时器?
c语言·嵌入式·定时器·diy机器人工房
9527华安2 天前
FPGA实现AD9361采集转SRIO与DSP交互,FPGA+DSP多核异构信号处理架构,提供2套工程源码和技术支持
fpga开发·架构·信号处理·dsp·ad9361·多核异构
小眼睛FPGA2 天前
【盘古100Pro+开发板实验例程】FPGA学习 | 基于紫光 FPGA 的键控 LED 流水灯
科技·学习·ai·fpga开发·fpga