HDLBits刷题合集—19 Finite State Machines-5
HDLBits刷题合集—19 Finite State Machines-5
HDLBits-146 Exams/m2014 q6b
Problem Statement
考虑下面显示的状态机,它有一个输入w和一个输出z。
文章图片
假设你希望使用三个触发器和状态码y [3:1] = 000、001,…,101分别用于状态A,B,…,F来实现FSM。 显示此FSM的状态分配表。 推导触发器y[2]的次态表达式。
仅实现y[2]的下一状态逻辑。
状态转换表如下所示:
文章图片
代码如下:
module top_module (
input [3:1] y,
input w,
output Y2);
parameter A=3'b000, B=3'b001, C=3'b010, D=3'b011, E=3'b100, F=3'b101;
reg [3:1] state_next;
always @(*) begin
case (y)
A : begin
if (w) state_next <= A;
elsestate_next <= B;
end
B : begin
if (w) state_next <= D;
elsestate_next <= C;
end
C : begin
if (w) state_next <= D;
elsestate_next <= E;
end
D : begin
if (w) state_next <= A;
elsestate_next <= F;
end
E : begin
if (w) state_next <= D;
elsestate_next <= E;
end
F : begin
if (w) state_next <= D;
elsestate_next <= C;
end
default :state_next <= A;
endcase
endassign Y2 = state_next[2];
endmodule
HDLBits-147 Exams/m2014 q6c
Problem Statement
考虑下面显示的状态机,它有一个输入w和一个输出z。

文章图片
对于此部分,假设使用独热码分别为状态A,B,…,F编码,状态分配为y [6:1] = 000001、000010、000100、001000、010000、100000。
编写次态信号y2和y4的逻辑表达式。
代码如下:
module top_module (
input [6:1] y,
input w,
output Y2,
output Y4);
parameter A=6'b000001, B=6'b000010, C=6'b000100;
parameter D=6'b001000, E=6'b010000, F=6'b100000;
reg [6:1] state_next;
always @(*) begin
case (y)
A : begin
if (w) state_next <= A;
elsestate_next <= B;
end
B : begin
if (w) state_next <= D;
elsestate_next <= C;
end
C : begin
if (w) state_next <= D;
elsestate_next <= E;
end
D : begin
if (w) state_next <= A;
elsestate_next <= F;
end
E : begin
if (w) state_next <= D;
elsestate_next <= E;
end
F : begin
if (w) state_next <= D;
elsestate_next <= C;
end
default :state_next <= A;
endcase
endassign Y2 = y[1] & ~w;
assign Y4 = (y[2] & w) | (y[3] & w) | (y[5] & w) | (y[6] & w);
endmodule
HDLBits-148 Exams/m2014 q6
【HDLBits刷题合集—19 Finite State Machines-5】Problem Statement
考虑下面显示的状态机,它有一个输入w和一个输出z。

文章图片
实现这个状态机。
代码如下:
module top_module (
input clk,
input reset,// synchronous reset
input w,
output z);
parameter A=0, B=1, C=2, D=3, E=4, F=5;
reg [2:0] state, state_next;
always @(*) begin
case (state)
A : begin
if (w) state_next = A;
elsestate_next = B;
end
B : begin
if (w) state_next = D;
elsestate_next = C;
end
C : begin
if (w) state_next = D;
elsestate_next = E;
end
D : begin
if (w) state_next = A;
elsestate_next = F;
end
E : begin
if (w) state_next = D;
elsestate_next = E;
end
F : begin
if (w) state_next = D;
elsestate_next = C;
end
default :state_next = A;
endcase
endalways @(posedge clk)
begin
if (reset) state <= A;
elsestate <= state_next;
endassign z = (state == E) | (state == F);
endmodule
HDLBits-149 Exams/2012 q2fsm
Problem Statement
考虑下面显示的状态机。

文章图片
编写代表此FSM的完整Verilog代码。 对状态表和状态触发器使用单独的Always块。 使用连续赋值语句或Always块描述FSM的输出z。 状态编码随你心意。
代码如下:
module top_module (
input clk,
input reset,// Synchronous active-high reset
input w,
output z
);
parameter A=0, B=1, C=2, D=3, E=4, F=5;
reg [2:0] state, state_next;
always @(*) begin
case (state)
A : begin
if (w) state_next <= B;
elsestate_next <= A;
end
B : begin
if (w) state_next <= C;
elsestate_next <= D;
end
C : begin
if (w) state_next <= E;
elsestate_next <= D;
end
D : begin
if (w) state_next <= F;
elsestate_next <= A;
end
E : begin
if (w) state_next <= E;
elsestate_next <= D;
end
F : begin
if (w) state_next <= C;
elsestate_next <= D;
end
default : state_next <= A;
endcase
end always @(posedge clk)
begin
if (reset) state <= A;
elsestate <= state_next;
endassign z = (state == E) | (state == F);
endmodule
HDLBits-150 Exams/2012 q2b
Problem Statement
考虑下面显示的状态机。

