本帖最后由 瓜弟 于 2023-2-23 22:29 编辑
1、带硬核RISCV的FPGA:SF1系列简介
- RISCV32IMCA(整数乘除、压缩指令、原子指令)指令集的硬核,可见该硬核目标应用为逻辑管理类,非计算密集型应用场合
- RISCV最大主频160MHz
- RISCV自带外设SPIM、I2CM、UART、GPIO
- RISCV通过AHB与FPGA部分进行通信
- FPGA部分的硬核资源包括:MIPI控制器、存储器、IO、输入输出缓冲器、PLLx2、DDR等
2、本文内容简介
- 通过使用RISCV的GPIO和UART外设,介绍SF1系列FPGA工程搭建过程,并实现GPIO检测按键事件进行奠定和UART通信
- 介绍AHB片内总线,并通过AHB总线操作自定义寄存器,实现点灯。
3、开发流程介绍
与其他家带硬核CPU的类似FPGA一样,需要先进行硬件设计(FPGA部分),再进行软件设计(C语言)。
安路公司的硬件设计工具使用Anlogic TD,本人使用的版本为5.6.1 64-Bit。在该工具上对RISCV硬核进行例化,并配置时钟输入、复位、总线等关键信号,并综合、添加约束,生成bit文件。该bit文件可直接下载至Flash,也可等待软件部分设计完成后,一起下载。
软件设计工具使用FutureDynasty IDE,使用Eclipse修改而来,编译链RISCV-GCC的版本,编译链名称带nuclei,猜测该编译链由芯来公司提供。创建工程时,会提供SDK,进行RISCV的基本配置,以及外设的控制。
4、使用硬核RISCV的GPIO进行按键检测与点灯,并通过UART与上位机通信。
4.1硬件设计
点击Project->New Project,如下图所示
在对话框中以此填入工程名称、路径、FPGA所属系列、FPGA具体型号,如下图所示
工程创建完成后,正在在主界面点击Tools->IP Generator,如下图所示
选中“Create an IP Core”,如下图所示
选择Primitive IP->Micro Controller->SF1 RISCV,点击OK
在本章节,使用了2个GPIO和UART,分别勾选它们,完成后,点击OK
输入生成的Verilog代码文件名称,并核对Device是否正确,点击OK
注意勾选将生成的代码添加进工程中
此时在项目视图下就可以看见生成的RISCV.v文件,打开该文件,可以看见RISCV硬核需要配置的信号。此时可以注意到,我们勾选的GPIO0、GPIO1,在RISCV核的信号中出现了六个信号,如下图所示。
对比官方Demo可知,RISCV的GPIO读写信号分别通过gpiox_in、gpiox_ou进行,其中涉及到的三态门则需要我们自己实现,对比Demo,照猫画虎,新建gpio.v并添加进工程,文档内容如下
module gpio(
input wire gpio_dir,
input wire gpio_out,
output wire gpio_in,
inout wire pin
);
assign pin = gpio_dir ? gpio_out : 1'bz;
assign gpio_in = pin;
endmodule
开发板板载晶振为25MHz,该款FPGA的RISCV最大频率为160MHz,可使用PLL为RISCV提供时钟,此处使用100MHz
由于本人为试用产品,故使用简单的配置,但实际中,应考虑高低温、电磁环境等对PLL启动的影响。
对RISCV生成的IP进行封装简化
module TOP(
input wire clk_25MHz,
input wire rstn,
input wire jtag_tck,
output wire jtag_tdo,
input wire jtag_tms,
input wire jtag_tdi,
input wire uart_rx,
output wire uart_tx,
inout wire gpio_0,
inout wire gpio_1
);
wire clk_100MHz;
pll U1(
.refclk(clk_25MHz),
.reset(~rstn),
.clk0_out(clk_100MHz)
);
SOC U2(
.clk(clk_100MHz),
.clk_low(clk_25MHz),
.rstn(~rstn),
.jtag_tck(jtag_tck),
.jtag_tdo(jtag_tdo),
.jtag_tms(jtag_tms),
.jtag_tdi(jtag_tdi),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.gpio_0(gpio_0),
.gpio_1(gpio_1)
);
endmodule
组建TOP层
module TOP(
input wire clk_25MHz,
input wire rstn,
input wire jtag_tck,
output wire jtag_tdo,
input wire jtag_tms,
input wire jtag_tdi,
input wire uart_rx,
output wire uart_tx,
inout wire gpio_0,
inout wire gpio_1
);
wire clk_100MHz;
pll U1(
.refclk(clk_25MHz),
.reset(~rstn),
.clk0_out(clk_100MHz)
);
SOC U2(
.clk(clk_100MHz),
.clk_low(clk_25MHz),
.rstn(~rstn),
.jtag_tck(jtag_tck),
.jtag_tdo(jtag_tdo),
.jtag_tms(jtag_tms),
.jtag_tdi(jtag_tdi),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.gpio_0(gpio_0),
.gpio_1(gpio_1)
);
endmodule
需要额外注意:PLL、RISCV的复位信号都是高有效!
硬件设计完成,接下来进行在综合、引脚约束,此处为常规操作,不再详细描述。引脚约束文件内容
set_pin_assignment { clk_25MHz } { LOCATION = D7; }
set_pin_assignment { gpio_0 } { LOCATION = J5; }
set_pin_assignment { gpio_1 } { LOCATION = H3; }
set_pin_assignment { jtag_tck } { LOCATION = C7; }
set_pin_assignment { jtag_tdi } { LOCATION = D5; }
set_pin_assignment { jtag_tdo } { LOCATION = C6; }
set_pin_assignment { jtag_tms } { LOCATION = D6; }
set_pin_assignment { rstn } { LOCATION = H2; }
set_pin_assignment { uart_rx } { LOCATION = E4; }
set_pin_assignment { uart_tx } { LOCATION = A4; }
生成的Bit流文件暂时可不用下载。
4.2软件设计
启动FutureDynasty软件,点击File->New->Project...
选择C/C++ -> C Project,点击Next
填入项目名称,取消掉默认项目路径,选择自定义路径,安路文档中提示,不能存在在中文路径名。在下方Project type选择Executable->Anlogic SDK Project For sf1 SoC
此页选择工作模式,关于四种工作模式,在官方文档《TN817_SF1 MCU用户指南》中的4.6章节有详细描述,此处不再复述。选择工作模式3,即数据段位域DLM,代码段仍位域Flash中。点击next
在此页中,选择参考工程,然后点击Finish即可。
生成的工程的main.c文件中有默认的GPIO点灯以及中断例程,将其内容删除,照猫画虎,内容如下。可见,当GPIO1(H3,连接至按键)引脚为高电平的时候,GPIO0(J5,连接至LED)将每秒(实际上是800ms,需要更改system_nuclei.c中SYSTEM_CLOCK的定义)翻转一次。
#include <stdio.h>
#include "nuclei_sdk_hal.h"
#include "anl_printf.h"
int main(void)
{
gpio_enable_output(GPIO, 1);
gpio_enable_input(GPIO, 2);
while(1)
{
if(gpio_read(GPIO, 2) != 0)
{
gpio_toggle(GPIO, 1);
delay_1ms(1000);
}
}
}
右键项目名称,编译即可,将生成Hex文件。此时,回到Anlogic TD软件,点击Tools->Download
以下步骤需按描述执行,这个Download界面貌似存在在bug。点击Add
添加FPGA部分的bit文件,该文件存在 <项目路径>/phy_1/ 下面,选中后点击打开
再次点击Add图标
定位到软件工程项目下,并将文件类型更改为 HEX File(*.hex),该目标文件存在软件工程路径下的Debug或者Release目录中,选中后点击打开
点击Mode下拉框,先选择PROGRAM RISCV IMG,然后在Hex File下拉框中选择hex文件
先点击文件列表中的bit文件,再点击Run图标,即可等待下载完成。此时Demo板子上的LED就会自动1秒间隔的跳动,按住KEY0时,则会停止跳动。
6242ef89953fb79e833daa1b32142f7d
4、关于RISCV调试器
此款FPGA使用的RISCV硬核为芯来公司的N309核,调试时可使用芯来公司的调试器,使用openOCD服务,再软件开发工具下进行简单配置就可使用,由于暂时未拿到该调试器,本人在暂时使用Jlink。本文将描述如何使用JLink进行调试,但暂时无法使用JLink进行程序下载.
首先电脑必须安装Jlink的套件、驱动等,该过程本文不再详述。再FutureDinasty开发工具上,右键项目名称,在Debug As下拉框中点击Debug Configurations
双击 GDB SEGGER J-Link Debugging后,在弹出的页面点击Debugger
注意上图圈出的位置,确认Jlink服务器程序的位置识别是否正确,不正确则自行指定。Device Name选择N308,此FPGA中的硬核为N309,但Jlink的支持列表中暂无N309,只能暂时选N308,暂未发现问题。Connection选择USB,Interface选择JTAG。其他设置默认即可,点击Debug,即可进行单步调试等。无法进行程序下载,程序下载须在TD软件下进行。