1.实现以下状态机(高电平异步复位,单输入单输出)
module top_module(
input clk,
input areset, // Asynchronous reset to state B
input in,
output out);//
parameter A=0, B=1;
reg state, next_state;
always @(*) begin // This is a combinational always block
case(state)
A: begin
if(in == 1'b1)
next_state <= A;
else
next_state <= B;
end
B: begin
if(in == 1'b1)
next_state <= B;
else
next_state <= A;
end
endcase
end
always @(posedge clk, posedge areset) begin // This is a sequential always block
if(areset)
state = B;
else
state = next_state;// State transition logic
end
// Output logic
assign out = (state == A) ? 1'b0 : 1'b1;
endmodule
2.实现以下状态机(同步复位,单输入单输出)
module top_module(
input clk,
input reset, // Asynchronous reset to state B
input in,
output out);//
parameter A=0, B=1;
reg state, next_state;
always @(*) begin // This is a combinational always block
case(state)
A: begin
if(in == 1'b1)
next_state <= A;
else
next_state <= B;
end
B: begin
if(in == 1'b1)
next_state <= B;
else
next_state <= A;
end
endcase
end
always @(posedge clk) begin // This is a sequential always block
if(reset)
state = B;
else
state = next_state;// State transition logic
end
// Output logic
assign out = (state == A) ? 1'b0 : 1'b1;
endmodule
3.实现以下状态机(异步复位,双输入单输出)
module top_module(
input clk,
input areset, // Asynchronous reset to OFF
input j,
input k,
output out); //
parameter OFF=0, ON=1;
reg state, next_state;
always @(*) begin
case(state)
OFF:begin
if(j == 0)begin
next_state <= OFF;
end
else begin
next_state <= ON;
end
end
ON:begin
if(k == 0)begin
next_state <= ON;
end
else begin
next_state <= OFF;
end
end
endcase
end
always @(posedge clk, posedge areset) begin
if(areset)begin
state <= OFF;
end
else begin
state <= next_state;
end
end
// Output logic
assign out = (state == ON);
endmodule
4.实现以下状态机(同步复位,双输入单输出)
module top_module(
input clk,
input reset, // Asynchronous reset to OFF
input j,
input k,
output out); //
parameter OFF=0, ON=1;
reg state, next_state;
always @(*) begin
case(state)
OFF:begin
if(j == 0)begin
next_state <= OFF;
end
else begin
next_state <= ON;
end
end
ON:begin
if(k == 0)begin
next_state <= ON;
end
else begin
next_state <= OFF;
end
end
endcase
end
always @(posedge clk) begin
if(reset)begin
state <= OFF;
end
else begin
state <= next_state;
end
end
// Output logic
assign out = (state == ON);
endmodule
5.实现以下状态机
module top_module(
input in,
input [1:0] state,
output [1:0] next_state,
output out); //
parameter A=0, B=1, C=2, D=3;
always@(*)begin// State transition logic: next_state = f(state, in)
case(state)
A:
if(in == 1'b0)begin
next_state = A;
end
else begin
next_state = B;
end
B:
if(in == 1'b0)begin
next_state = C;
end
else begin
next_state = B;
end
C:
if(in == 1'b0)begin
next_state = A;
end
else begin
next_state = D;
end
D:
if(in == 1'b0)begin
next_state = C;
end
else begin
next_state = B;
end
endcase
end
assign out = (state == D);
endmodule
6.实现以下状态机(独热码形式)
module top_module(
input in,
input [3:0] state,
output [3:0] next_state,
output out); //
parameter A=0, B=1, C=2, D=3;
// State transition logic: Derive an equation for each state flip-flop.
assign next_state[A] = (state[A]&~in) | (state[C]&~in);
assign next_state[B] = (state[A]&in) | (state[B]&in) | (state[D]&in);
assign next_state[C] = (state[B]&~in) | (state[D]&~in);
assign next_state[D] = state[C]∈
// Output logic:
assign out = state[D];//独热码一位只表示一个状态
endmodule
7.实现以下状态机
module top_module(
input clk,
input in,
input areset,
output out); //
// State transition logic
reg [1:0] state,next_state;
parameter A = 2'd0,B = 2'd1,C = 2'd2,D = 2'd3;
always@(posedge clk or posedge areset)begin// State flip-flops with asynchronous reset
if(areset)begin
state <= A;
end
else begin
state = next_state;
end
end
always@(*)begin
case(state)
A:
if(in == 1'b0)begin
next_state <= A;
end
else begin
next_state <= B;
end
B:
if(in == 1'b0)begin
next_state <= C;
end
else begin
next_state <= B;
end
C:
if(in == 1'b0)begin
next_state <= A;
end
else begin
next_state <= D;
end
D:
if(in == 1'b0)begin
next_state <= C;
end
else begin
next_state <= B;
end
endcase
end
// Output logic
assign out = (state == D);
endmodule
8.同上,改为同步复位
module top_module(
input clk,
input in,
input reset,
output out); //
// State transition logic
reg [1:0] state,next_state;
parameter A = 2'd0,B = 2'd1,C = 2'd2,D = 2'd3;
always@(posedge clk)begin// State flip-flops with asynchronous reset
if(reset)begin
state <= A;
end
else begin
state <= next_state;
end
end
always@(*)begin
case(state)
A:
if(in == 1'b0)begin
next_state <= A;
end
else begin
next_state <= B;
end
B:
if(in == 1'b0)begin
next_state <= C;
end
else begin
next_state <= B;
end
C:
if(in == 1'b0)begin
next_state <= A;
end
else begin
next_state <= D;
end
D:
if(in == 1'b0)begin
next_state <= C;
end
else begin
next_state <= B;
end
endcase
end
// Output logic
assign out = (state == D);
endmodule