1655|0

20

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

国产FPGA安路 高集成低功耗SF1系列FPSoC新品测评【使用SF1 RISCV ip核控制led】 [复制链接]

 

本期进行“SF1 RISCV ip核控制led”的测试,此次测试同时使用到了安路的TD与FD软件,在FD软件部分,我们将进行debug的调试测试。

首先是TD的fpga部分编写,工程新建步骤不再叙述,需要的请查看之前一期的文章。

使用Tool-->ip generator,生成pll ip核以及SF1 RISCV ip核,如下

顶层模块如下所示,其中clk_25m是fpga系统时钟25MHz,pll生成的100MHz是用于mcu的工作时钟:

module top( 
	input		clk_25m,
    input		rst_n,
    
    input		jtag_tck,
    input       jtag_tms,
    input       jtag_tdi,
    output      jtag_tdo,
    
    output		led0,		
    output		led1,		
    output		led2		   
);

wire		clk_100m;
wire		rst;

assign rst = ~rst_n;

PLL u_PLL(
  .refclk(clk_25m),
  .reset(rst),
  .clk0_out(clk_100m)
);

SF1_SoC u_SF1_SoC( 
	.clk(clk_100m),		//MCU的100MHz时钟
    .rst(rst),
    .timer_clk(clk_25m),	//fpga的25MHz时钟

    .jtag_tck(jtag_tck),
    .jtag_tdo(jtag_tdo),
    .jtag_tms(jtag_tms),		
    .jtag_tdi(jtag_tdi),

    .gpio_0(led0),
    .gpio_1(led1),
    .gpio_2(led2)
);

endmodule

SF1_SoC模块是控制mcu的模块:

module SF1_SoC( 
	input		clk,		//MCU的100MHz时钟
    input		rst,
    input		timer_clk,	//fpga的25MHz时钟
    
    input		jtag_tck,
    output		jtag_tdo,
    input		jtag_tms,		
    input		jtag_tdi,
    
    inout		gpio_0,
    inout		gpio_1,
    inout		gpio_2
);

wire gpio0_out;
wire gpio1_out;
wire gpio2_out;
wire gpio0_dir;
wire gpio1_dir;
wire gpio2_dir;
wire gpio0_in;
wire gpio1_in;
wire gpio2_in;


gpio_ctrl u0_gpio_ctrl( 
	.gpio_dir(gpio0_dir),	//1'b0:input  1'b1:output
    .gpio_out(gpio0_out),

    .gpio(gpio_0),		//对应fpga端口
    .gpio_in(gpio0_in)	
);

gpio_ctrl u1_gpio_ctrl( 
	.gpio_dir(gpio1_dir),	//1'b0:input  1'b1:output
    .gpio_out(gpio1_out),

    .gpio(gpio_1),		//对应fpga端口
    .gpio_in(gpio1_in)	
);

gpio_ctrl u2_gpio_ctrl( 
	.gpio_dir(gpio2_dir),	//1'b0:input  1'b1:output
    .gpio_out(gpio2_out),

    .gpio(gpio_2),		//对应fpga端口
    .gpio_in(gpio2_in)	
);

