在完成了上一个在FPGA上搭建Risc-v的实验之后,我们可以修改源码来实现自主想要完成的功能
首先实现流水灯 需要用到GPIO端口 那么修改XDC文件将GPIO端口绑定至LED灯上
另外另外 上一节修改的源码 关于如何下载的依旧是需要的这里再说明一下
而TinyRisc-V的LED灯是低电平 所以我们需要修改源码,将其变为高电平。
在顶层里修改
(当然其实这里都不需要改 因为我们将这两个灯用来实现流水灯了 所以 这里没必要改 )(无用之举)
修改之后使其能够正常点灯
接下来修改串口tx和 rx信号引脚绑定
这里想要说明的是 其实绝大部分都可以绑定空的引脚,但是一定要绑定,不绑定过不了验证。 我们想要实现某些功能,让它表现出来,最好的办法就是输出在LED灯上。
由于达芬奇开发板没有拨码和自锁开关,并且未按下时按键端口输出高电平,按下时输出低电平。因为这里是高电位启动,所以我们需要修改代码,绑定至key0
(这里的唯一的作用是为了下载 摁下按键就启用下载)
修改后为
下面开始的设计才是这次流水灯设计相关的
首先修改XDC将GPIO绑定完成 修改后的XDC 如下显示
# 时钟约束50MHz,占空比50%
create_clock -add -name sys_clk_pin -period 20.00 -waveform {0 10} [get_ports {clk}];
# 时钟引脚
set_property -dict { PACKAGE_PIN R4 IOSTANDARD LVCMOS33 } [get_ports {clk}];
# 复位引脚
set_property -dict { PACKAGE_PIN U2 IOSTANDARD LVCMOS33 } [get_ports {rst}];
# 程序执行完毕指示引脚 任意空管脚
set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports {over}];
# 程序执行成功指示引脚 任意空管脚
set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports {succ}];
# CPU停住指示引脚 任意空管脚
set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports {halted_ind}];
# 串口下载使能引脚,由于没有拨码开关和自锁开关,所以绑定到key0上,key0按住不放时才使能串口下载
set_property -dict { PACKAGE_PIN T1 IOSTANDARD LVCMOS33 } [get_ports {uart_debug_pin}];
# 串口发送引脚
set_property -dict { PACKAGE_PIN AB6 IOSTANDARD LVCMOS33 } [get_ports {uart_tx_pin}];
# 串口接收引脚
set_property -dict { PACKAGE_PIN V7 IOSTANDARD LVCMOS33 } [get_ports {uart_rx_pin}];
# GPIO0引脚
set_property -dict { PACKAGE_PIN R2 IOSTANDARD LVCMOS33 } [get_ports {gpio[0]}];
# GPIO1引脚
set_property -dict { PACKAGE_PIN R3 IOSTANDARD LVCMOS33 } [get_ports {gpio[1]}];
# GPIO2引脚
set_property -dict { PACKAGE_PIN V2 IOSTANDARD LVCMOS33 } [get_ports {gpio[2]}];
# GPIO3引脚
set_property -dict { PACKAGE_PIN V3 IOSTANDARD LVCMOS33 } [get_ports {gpio[3]}];
# JTAG TCK引脚 PortA 0
set_property -dict { PACKAGE_PIN AA8 IOSTANDARD LVCMOS33 } [get_ports {jtag_TCK}];
create_clock -name jtag_clk_pin -period 300 [get_ports {jtag_TCK}];
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets jtag_TCK]
# JTAG TMS引脚 PortA 3
set_property -dict { PACKAGE_PIN AB8 IOSTANDARD LVCMOS33 } [get_ports jtag_TMS];
# JTAG TDI引脚 PortA 1
set_property -dict { PACKAGE_PIN Y7 IOSTANDARD LVCMOS33 } [get_ports {jtag_TDI}];
# JTAG TDO引脚 PortA 2
set_property -dict { PACKAGE_PIN Y8 IOSTANDARD LVCMOS33 } [get_ports jtag_TDO];
# SPI MISO引脚
set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports {spi_miso}];
# SPI MOSI引脚
set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports {spi_mosi}];
# SPI SS引脚
set_property -dict { PACKAGE_PIN E13 IOSTANDARD LVCMOS33 } [get_ports {spi_ss}];
# SPI CLK引脚
set_property -dict { PACKAGE_PIN E14 IOSTANDARD LVCMOS33 } [get_ports {spi_clk}];
#SPI 相关设置
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property CONFIG_MODE SPIx4 [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property BITSTREAM.CONFIG.UNUSEDPIN PULLUP [current_design]
再修改rtl代码下的top文件
修改至[3:0]
还有的是
修改至
对于gpio.c修改
在软件端进行调节
为了不修改makefile 增加简易程度 我们直接在例程上的gpio进行修改
(其实重启一个新的文件构建一个makefile也行 只要整体结构简单)
以simple.c为例
...
2 TARGET = simple
4 CFLAGS += -DSIMULATION
5 #CFLAGS += -O2
6 #ASM_SRCS +=
7 #LDFLAGS +=
8 #INCLUDES += -I.
10 C_SRCS :=
11 main.c \
...
修改第2行,这个TARGET就是程序编译后生成的bin文件名字,这里是simple.bin。
修改第4行,CFLAGS是编译选项,这里的simple例程默认作为仿真使用,所以需要定义SIMULATION宏。
修改第6行,将需要编译的汇编文件全部添加到这里。
修改第8行,将涉及的头文件路径全部添加到这里。
修改第10行,将需要编译的c文件全部添加到这里。
好了好了扯远了我们打开自带的GPIO文件
修改这个
#include <stdint.h>
#include "../include/gpio.h"
#include "../include/utils.h"
int main()
{
GPIO_REG(GPIO_CTRL) |= 0x55; // gpio0输出模式 01 01 01 01
int sum1 = 1; // 0001
int sum2 = 2; // 0010
int sum3 = 4; // 0100
int sum4 = 8; // 1000
int* gpio_data = (int*) 0x40000004;
while (1) {
// *gpio_data = sum1;
GPIO_REG(GPIO_DATA) = sum4 ;
for(int i = 0; i < 1000000; i++); // delay
// 第二个灯亮起
// *gpio_data = sum2;
GPIO_REG(GPIO_DATA) = sum3 ;
for(int i = 0; i < 1000000; i++); // delay
// 第三个灯亮起
// *gpio_data = sum3;
GPIO_REG(GPIO_DATA) = sum2 ;
for(int i = 0; i < 1000000; i++); // delay
// 第四个灯亮起
// *gpio_data = sum4;
GPIO_REG(GPIO_DATA) = sum1 ;
for(int i = 0; i < 1000000; i++); // delay
}
}
在终端输入make 产生.bin文件
介绍一下 我们点击 上一层目录的include 下的 gpio.h
其实软件总是和硬件息息相关的