From 1c0ee18ba66c5e1a8183a2749a54b143cb3cb718 Mon Sep 17 00:00:00 2001 From: supersurviveur Date: Fri, 28 Nov 2025 14:13:42 +0100 Subject: [PATCH] Add game 2048 --- bench/programs_rust/game-2048/Cargo.toml | 1 + bench/programs_rust/game-2048/src/main.rs | 60 ++++++++++------------- common/ZzTop.xdc | 2 +- src/main/scala/projet/LedIp.scala | 4 +- src/main/scala/projet/ZzTop.scala | 2 +- 5 files changed, 31 insertions(+), 38 deletions(-) diff --git a/bench/programs_rust/game-2048/Cargo.toml b/bench/programs_rust/game-2048/Cargo.toml index 81d9a5d..61a0fc5 100644 --- a/bench/programs_rust/game-2048/Cargo.toml +++ b/bench/programs_rust/game-2048/Cargo.toml @@ -4,5 +4,6 @@ version = "0.1.0" edition = "2024" [dependencies] +compile-rand = "1.0.0" fpga-lib = { path = "../fpga-lib" } rand = {version = "0.9.2", default-features = false, features = ["small_rng"]} diff --git a/bench/programs_rust/game-2048/src/main.rs b/bench/programs_rust/game-2048/src/main.rs index 79b1656..71a7871 100644 --- a/bench/programs_rust/game-2048/src/main.rs +++ b/bench/programs_rust/game-2048/src/main.rs @@ -4,7 +4,6 @@ #![feature(generic_const_exprs)] use core::{ - iter::Cloned, mem::MaybeUninit, ops::{Index, IndexMut}, }; @@ -100,7 +99,7 @@ where pub fn new() -> Self { Self { grid: [0; SIZE * SIZE], - rng: rand::rngs::SmallRng::seed_from_u64(9543223934), + rng: rand::rngs::SmallRng::seed_from_u64(compile_rand::compile_rand!(u64)), score: 0, } } @@ -208,43 +207,36 @@ where pub fn run(&mut self) -> ! { let mut buttons = [false; 4]; let funcs = [Self::left, Self::right, Self::up, Self::down]; + let mut lost = false; + self.draw(); loop { - let mut lost = false; - self.draw(); - loop { - for direction in 0..4 { - let button = - unsafe { fpga_lib::interface::Buttons::get_button(direction as u8) }; - if button && !buttons[direction] { - buttons[direction] = true; + for direction in 0..4 { + let button = unsafe { fpga_lib::interface::Buttons::get_button(direction as u8) }; + if button && !buttons[direction] { + buttons[direction] = true; - if funcs[direction](self) { - self.add(); - self.draw(); - if self.lost() { - lost = true; - break; - } + if funcs[direction](self) { + self.add(); + self.draw(); + if self.lost() { + lost = true; + break; } - } else if !button && buttons[direction] { - buttons[direction] = false } + } else if !button && buttons[direction] { + buttons[direction] = false } - if lost { - unsafe { - fpga_lib::vga::VGA::draw_string( - OFFSET, - OFFSET + (SIZE as u16) * BLOCK_SIZE + FONT_HEIGHT as u16 + 10, - "Game Over !", - RED, - ) - }; - self.reset(); - while !(0..4).any(|direction| unsafe { - fpga_lib::interface::Buttons::get_button(direction as u8) - }) {} - break; - } + } + if lost { + unsafe { + fpga_lib::vga::VGA::draw_string( + OFFSET, + OFFSET + (SIZE as u16) * BLOCK_SIZE + FONT_HEIGHT as u16 + 10, + "Game Over !", + RED, + ) + }; + loop {} } } } diff --git a/common/ZzTop.xdc b/common/ZzTop.xdc index e4e90ef..69351f6 100644 --- a/common/ZzTop.xdc +++ b/common/ZzTop.xdc @@ -20,7 +20,7 @@ set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { io_swi set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { io_push[0] }]; #IO_L20N_T3_34 Sch=BTN0 set_property -dict { PACKAGE_PIN P16 IOSTANDARD LVCMOS33 } [get_ports { io_push[1] }]; #IO_L24N_T3_34 Sch=BTN1 set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { io_push[2] }]; #IO_L18P_T2_34 Sch=BTN2 -set_property -dict { PACKAGE_PIN Y16 IOSTANDARD LVCMOS33 } [get_ports { io_push[3] }]; #IO_L7P_T1_34 Sch=BTN3 +set_property -dict { PACKAGE_PIN Y16 IOSTANDARD LVCMOS33 } [get_ports { reset }]; #IO_L7P_T1_34 Sch=BTN3 # LEDs diff --git a/src/main/scala/projet/LedIp.scala b/src/main/scala/projet/LedIp.scala index 36e9216..bb9803b 100644 --- a/src/main/scala/projet/LedIp.scala +++ b/src/main/scala/projet/LedIp.scala @@ -10,7 +10,7 @@ class LedIp extends Module { val x31 = Input(UInt(64.W)) val switch = Input(UInt(4.W)) val led = Output(UInt(4.W)) - val button = Input(UInt(4.W)) + val button = Input(UInt(3.W)) val bus = new BusInterface }) @@ -27,7 +27,7 @@ class LedIp extends Module { when(io.bus.be.asUInt.orR) { // Écriture dans le registre des leds internes dinReg := io.bus.wdata }.otherwise { // Lecture des boutons poussoirs, pas de débounce car lus par le soft - btnReg := Fill(28, 0.U) ## io.button + btnReg := Fill(25, 0.U) ## io.switch ## io.button } } diff --git a/src/main/scala/projet/ZzTop.scala b/src/main/scala/projet/ZzTop.scala index c1ea765..1c730c4 100644 --- a/src/main/scala/projet/ZzTop.scala +++ b/src/main/scala/projet/ZzTop.scala @@ -7,7 +7,7 @@ class ZzTop(file: String = "", sim: Boolean = true) extends Module { // Interface debug minimale val switch = Input(UInt(4.W)) val led = Output(UInt(4.W)) - val push = Input(UInt(4.W)) + val push = Input(UInt(3.W)) // Debug simu pour ne pas s'embeter avec le switch dans le testbench val x31 = if (sim) Some(Output(UInt(64.W))) else None val valid_x31 = if (sim) Some(Output(Bool())) else None