文章图片
假设使用独热码进行状态分配,y [5:0] = 000001(A),000010(B),000100(C),001000(D),010000(E),100000(F)
写出状态触发器y [1]输入Y1的逻辑表达式。
写出状态触发器y [3]输入Y3的逻辑表达式。
代码如下:
module top_module (
input [5:0] y,
input w,
input clk,
input reset,
output Y1,
output Y3
);
parameter A=6'b000001, B=6'b000010, C=6'b000100;
parameter D=6'b001000, E=6'b010000, F=6'b100000;
reg [5:0] state, state_next;
always @(*) begin
case (state)
A : begin
if (w) state_next <= B;
elsestate_next <= A;
end
B : begin
if (w) state_next <= C;
elsestate_next <= D;
end
C : begin
if (w) state_next <= E;
elsestate_next <= D;
end
D : begin
if (w) state_next <= F;
elsestate_next <= A;
end
E : begin
if (w) state_next <= E;
elsestate_next <= D;
end
F : begin
if (w) state_next <= C;
elsestate_next <= D;
end
default : state_next <= A;
endcase
end always @(posedge clk)
begin
if (reset) state <= A;
elsestate <= state_next;
endassign Y1 = w & y[0];
assign Y3 = ~w & (y[1] | y[2] | y[4] | y[5]);
endmodule
HDLBits-151 Exams/2013 q2afsm
Problem Statement
考虑以下状态图描述的FSM:

文章图片
该FSM充当仲裁器电路,该电路控制三个请求设备对某种类型资源的访问。每个设备通过设置信号r [i] = 1来请求资源,其中r [i]为r [1],r [2]或r [3]。
每个r [i]是FSM的输入信号,代表三个设备之一。只要没有请求,FSM就会保持状态A。当发生一个或多个请求时,FSM决定哪个设备接收到使用该资源的授权,并更改为将该设备的g [i]信号设置为1的状态。
每个g [i]是FSM的输出。有一个优先级系统,即设备1的优先级高于设备2的优先级,而设备3的优先级最低。因此,例如,当FSM处于状态A时,如果设备3是唯一发出请求的设备,则设备3将仅接收授权。一旦设备(即,FSM给了设备i)授权,该设备将继续接收授权,只要它的请求r [i] = 1。
编写代表此FSM的完整Verilog代码,对状态表和状态触发器使用单独的Always块。使用连续赋值语句或Always块(自行决定)描述FSM输出g [i]。状态分配随你所意。
代码如下:
module top_module (
input clk,
input resetn,// active-low synchronous reset
input [3:1] r,// request
output [3:1] g// grant
);
parameter A=0, B=1, C=2, D=3;
reg [1:0] state, state_next;
always @(*) begin
case (state)
A : begin
if (r[1])
state_next <= B;
else if (~r[1] & r[2])
state_next <= C;
else if (~r[1] & ~r[2] &r[3])
state_next <= D;
else
state_next <= A;
end
B : begin
if (r[1]) state_next <= B;
elsestate_next <= A;
end
C : begin
if (r[2]) state_next <= C;
elsestate_next <= A;
end
D : begin
if (r[3]) state_next <= D;
elsestate_next <= A;
end
default :state_next <= A;
endcase
endalways @(posedge clk)
begin
if (!resetn) state <= A;
elsestate <= state_next;
endassign g = {state == D,state == C,state == B};
endmodule
HDLBits-152 Exams/2013 q2bfsm
Problem Statement
考虑用于控制某种类型电动机的有限状态机。 FSM具有来自电动机的输入x和y,并产生控制电动机的输出f和g。还有一个时钟输入clk和一个复位输入resetn。
FSM必须按以下方式工作。只要复位输入有效,FSM就会保持在开始状态(称为状态A)。取消复位信号后,在下一个时钟沿之后,FSM必须在一个时钟周期内将输出f设置为1。然后,FSM必须监视x输入。当x在三个连续的时钟周期中产生值1,0,1时,则应在下一个时钟周期将g设置为1。在保持g = 1的同时,FSM必须监视y输入。如果y在最多两个时钟周期内的值为1,则FSM应永久保持g = 1(即直到复位)。但是,如果y在两个时钟周期内未变为1,则FSM应永久设置g = 0(直到复位)。
代码如下:
module top_module (
input clk,
input resetn,// active-low synchronous reset
input x,
input y,
output f,
output g
);
parameter A=0, B=1, C=2, D=3, E=4, F=5, G=6,H=7, I=8;
reg [3:0] state, state_next;
always @(*) begin
case (state)
A : begin
state_next <= B;
end
B : begin
state_next <= C;
end
C : begin
if (x) state_next <= D;
elsestate_next <= C;
end
D : begin
if (x) state_next <= D;
elsestate_next <= E;
end
E : begin
if (x) state_next <= F;
elsestate_next <= C;
end
F : begin
if (y) state_next <= H;
elsestate_next <= G;
end
G : begin
if (y)state_next <= H;
elsestate_next <= I;
end
H : begin
state_next <= H;
end
I : begin
state_next <= I;
end
endcase
endalways @(posedge clk)
begin
if (!resetn) state <= A;
elsestate <= state_next;
endassign f = (state == B);
assign g = (state == F) | (state == H) | (state == G);
endmodule
Note
新手一枚,主要分享博客,记录学习过程,后期参考大佬代码或思想会一一列出。欢迎大家批评指正!
推荐阅读
- CSS3效果合集
- 刷题记录|【蓝桥必胜】试题 算法训练 kAc给糖果你吃-贪心排序
- 23班12月第二次作业雨合集
- 龙城四少出道合集(06)
- LeetCode刷题笔记|LeetCode刷题笔记 - 反转字符串
- 惊蛰节日
- 2019年奇葩新闻合集,个个都是人才(二)
- 2022年程序员面试谈薪技巧及Android面试题大合集,你想要的都在这~
- 2022年,程序员如何在面试前刷题,顺利入职大厂()
- 考研刷题小程序云开发实战-基础知识储备(1)