Lemmings4

2023-11-02

See also: Lemmings1Lemmings2, and Lemmings3.

Although Lemmings can walk, fall, and dig, Lemmings aren't invulnerable. If a Lemming falls for too long then hits the ground, it can splatter. In particular, if a Lemming falls for more than 20 clock cycles then hits the ground, it will splatter and cease walking, falling, or digging (all 4 outputs become 0), forever (Or until the FSM gets reset). There is no upper limit on how far a Lemming can fall before hitting the ground. Lemmings only splatter when hitting the ground; they do not splatter in mid-air.

Extend your finite state machine to model this behaviour.

module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    input ground,
    input dig,
    output walk_left,
    output walk_right,
    output aaah,
    output digging ); 
	
    parameter LEFT = 3'b000,
    		DIG_L = 3'b110,
    		FALL_L = 3'b111, 
    		SPLAT = 3'b101,
    		 RIGHT = 3'b001,
    		DIG_R = 3'b010,
    		FALL_R = 3'b011;
    
    reg [2:0] state;
    reg [2:0] next_state;
    reg [4:0] cnt_fall;
    reg fall_flag;
    
    always@(posedge clk or posedge areset)
        if(areset)
            cnt_fall <= 5'd0; 
    else if(next_state == FALL_L || next_state == FALL_R)
        cnt_fall <= cnt_fall + 1;
	else 
        cnt_fall <= 0;
    
    always@(posedge clk or posedge areset)
        if(areset)
            fall_flag <=  0; 
    else if(cnt_fall == 20)
          fall_flag <= 1;
	else 
        fall_flag <= fall_flag;
    
    always@ (posedge clk or posedge areset)
        if(areset)
            state <= LEFT;
    	else 
            state <= next_state;
    
    always@(*)
        case (state)
            LEFT: 
                if(ground == 0)
                    next_state <= FALL_L;
            	else if(dig)
                	next_state <= DIG_L;
            	else if(bump_left)
                	next_state <= RIGHT;
            	else
                	next_state <= LEFT;
            DIG_L:
                if(ground == 0)
                    next_state <= FALL_L; 
            	else
                	next_state <= DIG_L;
            FALL_L:
                if(ground) begin
                   if(fall_flag)
                	next_state <= SPLAT;
                    else  
                    next_state <= LEFT;
                end
            	else
                	next_state <= FALL_L;
            SPLAT:
                next_state <= SPLAT;
            RIGHT:
                 if(ground == 0)
                    next_state <= FALL_R;
            	else if(dig)
                	next_state <= DIG_R;
            else if(bump_right)
                	next_state <= LEFT;
            	else
                	next_state <= RIGHT;
            DIG_R:
                if(ground == 0)
                    next_state <= FALL_R; 
            	else
                	next_state <= DIG_R;
            FALL_R:
              if(ground) begin
                   if(fall_flag)
                	next_state <= SPLAT;
                    else  
                    next_state <= RIGHT;
                end
            	else
                	next_state <= FALL_R;
            default:
                next_state <= LEFT;
        endcase
    
    assign walk_left = (state == LEFT);
    assign walk_right = (state == RIGHT);
    assign aaah = (state == FALL_R || state == FALL_L);
    assign digging = ((state == DIG_R || state == DIG_L ));
    
