HDLBits 系列(35)Lemmings Game

举报
李锐博恩 发表于 2021/07/15 04:13:43 2021/07/15
【摘要】 目录 背景 Lemmings1 前言 原题复现 我的设计 Lemmings2 Lemmings3 背景 这是一个Lemmings的简单游戏,我们通过状态机可以设计这个游戏,从简单到复杂,一步一步实现这个游戏。 Lemmings1 前言 Lemmings1想要往左走,可是遇到左侧的障碍后,便向右转向;在向右走的过程中,如果遇到右侧的障碍,同理左转向。...

目录

背景

Lemmings1

前言

原题复现

我的设计

Lemmings2

Lemmings3


背景

这是一个Lemmings的简单游戏,我们通过状态机可以设计这个游戏,从简单到复杂,一步一步实现这个游戏。


Lemmings1

前言

Lemmings1想要往左走,可是遇到左侧的障碍后,便向右转向;在向右走的过程中,如果遇到右侧的障碍,同理左转向。头脑简单的Lemmings要么左走,要么右走,两种状态。

原题复现

原题点此传送:

The game Lemmings involves critters with fairly simple brains. So simple that we are going to model it using a finite state machine.

In the Lemmings' 2D world, Lemmings can be in one of two states: walking left or walking right. It will switch directions if it hits an obstacle. In particular, if a Lemming is bumped on the left, it will walk right. If it's bumped on the right, it will walk left. If it's bumped on both sides at the same time, it will still switch directions.

Implement a Moore state machine with two states, two inputs, and one output that models this behaviour.


  
  1. module top_module(
  2. input clk,
  3. input areset, // Freshly brainwashed Lemmings walk left.
  4. input bump_left,
  5. input bump_right,
  6. output walk_left,
  7. output walk_right);

我的设计

设计我的Lemmings:


  
  1. module top_module(
  2. input clk,
  3. input areset, // Freshly brainwashed Lemmings walk left.
  4. input bump_left,
  5. input bump_right,
  6. output walk_left,
  7. output walk_right); //
  8. parameter LEFT=0, RIGHT=1;
  9. reg state, next_state;
  10. always @(*) begin
  11. // State transition logic
  12. case(state)
  13. LEFT: begin
  14. if(bump_left) next_state = RIGHT;
  15. else next_state = LEFT;
  16. end
  17. RIGHT: begin
  18. if(bump_right) next_state = LEFT;
  19. else next_state = RIGHT;
  20. end
  21. default: begin
  22. next_state = LEFT;
  23. end
  24. endcase
  25. end
  26. always @(posedge clk, posedge areset) begin
  27. // State flip-flops with asynchronous reset
  28. if(areset) begin
  29. state <= LEFT;
  30. end
  31. else begin
  32. state <= next_state;
  33. end
  34. end
  35. always@(*) begin
  36. case(state)
  37. LEFT: begin
  38. walk_left = 1;
  39. walk_right = 0;
  40. end
  41. RIGHT: begin
  42. walk_right = 1;
  43. walk_left = 0;
  44. end
  45. default: begin // almost impossible
  46. walk_left = 0;
  47. walk_right = 0;
  48. end
  49. endcase
  50. end
  51. // Output logic
  52. // assign walk_left = (state == ...);
  53. // assign walk_right = (state == ...);
  54. endmodule

我设计的Lemmings,就是两个状态,处于LEFT状态,则向左走,处于RIGHT状态,也就向右走,复位则向左走。

输出仅仅和当前处于那个状态有关,而状态的切换,也是看当前状态下有没有当前方向的阻碍,例如在LEFT状态下,存在bump_left,则下一个时钟状态切换到RIGHT,固然,Lemmings也就向右走。

测试成功。


Lemmings2

 

 

 

 

 


Lemmings3

 

 

 

 

 

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/103455913

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。