上篇传送门:
HDLBITS笔记31:有限状态机一(FSM1、FSM1S、FSM2、FSM2S)_炒鸡无敌大美女的博客-CSDN博客
目录
题目2:Fsm3onehot(简单的one - hot 状态转换3)
题目1:Fsm3comb(简单的状态转换3)
以下是具有一个输入、一个输出和四个状态的 Moore 状态机的状态转换表。使用以下状态编码:A=2'b00,B=2'b01,C=2'b10,D=2'b11。
仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。给定当前状态 (state),根据状态转换表计算next_state 和 输出 (out)
State | Next state | Output | |
---|---|---|---|
in=0 | in=1 | ||
A | A | B | 0 |
B | C | B | 0 |
C | A | D | 0 |
D | C | B | 1 |
模块声明
module top_module( input in, input [1:0] state, output [1:0] next_state, output out);
分析:这是一个摩尔状态机。仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。根据所给的状态转移表直接写代码就好。
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;
// State transition logic: next_state = f(state, in)
//组合逻辑
always @(*)
begin
case(state)
A:next_state = in ? B:A;
B:next_state = in ? B:C;
C:next_state = in ? D:A;
D:next_state = in ? B:C;
endcase
end
// Output logic: out = f(state) for a Moore state machine
//输出逻辑
always @(*)
begin
if(state == D)
out = 1'b1;
else
out = 1'b0;
end
endmodule
题目2:Fsm3onehot(简单的one - hot 状态转换3)
以下是具有一个输入、一个输出和四个状态的 Moore 状态机的状态转换表。使用以下单热状态编码:A=4'b0001,B=4'b0010,C=4'b0100,D=4'b1000。
通过检测假设采用一热编码来推导状态转换和输出逻辑方程。仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。(测试平台将使用非一个热输入进行测试,以确保您不会尝试执行更复杂的操作)。
提示:一热状态转换逻辑的逻辑方程可以通过查看状态转换图的边缘来推导。
State | Next state | Output | |
---|---|---|---|
in=0 | in=1 | ||
A | A | B | 0 |
B | C | B | 0 |
C | A | D | 0 |
D | C | B | 1 |
“通过检查推导方程”是什么意思?
单热状态机编码保证正好一个状态位为 1。这意味着可以通过仅检查一个状态位而不是所有状态位来确定状态机是否处于特定状态。通过检查状态转换图中每个状态的传入边,这可以为状态转换生成简单的逻辑方程。
例如,在上面的状态机中,状态机如何才能达到状态A?它必须使用两条传入边之一:“当前处于状态 A 且 in=0”或“当前处于状态 C 且处于 = 0”。由于采用一热编码,测试“当前处于状态 A”的逻辑方程只是状态 A 的状态位。这就引出了状态位 A 的下一个状态的最终逻辑方程:。one-hot 编码保证一次最多有一个子句(产品项)处于“活动状态”,因此这些子句可以只放在一起。next_state[0] = state[0]&(~in) | state[2]&(~in)
当练习要求“通过检查”提供状态转换方程时,请使用此特定方法。法官将使用非一热输入进行测试,以确保您的逻辑方程遵循此方法,而不是对状态位的非法(非一热)组合执行其他操作(例如重置FSM)。
虽然知道这种算法对于RTL级设计不是必需的(逻辑合成器处理这个问题),但它说明了为什么一热FSM通常具有更简单的逻辑(以牺牲更多的状态位存储为代价),并且这个主题经常出现在数字逻辑课程的考试中。
代码编写如下:
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] & in);
// Output logic:
always @(*)
begin
if(state[D]==1'b1)
out = 1'b1;
else
out = 1'b0;
end
endmodule
题目3:Fsm3(简单的FSM3)异步复位
另请参见:此 FSM 的状态转换逻辑
以下是具有一个输入、一个输出和四个状态的 Moore 状态机的状态转换表。实现此状态机。包括将 FSM 重置为状态 A 的异步重置。
State | Next state | Output | |
---|---|---|---|
in=0 | in=1 | ||
A | A | B | 0 |
B | C | B | 0 |
C | A | D | 0 |
D | C | B | 1 |
模块声明
module top_module( input clk, input in, input areset, output out);
觉得看状态转移表很难写的话可以画出状态转移图。
由此可得代码编写如下,采用三段式的方式编写:
module top_module(
input clk,
input in,
input areset,
output out); //
reg [1:0]state ,next_state;
parameter A = 0, B = 1,C = 2,D = 3;
// State transition logic,组合逻辑
always @(*)
begin
case(state)
A:next_state = in ? B:A;
B:next_state = in ? B:C;
C:next_state = in ? D:A;
D:next_state = in ? B:C;
endcase
end
// State flip-flops with asynchronous reset,时序逻辑
always @(posedge clk,posedge areset)//异步复位
begin
if(areset)
state <= A;
else
state <= next_state;
end
// Output logic,输出逻辑
always @(*)
begin
if(state == D)
out = 1'b1;
else
out = 1'b0;
end
endmodule
仿真结果:
题目4: Fsm3s(简单的FSM3,同步复位)
另请参见:此 FSM 的状态转换逻辑
以下是具有一个输入、一个输出和四个状态的 Moore 状态机的状态转换表。实现此状态机。包括将 FSM 重置为状态 A 的同步重置(这与 Fsm3 的问题相同,但具有同步重置。
State | Next state | Output | |
---|---|---|---|
in=0 | in=1 | ||
A | A | B | 0 |
B | C | B | 0 |
C | A | D | 0 |
D | C | B | 1 |
模块声明
module top_module( input clk, input in, input reset, output out);
分析:这道题做法与题目3相同,只是该题是同步复位。代码编写如下:
module top_module(
input clk,
input in,
input reset,
output out); //
reg [1:0] state,next_state;
parameter A = 0,B = 1,C = 2, D= 3;//定义初始状态
// State transition logic,组合逻辑
always @(*)
begin
case(state)
A:next_state = in ? B:A;
B:next_state = in ? B:C;
C:next_state = in ? D:A;
D:next_state = in ? B:C;
endcase
end
// State flip-flops with synchronous reset,时序逻辑
always @(posedge clk )
begin
if(reset)
state <= A;
else
state <= next_state;
end
// Output logic,输出逻辑
always @(*)
begin
if(state == D)
out = 1'b1;
else
out = 1'b0;
end
endmodule
仿真结果如下: