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

相关推荐
CodingCos3 小时前
【OpenOCD 与 FT4232H 专栏 4 -- FT4232H 实现 USB 转 GPIO】
fpga开发·ft432h·usb 转 gpio
乘风~&7 小时前
fpga异步fifo
fpga开发
szxinmai主板定制专家7 小时前
基于ARM+FPGA的电力通信管理机IEC61850规约通信机的实现
fpga开发
stm 学习ing7 小时前
FPGA 第7讲 简单组合逻辑译码器
stm32·嵌入式硬件·学习·fpga开发·c#·学习方法·fpga
水饺编程7 小时前
【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-24
linux·嵌入式硬件·fpga开发·硬件架构
电子老师傅7 小时前
如何挑选海外4G模组?这里有秘籍!
物联网·嵌入式·硬件工程·4g模组
KKK3号8 小时前
Verilog HDL学习笔记
嵌入式硬件·fpga开发·verilog hdl·1024程序员节
乘风~&10 小时前
fpga 同步fifo
fpga开发
stm 学习ing10 小时前
FPGA 第6讲 简单组合逻辑多路选择器
fpga开发