国产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
本次测评的工程如下:
|