1859|2

32

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

安路SF1系列FPGA(一)两种方式点灯与串口通信-1 [复制链接]

 
本帖最后由 瓜弟 于 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软件下进行。

 

最新回复

实际使用时LL、RISCV的复位信号都是高有效确实需要注意的   详情 回复 发表于 2023-2-26 08:33
点赞 关注
 
 

回复
举报

1704

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

实际使用时LL、RISCV的复位信号都是高有效确实需要注意的

 
 
 

回复

32

帖子

1

TA的资源

一粒金砂(中级)

板凳
 

文中关于LED闪烁的频率的问题,实际上一直是每秒翻转一次,delay函数使用的是滴答定时器,和CPU的工作频率参数无关

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表