1.Exams/2014 q3fsm
考虑具有输入s和w的有限状态机。假设FSM开始于称为a的重置状态,如下所示。只要s=0,FSM保持在状态A,当s=1时,FSM移动到状态B。
一旦处于状态B,FSM在接下来的三个时钟周期内检查输入w的值。如果在其中两个时钟周期中w=1,则FSM必须在下一个时钟周期中将输出z设置为1。否则,z必须为0。FSM在接下来的三个时钟周期内继续检查w,依此类推。下面的时序图说明了不同w值的z所需值。使用尽可能少的状态。请注意,s输入仅在状态A中使用,因此您只需要考虑w输入。
module top_module (
input clk,
input reset, // Synchronous reset
input s,
input w,
output z
);
parameter A=1'b0,B=1'b1;
reg state,next_state;
reg [1:0]counter;
always@(posedge clk)begin
if(reset)
state<=A;
else
state<=next_state;
end
always@(*)begin
case(state)
A:next_state=s?B:A;
B:next_state=B;
default:next_state=A;
endcase
end
//计数器模块
always@(posedge clk)begin
if(reset)begin
counter<=2'd0;
end else if(state==B)begin
if(counter==2'd2)begin
counter<=2'd0;
end else begin
counter<=counter+1'b1;
end
end## 标题
end
reg [1:0]w2;
//序列检测
always@(posedge clk)begin
if(reset)begin
w2<=2'b0;
end else if(state==B)begin
w2<={w2[0],w};
end else begin
w2<=2'b0;
end
end
always@(posedge clk)begin
if(reset)begin
z<=1'b0;
end else if(state==B&&counter==2'd2&&(({w2,w}==3'b110)|({w2,w}==3'b101)|({w2,w}==3'b011)))begin
z<=1'b1;
end else begin
z<=1'b0;
end
end
endmodule
2.Exams/2014 q3bfsm
给定如下所示的状态分配表,实现有限状态机。重置应将FSM重置为状态000。
module top_module (
input clk,
input reset, // Synchronous reset
input x,
output z
);
parameter A=3'b000,B=3'b001,C=3'b010,D=3'b011,E=3'b100;
reg [2:0]state,next_state;
always@(posedge clk)begin
if(reset)
state<=A;
else
state<=next_state;
end
always@(*)begin
case(state)
A:next_state=x?B:A;
B:next_state=x?E:B;
C:next_state=x?B:C;
D:next_state=x?C:B;
E:next_state=x?E:D;
default:next_state=A;
endcase
end
assign z=(state==D)|(state==E);
endmodule
2.Exams/2014 q3c
给定如下所示的状态分配表,实现逻辑函数Y[0]和z。
module top_module (
input clk,
input [2:0] y,
input x,
output Y0,
output z
);
parameter A=3'b000,B=3'b001,C=3'b010,D=3'b011,E=3'b100;
reg [2:0]next_state;
always@(*)begin
case(y)
A:next_state=x?B:A;
B:next_state=x?E:B;
C:next_state=x?B:C;
D:next_state=x?C:B;
E:next_state=x?E:D;
default:next_state=A;
endcase
end
assign z=(y==D)|(y==E);
assign Y0=(next_state==B|next_state==D);
endmodule
4.Exams/m2014 q6b
考虑如下所示的状态机,它有一个输入w和一个输出z。
假设您希望使用三个触发器和状态代码y[3:1]=000、001、…、101分别实现状态A、B、…、F的FSM。显示此FSM的状态分配表。推导触发器的下一状态表达式y[2]。
仅实现y[2]的下一状态逻辑。(这更像是一个FSM问题,而不是Verilog编码问题。哦,好吧。)
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;
assign Y2=(~w&y[3:1]==B)|(y[3:1]==F&~w)|(y[3:1]==C&w)|(y[3:1]==B&w)|(y[3:1]==E&w)|(y[3:1]==F&w);
endmodule
5.Exams/m2014 q6c
运行正确:
module top_module (
input [6:1] y,
input w,
output Y2,
output Y4);
parameter A=6'b000001,B=6'b000010,C=6'b000100,
D=6'b001000,E=6'b010000,F=6'b100000;
assign Y2=~w&y[1];
assign Y4=w&(y[2]|y[3]|y[5]|y[6]);
endmodule
这个运行出来是错的,但是不知道原因。希望有大佬能指点下
module top_module (
input [6:1] y,
input w,
output Y2,
output Y4);
parameter A=6'b000001,B=6'b000010,C=6'b000100,
D=6'b001000,E=6'b010000,F=6'b100000;
assign Y2=(~w&y[6:1]==A);
assign Y4=(w&y[6:1]==B)|(w&y[6:1]==C)|(w&y[6:1]==E)|(w&y[6:1]==F);
endmodule
6.Exams/m2014 q6
module top_module (
input clk,
input reset, // synchronous reset
input w,
output z);
parameter A=6'b000001,B=6'b000010,C=6'b000100,
D=6'b001000,E=6'b010000,F=6'b100000;
reg[5:0] state,next_state;
always@(posedge clk)begin
if(reset)
state<=A;
else
state<=next_state;
end
always@(*)begin
case(state)
A:next_state=w?A:B;
B:next_state=w?D:C;
C:next_state=w?D:E;
D:next_state=w?A:F;
E:next_state=w?D:E;
F:next_state=w?D:C;
default:next_state=A;
endcase
end
always@(*)begin
if(state==E||state==F)
z=1'b1;
else
z=1'b0;
end
endmodule
7.Exams/2012 q2fsm
编写表示此FSM的完整Verilog代码。对状态表和状态触发器使用单独的always块,如在课堂上所做的。使用连续赋值语句或always块(由您自行决定)描述FSM输出,称为z。指定要使用的任何状态代码。
module top_module (
input clk,
input reset, // Synchronous active-high reset
input w,
output z
);
parameter A=3'd0,B=3'd1,C=3'd2,D=3'd3,E=3'd4,F=3'd5;
reg[2:0]state,next_state;
always@(posedge clk)begin
if(reset)
state<=A;
else
state<=next_state;
end
always@(*)begin
case(state)
A:next_state=w?B:A;
B:next_state=w?C:D;
C:next_state=w?E:D;
D:next_state=w?F:A;
E:next_state=w?E:D;
F:next_state=w?C:D;
default:next_state=A;
endcase
end
always@(posedge clk)begin
if(reset)
z<=1'b0;
else if(next_state==E||next_state==F)
z<=1'b1;
else
z<=1'b0;
end
endmodule
8.Exams/2012 q2b
module top_module (
input [5:0] y,
input w,
output Y1,
output Y3
);
parameter A=6'b000001,B=6'b000010,C=6'b000100,
D=6'b001000,E=6'b010000,F=6'b100000;
assign Y1=(y[0]&w);
assign Y3=~w&(y[1]|y[2]|y[4]|y[5]);
endmodule
9.Exams/2013 q2afsm
该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的优先级最低。因此,例如,如果设备3是FSM处于状态a时发出请求的唯一设备,则设备3将仅接收授权。一旦设备i被FSM授予授权,只要其请求r[i]=1,该设备将继续接收授权。
编写表示此FSM的完整Verilog代码。对状态表和状态触发器使用单独的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=4'b0001,B=4'b0010,C=4'b0100,D=4'b1000;
reg [3:0]state,next_state;
always@(posedge clk)begin
if(resetn==1'b0)
state<=A;
else
state<=next_state;
end
always@(*)begin
case(state)
A:if(r[1])
next_state=B;
else if((!r[1])&r[2])
next_state=C;
else if((!r[1])&(!r[2])&r[3])
next_state=D;
else
next_state=A;
B:if(r[1])
next_state=B;
else
next_state=A;
C:if(r[2])
next_state=C;
else
next_state=A;
D:if(r[3])
next_state=D;
else
next_state=A;
default:next_state=A;
endcase
end
assign g[3]=(state==D);
assign g[2]=(state==C);
assign g[1]=(state==B);
endmodule
10.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(直到重置)。
(原始试题只要求提供状态图。但在这里,实现FSM。)
module top_module (
input clk,
input resetn, // active-low synchronous reset
input x,
input y,
output f,
output g
);
parameter IDLE=9'd1,SET_F=9'd2,S1=9'd3,S2=9'd4,S3=9'd5,S4=9'd6,S5=9'd7,KEEP1=9'd8,KEEP0=9'd9;
reg [8:0]state,next_state;
always@(posedge clk)begin
if(resetn==1'b0)
state<=IDLE;
else
state<=next_state;
end
always@(*)begin
case(state)
IDLE:next_state=SET_F;
SET_F:next_state=S1;
S1:next_state=x?S2:S1;
S2:next_state=x?S2:S3;
S3:next_state=x?S4:S1;
S4:next_state=y?KEEP1:S5;
S5:next_state=y?KEEP1:KEEP0;
KEEP1:next_state=KEEP1;
KEEP0:next_state=KEEP0;
default:next_state=IDLE;
endcase
end
assign f=(state==SET_F);
assign g=(state==S4)|(state==S5)|(state==KEEP1);
endmodule