资源下载地址:https://download.csdn.net/download/sheziqiong/85931377
资源下载地址:https://download.csdn.net/download/sheziqiong/85931377
接口技术
实验目的
- 熟悉 MIPSfpga 的软硬件协同开发
- 学会硬件调试方法
实验环境
操作系统:Windows 10
开发环境:
- 硬件开发:Vivado 2018.2
- 软件编译:MIPS 工具链
- GUI 实现:Bevy 游戏引擎
语言:
- MIPSfpga 软件:C
- GUI 实现:Rust
- 项目设计与实现
- 总体设计与实现
- 设计:通过 FPGA 上的串口功能,与 X86 主机进行信息交流,进而实现对游戏人物的移动控制。
实现:学校提供的 FPGA 实验平台有 UART 串口模块,通过串口转 USB 线可以实现和 X86 主机的信息收发,这点已经在前面的实验中实践过了。那么如何实现在程序中收到串口信息呢?很多编程语言都会有已经实现好的串口编程支持库,我们只需要调用 API 就行了。
硬件实现
硬件实现主要包括两部分,GPIO 和 UART 模块。
首先在 vivado 工程里面添加 GPIO 模块:
并且将中断源接到中断控制器 7 号端口:
然后添加 UART 模块并接到 AXI 总线上:
修改约束文件,将 SWITCH 相关的约束注释去掉:
在原先实验四代码的基础上,在中断处理函数_mips_handle_irq 里面添加对 GPIO 中断来源的判断,如果确认是来自 GPIO 的中断源,从 GPIO 里面读取值,然后通过 UART 发送到主机上。
代码:
void _mips_handle_irq(void* ctx, int reason) {
volatile unsigned int period;
volatile unsigned int rxData;
*WRITE_IO(IO_LEDR) = 0xF00F; // Display 0xF00F on LEDs to indicate enter the interrupt
data_received = 0x0;
if(reason & IS_UART_INTR && !(reason & IS_TIME_INTR)) {
/* Read an input value from the console. */
rxData = *READ_IO(UART_BASE + rbr);
data_received = 0x1;
}
else if(reason & IS_PWM_INTR) {
// 设置 pwm 值为 0
*WRITE_IO(PWM_BASE) = 0 * 110000;
}
else if(reason & IS_TIME_INTR) {
asm volatile ("mtc0 $0, $11");
asm volatile ("li $9, 0x1");
asm volatile ("mtc0 $9, $9");
}
else if(reason & IS_GPIO_INTR) {
volatile unsigned int sw = 0;
sw = *READ_IO(SW_LEDR);
uart_outbyte((char)sw);
}
else {
uart_print("Other interrupts occurred!\n\r");
uart_print(my_itoa(reason));
}
return;
}
然后 GUI 程序是使用了 Rust 语言编写,基于 Rust 语言开发的 Bevy 游戏引擎,我们实现了一款双人射击小游戏,两个角色分别通过键盘和 FPGA 板子进行控制。这里的关键问题是我们如何在 Rust 程序里面收到由 FPGA 发过来的信息呢?Rust 社区里面有一个实现好的开源串口编程库,我们调用这个库的 API 即可较为方便地实现串口通信功能。这个库的 GitHub 地址在这里:。然后用 Rust 语言实现的小游戏代码的 GitHub 地址在这里:。
软硬件结合起来的效果就是,拨动 FPGA 上的 switch 按键,会产生一个外部中断,这个中断在 C 程序里面的中断处理函数_mips_handle_irq 中被捕获,然后通过串口给主机发信息,主机收到信息后进行解析,然后角色进行相应的移动操作。这样子就实现了通过 FPGA 板子控制角色移动进行游戏。
系统运行结果
硬件连接:
游戏运行结果:
资源下载地址:https://download.csdn.net/download/sheziqiong/85931377
资源下载地址:https://download.csdn.net/download/sheziqiong/85931377