专栏首页数字积木HDLBits:在线学习 Verilog (二十六 · 127-130)

HDLBits:在线学习 Verilog (二十六 · 127-130)

本系列内容来自于知乎专栏,链接如下:https://zhuanlan.zhihu.com/c_1131528588117385216 本系列文章将和读者一起巡礼数字逻辑在线学习网站 HDLBits 的教程与习题,并附上解答和一些作者个人的理解,相信无论是想 7 分钟精通 Verilog,还是对 Verilog 和数电知识查漏补缺的同学,都能从中有所收获。

Problem 127 Lemmings1

游戏旅鼠涉及到有非常简单的大脑的生物,我们将会使用有限状态机(FSM)对其建模。

在旅鼠的2D世界中,旅鼠只有两种状态:向左走和向右走。当它遇到一个障碍物的时候,会转变方向。特别是,如果旅鼠被左侧撞到,它将会向右走,被右侧撞到,将会向左走。如果被两侧撞到,它依然会转换方向。

用两状态,两输入,一输出的摩尔型状态机对其行为建模。

module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    output walk_left,
    output walk_right); //
    parameter LEFT=0, RIGHT=1;
    reg state, next_state;
    always @(*) begin
        case(state)
            LEFT: next_state = bump_left ? RIGHT:LEFT;
            RIGHT:next_state = bump_right? LEFT:RIGHT;
        endcase// State transition logic
    end
    always @(posedge clk, posedge areset) begin
        if(areset) state <= LEFT;
        else state<=next_state;// State flip-flops with asynchronous reset
    end
    assign walk_left = (state==LEFT);
    assign walk_right= (state==RIGHT);

    // Output logic
    // assign walk_left = (state == ...);
    // assign walk_right = (state == ...);

endmodule

Problem 128 Lemmings2

除了向左和向右,旅鼠在它们脚下地面消失的时候还会掉落(发出“aaah!”)。地面重新出现的时候,旅鼠将会沿着掉落之前的方向继续行走。当旅鼠在地面消失的时候被碰撞(还没有掉落),不会影响步行方向,或者当地面重新出现但旅鼠仍在掉落过程中时,也不会影响步行方向。

用有限状态机(FSM)对此次行为建模。

module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    input ground,
    output walk_left,
    output walk_right,
    output aaah );
    reg [1:0]state,next;
    parameter WL=0,WR=1,FL=2,FR=3;
    always @(*)
        begin
        case(state)
            WL: next = ground? ( bump_left ? WR:WL):FL;
            WR: next = ground? ( bump_right? WL:WR):FR;
            FL: next = ground? WL : FL;
            FR: next = ground? WR : FR;
        endcase
        end
    always @(posedge clk or posedge areset)
        if(areset) state <= WL;
        else state <= next;
    always @(*)
        case(state)
            WL:  {walk_left,walk_right,aaah}=3'b100;
            WR:  {walk_left,walk_right,aaah}=3'b010;
            FL:  {walk_left,walk_right,aaah}=3'b001;
            FR:  {walk_left,walk_right,aaah}=3'b001;
        endcase
    
            
endmodule

Problem 129 Lemmings3

除了走路和掉落外,旅鼠有时候还能做些有用的事情,比如挖洞(当dig=1时,开始挖洞)

旅鼠在地面的时候(ground=1)它能挖洞,直到到达地面的另一边(ground=0)。在那时,由于没有地面,旅鼠将会下落(发出“aaah”),当它再一次到达地面的时候,继续按照它原来的方向行走。和掉落一样,挖洞过程中被撞击不受影响,而且掉落或者没有地面的时候挖洞命令将会被忽视。

