目录
3.2.5.27 Q6b:FSM next-state logic(Exams/m2014 q6b)
3.2.5.28 Q6c:FSM one-hot next-state logic(Exams/m2014 q6c)
3.2.5.29 Q6:FSM (Exams/m2014 q6)
3.2.5.30 Q2a:FSM (Exams/2012 q2fsm)
3.2.5.31 Q2b:One-hot FSM equations(Exams/2012 q2b)
3.2.5.32 Q2a:FSM(Exams/2013 q2afsm)
3.2.5.33 Q2b:another FSM(Exams/2013 q2bfsm)
前言
HDLbits网站如下
Problem sets - HDLBits (01xz.net)
从本期开始我们继续HDLbits第三章Circuits的学习,本期的内容是Finite State Machines有限状态机的第六小节(3.2.5.27-3.2.5.33)
3.2.5.27 Q6b:FSM next-state logic(Exams/m2014 q6b)
考虑下面显示的状态机,它有一个输入W和一个输出z。
假设您希望使用三个触发器和状态代码y[3:1]=000,001,…101分别实现对应A、B...F等状态实现FSM。显示此FSM的状态分配表。推导触发器的下一状态表达式y[2]。
只实现y[2]的下一个状态逻辑。(这更像是一个FSM问题,而不是一个Verilog编码问题。哦,好吧。)
Solution:
module top_module (
input [3:1] y,
input w,
output Y2);
parameter A=0,B=1,C=2,D=3,E=4,F=5;
wire [2:0]state=y;
reg [2:0]next;
always@(*) begin
case(state)
A:next=w?A:B;
B:next=w?D:C;
C:next=w?D:E;
D:next=w?A:F;
E:next=w?D:E;
F:next=w?D:C;
default:next=A;
endcase
end
assign Y2=next[1];
endmodule
3.2.5.28 Q6c:FSM one-hot next-state logic(Exams/m2014 q6c)
考虑下面显示的状态机,它有一个输入W和一个输出z。
对于这一部分,假设使用独热码来分别为状态A,B,C,D,E,F分配‘y[6:1]=000001, 000010, 000100, 001000, 010000, 100000
为下一状态信号Y2和Y4编写一个逻辑表达式。(假设采用独热编码,通过检查推导逻辑方程。测试平台将使用非独热输入进行测试,以确保您没有尝试做更复杂的事情)。
Solution:
module top_module (
input [6:1] y,
input w,
output Y2,
output Y4);
assign Y2=~w&&y[1];
assign Y4=w&&(y[2]||y[3]||y[5]||y[6]);
endmodule
3.2.5.29 Q6:FSM (Exams/m2014 q6)
考虑下面显示的状态机,它有一个输入W和一个输出z。
实现状态机。(这一部分不在期中考试中,但编写FSMs是一个很好的做法)。
Solution:
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,next;
always@(*) begin
case(state)
A:next=w?A:B;
B:next=w?D:C;
C:next=w?D:E;
D:next=w?A:F;
E:next=w?D:E;
F:next=w?D:C;
default:next=A;
endcase
end
always@(posedge clk) begin
if(reset)
state<=A;
else
state<=next;
end
assign z =(state==E)||(state==F);
endmodule
3.2.5.30 Q2a:FSM (Exams/2012 q2fsm)
考虑下面的状态图。
编写代表此FSM的完整Verilog代码。对状态表和状态触发器使用单独的always块,就像在课堂上所做的那样。使用连续赋值语句或always块(由您自行决定)描述FSM输出z。指定您希望使用的任何状态进行编码。
Solution:
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,next;
always@(*) begin
case(state)
A:next=w?B:A;
B:next=w?C:D;
C:next=w?E:D;
D:next=w?F:A;
E:next=w?E:D;
F:next=w?C:D;
default:next=A;
endcase
end
always@(posedge clk) begin
if(reset)
state<=A;
else
state<=next;
end
assign z =(state==E)||(state==F);
endmodule
3.2.5.31 Q2b:One-hot FSM equations(Exams/2012 q2b)
考虑下面的状态图。
假设状态分配y[5:0]=000001(a)、000010(B)、000100(C)、001000(D)、010000(E)、100000(F)使用独热码
为信号Y1(state[1])编写一个逻辑表达式,为信号Y3(state[3])编写一个逻辑表达式.
(假设采用独热编码,通过检查推导逻辑方程。测试台将使用非独热输入进行测试,以确保您没有尝试做更复杂的事情)。
Solution:
module top_module (
input [5:0] y,
input w,
output Y1,
output Y3
);
assign Y1=w&&y[0];
assign Y3=~w&&(y[1]||y[2]||y[4]||y[5]);
endmodule
3.2.5.32 Q2a:FSM(Exams/2013 q2afsm)
考虑下面所示的状态图描述的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将仅接收许可。一旦设备i被FSM授予许可,只要其请求r[i]=1,该设备将继续持有资源至其将请求信号置低为止。
编写代表此FSM的完整Verilog代码。对状态表和状态触发器使用单独的always块,就像在课堂上所做的那样。使用连续赋值语句或always块(由您自行决定)描述FSM输出g[i]。指定您希望使用的任何状态进行编码。
Solution:
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,next_state;
always @(*) begin
case(state)
A: next_state = r[1] ? B : (r[2] ? C : (r[3] ? D : A));
B: next_state = r[1] ? B : A;
C: next_state = r[2] ? C : A;
D: next_state = r[3] ? D : A;
endcase
end
always @(posedge clk) begin
if(!resetn)
state <= A;
else
state <= next_state;
end
assign g = {state==D,state==C,state==B};
endmodule
3.2.5.33 Q2b:another FSM(Exams/2013 q2bfsm)
考虑用于控制某种类型电机的有限状态机。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(直到复位)。
Hint:直到f=1之后的周期,FSM才开始监控x输入。
Solution:
module top_module (
input clk,
input resetn, // active-low synchronous reset
input x,
input y,
output f,
output g
);
parameter waitrst=0,outf=1,checkx1=2,checkx2=3,checkx3=4,checky1=5,checky2=6,holdgl=7,holdgh=8;
reg [3:0]state,next;
always@(*) begin
case(state)
waitrst:next=resetn?outf:waitrst;
outf:next=checkx1;
checkx1:next=x?checkx2:checkx1;
checkx2:next=x?checkx2:checkx3;
checkx3:next=x?checky1:checkx1;
checky1:next=y?holdgh:checky2;
checky2:next=y?holdgh:holdgl;
holdgh:next=holdgh;
holdgl:next=holdgl;
endcase
end
always@(posedge clk) begin
if(~resetn)
state<=waitrst;
else
state<=next;
end
assign f = (state==outf);
assign g = (state==checky1)||(state==checky2)||(state==holdgh);
endmodule
FSM完结撒花!