【【手把手教你修改Risc-V源码完成流水灯的设计】】

在完成了上一个在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
其实软件总是和硬件息息相关的
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值