(换句话说,旅鼠能下落、挖洞、或者转变方向。如果多个条件同时满足,优先级是:下落>挖洞>转换方向),扩展你的有限状态机模型来建模其行为。

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 WL=0,WR=1,FL=2,FR=3,DL=4,DR=5;
    reg [2:0]state,next;
    //state transtition logic
    always @(*)
        begin
            case(state)
                WL: next = ground? (dig? DL : (bump_left? WR:WL) ):FL;
                WR: next = ground? (dig? DR : (bump_right?WL:WR) ):FR;
                FL: next = ground? WL : FL;
                FR: next = ground? WR : FR;
                DL: next = ground? DL : FL;
                DR: next = ground? DR : FR;
            endcase
        end
    always @(posedge clk or posedge areset)
        if(areset) state <= WL;
    	else state <= next;
    always @(*)
        case(state)
            WL: {walk_left,walk_right,aaah,digging} = 4'b1000;
            WR: {walk_left,walk_right,aaah,digging} = 4'b0100;
            FL: {walk_left,walk_right,aaah,digging} = 4'b0010;
            FR: {walk_left,walk_right,aaah,digging} = 4'b0010;
            DL: {walk_left,walk_right,aaah,digging} = 4'b0001;
            DR: {walk_left,walk_right,aaah,digging} = 4'b0001;
        endcase
endmodule

Problem 130 Lemmings4

尽管旅鼠能够行走,掉落,挖洞,但也并非无懈可击。如果旅鼠下落过程过长在落到地面,它会飞溅。特别地,如果旅鼠下落超过20个周期再下落到地面,它将会飞溅,停止行走,掉落和挖掘(所有的4个输出都将为0),除非FSM复位。旅鼠能够下落多远没有上限。旅鼠仅仅会在落到地面的时候飞溅,而不会在半空飞溅。

扩展你的有限状态机模型来建模其行为。

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 WL=0,WR=1,FL=2,FR=3,DL=4,DR=5,Splat = 6;
    reg [64:0]counter;
    reg [2:0]state,next;
    always @(*)
        case(state)
            WL: next = ground ? (dig ? DL: (bump_left?WR:WL)) : FL;
            WR: next = ground ? (dig ? DR: (bump_right?WL:WR)) : FR;
            FL: next = ground ? (counter>19? Splat : WL) : FL;
            FR: next = ground ? (counter>19? Splat : WR): FR;
            DL: next = ground ? DL : FL;
            DR: next = ground ? DR : FR;
            Splat:next = Splat;
        endcase
    always @(posedge clk or posedge areset)
        begin
        if(areset) state<=WL;
        else if  ( state==FL || state == FR )
                          begin
                              state <= next;
                              counter = counter + 1;
                          end
 
        else begin 
            state <= next;
            counter =0;
        end
        end
            
    always @(*)
        case(state)
            WL : {walk_left,walk_right,aaah,digging} = 4'b1000;
            WR : {walk_left,walk_right,aaah,digging} = 4'b0100;
            FL : {walk_left,walk_right,aaah,digging} = 4'b0010;
            FR : {walk_left,walk_right,aaah,digging} = 4'b0010;
            DL : {walk_left,walk_right,aaah,digging} = 4'b0001;
            DR : {walk_left,walk_right,aaah,digging} = 4'b0001;
            Splat: {walk_left,walk_right,aaah,digging} = 4'b0000;
        endcase 
    
endmodule

