目录
题目1:FSM1(异步复位)
这是一个摩尔状态机,具有两个状态,一个输入和一个输出。实现此状态机。请注意,重置状态为 B。
此练习与fsm1s,但使用异步重置。
模块声明
module top_module( input clk, input areset, // Asynchronous reset to state B input in, output out);
分析:
- 状态机的代码编写方式有三种:一段式,两段式和三段式。其中一段式不推荐,常用为两段式和三段式。两段式和三段式的区别在于三段式多了一个寄存器输出,在某些情形下能够消除电路中毛刺现象。
- 状态机有摩尔状态机和米利型状态机。其中摩尔状态机的电路输出只与触发器的状态有关,不受电路中输入信号的影响或者没有输入信号;而米利型状态机则不仅仅与触发器的状态有关,还受电路中的输入信号的影响。由此可知,摩尔状态机只是米利型状态机的特例。
代码使用两段式编写:
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,组合逻辑
// State transition logic
case(state)
A:next_state = in ? A : B;
B:next_state = in ? B : A;
endcase
end
always @(posedge clk, posedge areset) begin // This is a sequential always block,时序逻辑
// State flip-flops with asynchronous reset
if(areset)
state <= B;
else
state <= next_state;
end
assign out = state;
// Output logic
//输出逻辑,根据当前状态实现输出
endmodule
仿真结果:
题目2:FSM1S(同步复位)
这是一个摩尔状态机,具有两个状态,一个输入和一个输出。实现此状态机。请注意,重置状态为 B。
此练习与fsm1,但使用同步复位。
模块声明
// Note the Verilog-1995 module declaration syntax here: module top_module(clk, reset, in, out); input clk; input reset; // Synchronous reset to state B input in; output out;
分析:这道题与上题一样,只是使用的复位方式不同,该题使用同步复位。代码编写如下:
// Note the Verilog-1995 module declaration syntax here:
module top_module(clk, reset, in, out);
input clk;
input reset; // Synchronous reset to state B
input in;
output out;//
reg out;
// Fill in state name declarations
parameter A = 0, B=1;
reg present_state, next_state;
//组合电路
always @(*)
begin
case (present_state)
// Fill in state transition logic
A:next_state = in ? A:B;
B:next_state = in ? B:A;
endcase
end
//时序电路
always @(posedge clk) begin
if (reset) begin
// Fill in reset logic
present_state <= B;
end
else
present_state <= next_state;
end
assign out = present_state;
endmodule
仿真结果:
题目1和题目2实际是翻转后的T触发器的状态转移图,只是两者的置位方式不同。
题目3:FSM2(异步复位)
这是一个摩尔状态机,具有两个状态、两个输入和一个输出。实现此状态机。
此练习与fsm2s,但使用异步重置。
模块声明
module top_module( input clk, input areset, // Asynchronous reset to OFF input j, input k, output out);
分析:所给电路实际是JK触发器的状态转移图。状态表示为OFF和ON,异步置位端为areset,输入信号为j/k,时钟为clk。
代码编写如下:
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
// State transition logic
case(state)
OFF:next_state = j ? ON:OFF;
ON:next_state = k ? OFF:ON;
endcase
end
//时序逻辑
always @(posedge clk, posedge areset) begin
// State flip-flops with asynchronous reset
if(areset)
state <= OFF;
else
state <= next_state;
end
// Output logic
assign out = state;
endmodule
仿真结果如下:
题目4:Fsm2s(同步复位)
这是一个摩尔状态机,具有两个状态、两个输入和一个输出。实现此状态机。
此练习与fsm2,但使用同步复位。
模块声明
module top_module( input clk, input reset, // Synchronous reset to OFF input j, input k, output out);
分析:与题目3的区别在于该题使用同步复位。代码编写如下:
module top_module(
input clk,
input reset, // Synchronous reset to OFF
input j,
input k,
output out); //
parameter OFF=0, ON=1;
reg state, next_state;
//组合逻辑
always @(*) begin
// State transition logic
case(state)
OFF: next_state = j ? ON:OFF;
ON: next_state = k ? OFF:ON;
endcase
end
//时序逻辑
always @(posedge clk) begin
// State flip-flops with synchronous reset
if(reset)
state <= OFF;
else
state <= next_state;
end
// Output logic,输出逻辑
assign out = state;
endmodule
仿真结果如下: