赞
踩
在完成了上一个在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
其实软件总是和硬件息息相关的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。