当前位置:网站首页>基于Bevy游戏引擎和FPGA的双人游戏
基于Bevy游戏引擎和FPGA的双人游戏
2022-07-06 22:42:00 【biyezuopinvip】
资源下载地址: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
边栏推荐
- Ansible overview and module explanation (you just passed today, but yesterday came to your face)
- U++ 元数据说明符 学习笔记
- Talk about the importance of making it clear
- 接口间调用为什么要用json、fastjson怎么赋值的、fastjson [email protected]映射关系问题
- [hand torn STL] list
- Stm32f103ze+sht30 detection of ambient temperature and humidity (IIC simulation sequence)
- 谈谈讲清楚这件事的重要性
- A row of code r shows the table of Cox regression model
- 当 Knative 遇见 WebAssembly
- What work items do programmers hate most in their daily work?
猜你喜欢
Lessons and thoughts of the first SQL injection
U++ 游戏类 学习笔记
mpf2_ Linear programming_ CAPM_ sharpe_ Arbitrage Pricin_ Inversion Gauss Jordan_ Statsmodel_ Pulp_ pLU_ Cholesky_ QR_ Jacobi
Ansible中的inventory主机清单(预祝你我有数不尽的鲜花和浪漫)
A line of R code draws the population pyramid
U++ 元数据说明符 学习笔记
Basic knowledge of road loss of 3GPP channel model
Oracle -- 视图与序列
3GPP信道模型路损基础知识
[Android kotlin collaboration] use coroutinecontext to realize the retry logic after a network request fails
随机推荐
Programmers go to work fishing, so play high-end!
[Yugong series] go teaching course 005 variables in July 2022
Factor analysis r practice (with R installation tutorial and code)
Leetcode longest public prefix
AttributeError: module ‘torch._ C‘ has no attribute ‘_ cuda_ setDevice‘
In depth analysis of kubebuilder
Ansible reports an error: "MSG": "invalid/incorrect password: permission denied, please try again“
01 machine learning related regulations
Markdown编辑器
JS variable
You can't sell the used lithography machine to China! The United States unreasonably pressured the Dutch ASML, and domestic chips were suppressed again
Wechat can play the trumpet. Pinduoduo was found guilty of infringement. The shipment of byte VR equipment ranks second in the world. Today, more big news is here
leetcode 53. Maximum subarray maximum subarray sum (medium)
JS variable plus
A detailed explanation of head pose estimation [collect good articles]
5G VoNR+之IMS Data Channel概念
Mysql database (basic)
树与图的深度优先遍历模版原理
Analyse approfondie de kubebuilder
如何设计 API 接口,实现统一格式返回?