# HDLBits：在线学习 Verilog （二十六 · 127-130)

Problem 127 Lemmings1

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

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

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

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

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

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 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。