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

相关推荐
-木槿昔年-12 小时前
【米尔-安路MYD-YM90X创意秀】飞龙派学习和PS串口实践
学习·fpga开发
Aaron158812 小时前
基于RFSOC+VU13P+GPU架构在雷达电子战的技术
人工智能·算法·fpga开发·架构·硬件工程·信号处理·基带工程
切糕师学AI17 小时前
Azure RTOS ThreadX 简介
microsoft·嵌入式·azure·rtos
飞凌嵌入式18 小时前
AIoT出海背景下,嵌入式主控的国际认证之路与价值思考
大数据·人工智能·嵌入式硬件·区块链·嵌入式
jifengzhiling18 小时前
伺服驱动器中DSP与FPGA高效协同架构解析
fpga开发·foc电机控制
小柯博客20 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统 - STM32MP2(基于STM32CubeMX)(九)
c语言·stm32·单片机·嵌入式硬件·物联网·嵌入式·yocto
大聪明-PLUS21 小时前
优雅的操作系统开发:用现代 C++ 编写操作系统内核(不使用宏)。第一部分——HAL 为王。
linux·嵌入式·arm·smarc
太爱学习了21 小时前
FPGA图像处理之:图像畸变矫正原理及matlab与fpga实现
图像处理·matlab·fpga开发
Jason_zhao_MR2 天前
米尔RK3506核心板SDK重磅升级,解锁三核A7实时控制新架构
linux·嵌入式硬件·物联网·架构·嵌入式·嵌入式实时数据库
技术性摸鱼2 天前
FPGA选型参数
fpga开发