endmodule

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lemmings4 的相关文章

  • 如何在 Verilog 中将长语句分成行

    例如 我有一个很长的声明 display input data x output data x result x input data output data result 如何在 Verilog 中将其变成单语句和多行 您需要分解引用的字
  • 使用多路复用器进行双向移位

    编辑 仅通过屏幕截图 http prntscr com lv3uqw http prntscr com lv3yhf 和我下面的代码 您仍然可以在这里理解我的目标 以防万一您不想阅读文本 我正在尝试为通用移位寄存器编写 Verilog 代码
  • 如何使用 Verilog 宏模拟 $display?

    我想创建一个具有多个参数的宏 就像 display 一样 我的代码看起来像这样 但它不起作用 define format macro A write s sformatf A 这就是我调用 format macro 的方式 format m
  • Vivado 比特流消息:违反规​​则 (LUTLP-1) 组合循环

    我在串流时遇到问题 该项目旨在创建一个占空比为 1 2 的时钟 综合和实现过程中没有任何问题 我尝试了几种方法来解决它 但他们的表现并不好 module clock div clk clk out input clk output reg
  • EDAplayground 中不显示时钟波形

    当尝试在 EDA Playground 中显示时钟波形时 出现错误 执行中断或达到最大运行时间 如何显示波形 EDA Playground 上的代码 module test reg clk initial begin dumpfile du
  • 用于 Verilog 或 SystemVerilog 的 TAP(测试任何协议)模块

    是否有 TAP 测试任何协议 http testanything org Verilog 的实现 那就太好了 因为这样我就可以使用证明来自动检查我的结果 更新 10 9 09 有人问为什么不使用断言 部分 TAP 为我提供了一些很好的报告
  • 使用forever和always语句

    以下两个代码都会生成一个时钟 我需要知道除了时钟生成之外 永远循环是否还有其他用途 我只在时钟一代中遇到过永远 如果只是为了这个目的 那岂不是毫无用处 initial begin clk 0 forever begin 5 clk clk
  • 修改后的 baugh-wooley 算法乘法 verilog 代码不能正确乘法

    以下 verilog 源代码和 或测试平台可以很好地工作商业模拟器 iverilog https www edaplayground com x 3TuQ也形式化验证工具 yosys smtbmc https gist github com
  • 将枚举转换为逻辑

    考虑以下模块声明 module DFF d q CLK RESET parameter W 2 input W 1 0 d input CLK input RESET output logic W 1 0 q endmodule 当 d 和
  • 「HDLBits题解」Gates4

    本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接 Gates4 HDLBits module top module input 3 0 in out
  • 在逻辑中使用单端端口期待差异对?

    我使用的逻辑被设置为需要一个差分对时钟端口 然而 对于一个特定的应用程序 我只能输入一个单端时钟 由于硬件限制 修改逻辑以接受单端时钟不是一种选择 因为涉及许多文件和代码行 有没有办法可以输入单端端口并以某种方式将其馈送到模块的差异对端口
  • verilog 中的“<<”运算符

    我有一个verilog代码 其中有一行如下 parameter ADDR WIDTH 8 parameter RAM DEPTH 1 lt lt ADDR WIDTH 这里将存储什么RAM DEPTH以及什么是 lt lt 操作员在这里做
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • 在verilog中将wire值转换为整数

    我想将电线中的数据转换为整数 例如 wire 2 0 w 3 b101 我想要一个将其转换为 5 并将其存储在整数中的方法 我怎样才能以比这更好的方式做到这一点 j 1 for i 0 i lt 2 i i 1 begin a a w i
  • verilog $readmemh 对于 50x50 像素 RGB 图像花费太多时间

    我正在尝试编译用于 FPGA 编程的 verilog 代码 我将在其中实现 VGA 应用程序 我使用 QuartusII 和 Altera 我正在尝试正确使用 readmemh 来逐像素获取图片 现在 我已经使用 matlab 将图片转换为
  • 对象 <名称> 未声明

    这是我的代码 据我所知 LEDs被定义为 module sevenseg LEDs in output reg 6 0 LEDs input 3 0 in always in begin case in 0 LEDs 7 b1000000
  • 在 Verilog 设计中产生时钟故障

    我正在使用 Verilog 设计芯片 我有一个 3 位计数器 我希望当计数器处于第 8 次循环时 应该有一个时钟故障 之后就可以正常工作了 在 Verilog 设计中产生时钟故障的可能方法是什么 在时钟信号上注入毛刺的一种方法是使用forc
  • 如何在Verilog中将二维数组中的所有位设置为0?

    我构建了一个 8 2bits 数组来表示 Verilog 中的一块内存 reg 1 0 m 0 7 该存储器有一个复位信号 如果复位为1 则该存储器中的所有位都应重置为0 但是我不知道如何以简洁的方式设置m的所有位 因为如果有数百个内存中有
  • 在测试台中显示信号名称/文字

    是否可以在 Verilog 中引用 显示信号的名称 文字 对于在 Verilog 测试台中创建通用信号检查功能来说 这将是一个有用的功能 我知道使用 display 时 m 将打印信号的范围 是否有显示信号名称的等效项 在 Verilog
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更