SF1_MCU u0_SF1_MCU(
		.soft_ip_apbm_en	(1'b0), 
        .qspi0cfg1_mode 	(1'b1), 
        .qspi0cfg2_mode 	(1'b1), 
        
        .jtag_tck			(jtag_tck), 
        .jtag_tdo			(jtag_tdo), 
        .jtag_tms			(jtag_tms), 
        .jtag_tdi			(jtag_tdi), 
        
        .apb_clk			(	), 
        
        .apb_paddr			(	), 
        .apb_pwrite			(	), 
        .apb_penable		(	), 
        .apb_pprot			(	), 
        .apb_pstrobe		(	), 
        .apb_psel			(	), 
        .apb_pwdata			(	), 
        .apb_prdata			(	), 
        .apb_pready			(	), 
        .apb_pslverr		(	), 
        
        .uart_tx			(	), 
        .uart_rx			(	), 
        
        .gpio0_out			(gpio0_out), 
        .gpio0_dir			(gpio0_dir), 
        .gpio0_in 			(gpio0_in ), 
        .gpio1_out			(gpio1_out), 
        .gpio1_dir			(gpio1_dir), 
        .gpio1_in 			(gpio1_in ), 
        .gpio2_out			(gpio2_out), 
        .gpio2_dir			(gpio2_dir), 
        .gpio2_in 			(gpio2_in ), 
        
        .core_clk			(clk), 
        .timer_clk			(timer_clk),
        .core_reset			(rst), 
        
        .mtip				(	),
        .nmi				(	), 
        .clic_irq			(	), 
        .sysrstreq			(	), 
        .apb_clk_down		(	), 
        .apb_paddr_down		(	), 
        .apb_penable_down	(	), 
        .apb_pprot_down		(	), 
        .apb_prdata_down	(	), 
        .apb_pready_down	(	), 
        .apb_pslverr_down	(	), 
        .apb_pstrobe_down	(	), 
        .apb_pwdata_down	(	), 
        .apb_pwrite_down	(	), 
        .apb_psel0_down		(	), 
        .apb_psel1_down		(	), 
        .apb_psel2_down     (	)
);

endmodule

gpio_ctrl用于控制gpio的输入输出模式:

module gpio_ctrl( 
	input	gpio_dir,	//1'b0:input  1'b1:output
    input	gpio_out,
    
    inout	gpio,		//对应fpga端口
    output	gpio_in	
);

assign	gpio = gpio_dir ? gpio_out:1'bz;
assign 	gpio_in = gpio;	//当作为输入时,直接将输入值赋值给gpio_in

endmodule

引脚分配通过查找DEMO板的原理图得知:

编译综合无误后,TD部分即可完成。

 

FD部分,打开FD软件,file-->New-->Project,选择C Project,选择For sf1 SoC,点击next,选择work3模式(各模式的区别请查看FD使用手册),next:

    

例程使用gpio_demo, 点击finish,即可完成工程新建:

 

 在官方例程中比较复杂,我们如下修改,使得三个led每隔0.5s交替闪烁:

#include <stdio.h>
#include "nuclei_sdk_hal.h"
#include "anl_printf.h"

#define LEDn  3
static uint32_t LED_CLORK[] = {SOC_LED_RED_GPIO_MASK, SOC_LED_GREEN_GPIO_MASK, SOC_LED_BLUE_GPIO_MASK};


void all_io_config(void)
{
    //for output 
    for(int i=0; i<LEDn; i++)
    {
        gpio_enable_output(GPIO,LED_CLORK[i]);
        gpio_write(GPIO,LED_CLORK[i],1);
    }
}

int main(void)
{
	all_io_config();
    while(1)
    {
        for(int i=0; i<LEDn; i++)
        {
            gpio_toggle(GPIO,LED_CLORK[i]);
            delay_1ms(500);
        }
    }
    return 0;
}


点击编译,无误后会在Debug目录下生成.hex文件,FD部分完成:

   

接下来我们回到TD,将TD生成的bit文件与FD生成的hex文件导入:

 

 

将下载模式改成PROGRAM RISC IMG并选择hex文件,之后点击run即可将程序固化到fpga中(注意,只有当bit文件被选中时才可进行Run):

 
 开发板的三个led每隔0.5s交替闪烁,当断电后重新上电,效果依旧,由此得出程序被固化到fpga中。

 

下面进行mcu部分的调试,此部分只需将risc调试器接入电脑即可:

首先在led闪烁的代码处添加断点:

  

检查Run-->debug configurations相关设置是否正确:

 

无误后点击debug:

点击运行至断点处,同时观察变量窗口中的i,以及开发板led灯的状况:

发现每按一次运行至断点处,变量 i 自增1  ,同时开发板的 led 变换一次,调试完成,点击红点结束。

FD部分的编译调试方法和其他编译器相似,入手难度不大。需要注意的是,当进行工程的导入时会报路径错误,具体解决方法可查看测评:

【国产FPGA安路 高集成低功耗SF1系列FPSoC新品】RISC-V开发环境搭建保姆级教程 https://bbs.eeworld.com.cn/thread-1234278-1-1.html

 

本次测评的工程如下:

BlinkLed.zip (842.57 KB, 下载次数: 4)

 

 

 

 

点赞 关注
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表