本文分享自微信公众号 - 数字积木(ggreat-top)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HDLBits:在线学习 Verilog (二十七 · Problem 130-134)

    前面Problem 125 Simple one-hot state transtion 3应该已经介绍过独热one-hot编码方式。这是一种生成逻辑最为简单的...

    数字积木
  • HDLBits:在线学习 Verilog (十六 · Problem 75 - 79)

    一个4输入a, b, c, d和一输出的逻辑电路,当输入为2, 7或15时,输出为1, 当输入为0, 1, 4, 5, 6, 9, 10, 13, 或 14 时...

    数字积木
  • HDLBits:在线学习 Verilog (二十二 · Problem 105 - 109)

    用计数器设计一个带am/pm的12小时时钟。该计数器通过一个CLK进行计时,用ena使能信号来驱动时钟的递增。

    数字积木
  • HDLBits:在线学习 Verilog (二十 · Problem 95 - 99)

    在一个8bit的变量中,从一个周期到另一个周期期间,检测输入信号变化。即上升沿变化或下降沿变化。输出应在0变为1后产生。

    数字积木
  • HDLBits:在线学习 Verilog (十二 · Problem 55 - 59)

    假设你正在设计一个电路来控制手机的振铃器和振动电机。当手机来电时(input ring),电路必须把震动( output motor = 1 )或响铃( out...

    数字积木
  • HDLBits: 在线学习 Verilog (〇)

    首先送上传送门。 作者今天被安利了一个很棒的 Verilog 学习网站:HDLBits 。然后发现知乎上还没有与 HDLBits 相关的话题,便写下这篇文章向大...

    数字积木
  • HDLBits:在线学习 Verilog (二十一 · Problem 100 - 104)

    设计一个0~9的计数器,共10个周期。该计数器采用同步复位且复位为0。但是本题是希望该计数器并不是随着clk的变化而递增,而是随着一个slowena使能信号来控...

    数字积木
  • HDLBits:在线学习 Verilog (二十八 · Problem 135-139)

    Problem 135 PS/2 packet parser and datapath / Fsm ps2data

    数字积木
  • HDLBits:在线学习 Verilog (二十三 · Problem 110-114)

    相比于上一题 5-bit 线性移位寄存器,本题原理上相同,但作者希望我们结合实际的板子(DE1-SoC,可能是一个教学板)和其外部接口(KEY&LED),实现一...

    数字积木
  • HDLBits:在线学习 Verilog (二十四 · Problem 115-119)

    下表更详细地给出了跳变的规则,(可以视为状态转移表),元素下一个状态可以视作输出,输入为元素本身的状态与相应两个相邻元素的当前状态。

    数字积木
  • HDLBits:在线学习 Verilog (二十九 · Problem 140-144)

    Problem 140 Serial two's complementer (Mealy FSM)

    数字积木
  • HDLBits:在线学习Verilog(六 · Problem 25-29)

    在本题中,您将描述一个具有两级层次结构的电路。在top_module中,实例化两个add16模块(已为您提供),每个add16中实例化16个add1实例(此模块...

    数字积木
  • HDLBits:在线学习 Verilog (一 · Problem 0-9)

    本文是系列文章的第一篇,讨论下前十道习题和解答,HDLBits 共有约 180 题。Step one - HDLBits

    数字积木
  • HDLBits:在线学习 Verilog (十 · Problem 45 - 49)

    解析:如上图所示, 一个异或门,一个同或门,我声明一个wire型的temp来存放同或门的输出。

    数字积木
  • HDLBits:在线学习 Verilog (二 · Problem 10-14)

    什么是 Verilog 中的向量(vector)?向量是一组 wire 信号的集合,通过赋予这一组信号的集合一个名称,以便于访问其中的 wire 信号。

    数字积木
  • HDLBits:在线学习 Verilog (十九 · Problem 90 - 94)

    我们用3个包含触发器和多路选择器的子模块来实现图中电路。题目要求我们写出包含一个触发器和一个多路选择器的子模块。

    数字积木
  • HDLBits:在线学习 Verilog (十三 · Problem 60-64)

    Problem 60 : 2-to-1 multiplexer (Mux2to1)

    数字积木
  • HDLBits:在线学习 Verilog (十四 · Problem 65-69)

    本题中需要实现一个 2 进制 1bit 加法器,加法器将输入的两个 1bit 数相加,产生两数相加之和以及进位。

    数字积木
  • HDLBits:在线学习 Verilog (十五 · Problem 70 - 74)

    题目要求我们创建一个100bit的二进制的加法器,该电路共包含两个100bit的输入和一个cin, 输出产生sum和cout。

    数字积木

扫码关注云+社区

领取腾讯云代金券