随机推荐

  • 关于Collection下的removeAll方法抛出UnsupportedOperationException分析

    起因 这周在开发的过程遇到了以下这个错误 之前一直规范运用Collection的接口 所以这个异常比较少见 所以我就纳闷了 做个一个实验 package src import com google common collect Sets i
  • 《小家:越住越大2》

    第一章 餐厅如何避免杂乱 一般家庭的餐桌物品占用餐桌桌面面积普遍较高 显得餐桌杂乱 可以采用餐边柜与餐桌零距离接触方式方便杂物摆放 也可以采用移动是多层收纳车 如何避免孤单在厨房做饭 厨房与餐厅采用玻璃吊轨门连接 可以使用卡座代替普通餐椅
  • 12,verilog移位操作

    注 学习 交流就在博主的个人weixin公众号 FPGA动力联盟 留言或直接 博主weixin fpga start 私信 Verilog中的移位操作有两类 逻辑移位和算术移位 逻辑右移 gt gt 1个操作数向右移位 产生的空位用0填充
  • 毕业设计-基于深度学习的病理图像细胞核分割

    目录 前言 课题背景和意义 实现技术思路 一 相关技术介绍 二 基于双通路解码的病理图像细胞核分割 三 基于无锚检测的病理图像细胞核分割 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学
  • 函数递归

    函数递归 1 递归是什么 2 递归的限制条件 3 递归举例 4 递归与迭代 1 递归是什么 递归是指函数可以调用自身来解决问题的一种编程技巧 在C语言中 递归是通过函数调用自己来实现的 使用递归可以使某些问题更容易理解和处理 例如 计算一个
  • nginx服务器access_log日志详解

    前言 nginx的log日志分为 access log 和 error log 其中access log 记录了哪些用户 哪些页面以及用户浏览器 ip和其他的访问信息 error log 则是记录服务器错误日志 log format 日志格
  • 服务器上部署前端Vue项目代码

    服务器上部署前端Vue项目代码 本人自己感觉部署前端代码比部署后端难 主要是我在部署的过程中遇到了各种报错 写这篇文章主要是记录一下自己艰难的踩坑过程 最终部署成功 前端框架使用的是Vue3 服务器系统是CentOS7 部署的整个过程主要分
  • SpringBoot各个版本使用Redis之间的区别

    今天在springboot中使用数据库 springboot版本为2 0 2 RELEASE 通过pom引入jar包 配置文件application properties中的redis配置文件报错 提示例如deprecated config
  • 阿里云 MongoDB 的连接使用规范

    阿里云 MongoDB 的连接使用规范 概述 我们在阿里云上的 MongoDB 有两种 副本集 主 被两个节点 分片集 集群 在多个业务同时连接 MongoDB 使用时 最重要的连接数问题 一旦超过最大值即影响其它业务的使用 所以必须要规范
  • Mysql 开源数据源笔记

    DBCP C3P0数据源 tomcat内置的数据源DBCP DBCP 方式1 BasicDataSource source new BasicDataSource source setDriverClassName com mysql jd
  • allegro 遇到的问题汇总 避免忘记

    目录 目录 1 已经布板后如何更新封装 2 如何批量放置VIA 3 如何替换某个过孔 4 OrCAD跟Allegro交互设置 5 在制作封装时 如何修改封装引脚的PIN Number 6 ORCAD画原理图时 off page connec
  • Linux关机命令详解

    在linux下一些常用的关机 重启命令有shutdown halt reboot 及init 它们都可以达到重启系统的目的 但每个命令的内部工作过程是不同的 Linux centos重启命令 1 reboot 2 shutdown r no
  • 表格与表单的嵌套关系

    表格与表单的嵌套关系 想要用表格与表单做一个注册界面 却对这两个元素的嵌套关系挡住的脚步 到底是表格里面放置表单呢 还是表单里面放置表格呢 没关系 小马哥带你答疑解惑 1 首先我们可以创建一个空表单 在这个表单里面不用放任何东西 2 然后我
  • selenium自动化环境搭建(Windows)

    一 selenium介绍 selenium主要用于web应用程序的自动化测试 还支持所有基于web的管理任务自动化 selenium经历了2个版本 selenium1 0和selenium2 0 selenium不是一个单独的工具 而是由一
  • 如何对Docker容器进行健康检查

    如何对 Docker 容器进行健康检查 熟悉使用过kubernetes的人应该知道 kubernetes支持对pod进行健康检查的功能 这对生产业务来说其实是非常有用处的 能快速发现服务不可用 并进行快速重启恢复 其实不使用kubernet
  • 局域网设备查找和发现,局域网软件在线更新,Qt udp组播

    使用udp组播原因 想要实现查找局域网自己的设备 但是不知道存在设备的ip 局域网软件在线更新 不想固定服务器的ip地址 因为是开发人员电脑 ip可能随时在变化 比较了广播 组播的优缺点 最终选择组播 组播优点 组播技术的初衷是在IP网络中
  • C++14新特性

    C 14 维基百科 C 14是C 的现行标准的非正式名称 正式名称为 International Standard ISO IEC 14882 2014 E Programming Language C C 14旨在作为C 11的一个小扩展
  • oracle的备份与恢复(一)

    author skate time 2010 09 06 oracle的备份与恢复 基于我个人的理解把恢复分为来两大类 1 基于备份的恢复 这种基于备份饿恢复是指通过备份文件 redo archivelog等来实现备份 2 没有备份的恢复
  • HyperLogLog(关于基数统计)

    写在前面 今天在复习Redis的一种在Redis 2 8 9 版本更新的结构的时候 知道了这个数据结构是基于一种优秀的算法HyperLogLog 基数统计算法 简单来说就是统计集合中的元素数量 但是对比set有了很大的优化 就去了解了一下这
  • Lemmings4

    See also Lemmings1 Lemmings2 and Lemmings3 Although Lemmings can walk fall and dig Lemmings aren t invulnerable If a Lem