【国产FPGA评测】安路(型号SF1S60CG121I) 06 使用SF1的硬核以及UART驱动
[复制链接]
本帖最后由 EPTmachine 于 2023-4-22 21:47 编辑
1.1使用IP Generator生成RISC-V硬核和PLL核
创建工程并选择器件为SF160CG121I。
点击Tools->IP Generator,选择Create an IP core,生成RISC-V核SF1_MCU和PLL核sys_pll。
1.2 设计GPIO接口电路
在创建SF1_MCU IP的时候,选中了3个GPIO输出,在左侧的示意图上会出现三组GPIO相关的端口。
每组端口由gpiox_in、gpiox_out、gpiox_dir(x=0,1,2,3….n),与FPGA的物理端口连接需要添加一个控制电路,该控制电路中gpio_dir控制物理端口和gpio0_in还是和gpio0_out相连接。具体代码如下:
module gpio_controller(
output wire O_gpio_in,
input wire I_gpio_dir,//1'b0:input ,1'b1:output
input wire I_gpio_out,
inout wire IO_gpio
);
assign IO_gpio = I_gpio_dir?I_gpio_out:1'bz;
assign O_gpio_in=IO_gpio;
endmodule
1.3 设计SOC模块以及使用
结合上述配置好的RISC-V IP核和GPIO接口电路模块,组成一个可以供外部调用的SOC模块,具体代码如下:
module SF1_SOC(
input wire I_clk,
input wire I_rst,
input wire I_timer_clk,
input wire I_jtag_tck,
output wire O_jtag_tdo,
input wire I_jtag_tms,
input wire I_jtag_tdi,
input wire I_uart_rx,
output wire O_uart_tx,
inout wire IO_gpio_0,
inout wire IO_gpio_1,
inout wire IO_gpio_2
);
wire S_gpio0_out;
wire S_gpio0_dir;
wire S_gpio0_in;
wire S_gpio1_out;
wire S_gpio1_dir;
wire S_gpio1_in;
wire S_gpio2_out;
wire S_gpio2_dir;
wire S_gpio2_in;
//gpio_controller instances
gpio_controller u0_gpio_controller(
.O_gpio_in(S_gpio0_in),
.I_gpio_dir(S_gpio0_dir),
.I_gpio_out(S_gpio0_in),
.IO_gpio(IO_gpio_0)
);
gpio_controller u1_gpio_controller(
.O_gpio_in(S_gpio1_in),
.I_gpio_dir(S_gpio1_dir),
.I_gpio_out(S_gpio1_in),
.IO_gpio(IO_gpio_1)
);
gpio_controller u2_gpio_controller(
.O_gpio_in(S_gpio2_in),
.I_gpio_dir(S_gpio2_dir),
.I_gpio_out(S_gpio2_in),
.IO_gpio(IO_gpio_2)
);
//SF1_MCU
SF1_MCU u_SF1_MCU(
.core_clk(I_clk),
.timer_clk(I_timer_clk),
.core_reset(I_rst),
.jtag_tck(I_jtag_tck),
.jtag_tdo(O_jtag_tdo),
.jtag_tms(I_jtag_tms),
.jtag_tdi(I_jtag_tdi),
.soft_ip_apbm_en(1'b0),
.qspi0cfg1_mode(1'b1),
.qspi0cfg2_mode(1'b1),
.uart_tx(O_uart_tx),
.uart_rx(I_uart_rx),
.gpio0_out(S_gpio0_out),
.gpio0_dir(S_gpio0_dir),
.gpio0_in(S_gpio0_in),
.gpio1_out(S_gpio1_out),
.gpio1_dir(S_gpio1_dir),
.gpio1_in(S_gpio1_in),
.gpio2_out(S_gpio2_out),
.gpio2_dir(S_gpio2_dir),
.gpio2_in(S_gpio2_in),
// .mtip(),
// .apb_clk(),
// .apb_paddr(),
// .apb_pwrite(),
// .apb_penable(),
// .apb_pprot(),
// .apb_pstrobe(),
// .apb_psel(),
// .apb_pwdata(),
// .apb_prdata(),
// .apb_pready(),
// .apb_pslverr(),
.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
在TOP模块中调用,SOC模块和PLL模块
添加管脚约束,通过查看硬件原理图,可以整理出使用到的IO端口连接
TOP端口 |
FPGA端口 |
外设 |
I_clk_25m |
D7 |
25M无源晶振 |
I_rst_n |
H3 |
按键K0 |
I_jtag_tck |
C7 |
JTAG TCK引脚 |
O_jtag_tdo |
C6 |
JTAG TDO引脚 |
I_jtag_tms |
D6 |
JTAG TMS引脚 |
I_jtag_tdi |
D5 |
JTAG TDI引脚 |
O_led0 |
J4 |
LED0 |
O_led1 |
H5 |
LED1 |
O_led2 |
J5 |
LED2 |
I_uart_rx |
E4 |
SF1_UART_RX |
O_uart_tx |
A4 |
SF1_UART_TX |
添加完成IO约束和时序约束后,就可以生成位流文件,准备接下来的下载了。
2.RISC-V程序编写
上述过程完成了RISC-V硬核的实现,接下来需要在编写运行在RISC-V处理器上程序。
2.1开发环境准备
SF1上的RISC-V硬核的程序是在Future Dynasty(FD)集成开发环境中进行的,开发工具直接将压缩包解压到硬盘上即可,注意在路径中不要有中文,否则会有乱码、编译器无法执行等问题。
2.2创建工程
在File->New中选择Project,按下图中所示的流程创建gpio_demo工程。
2.2下载工程
创建完成后,由于串口驱动中的波特率驱动存在bug,需要对驱动程序进行修改,修改的地方位于
修改后就可以正常使用UART了。编译工程后,在工程的Debug文件夹下查看可产生的二进制文件。回到TD软件中,点击工具栏中的Download按钮。在页面中选择FPGA的位留文件和RISC-V工程的Hex文件,下载方式选择PROGRAM RISCV IMG,下载时,记得点击文件列表中的位流文件,这样下载时才不会报错。
2.3运行演示
09演示
工程附件
|