目录
3.2.5.1 Simple FSM 1(asynchoronous reset) (Fsm1)
3.2.5.2 Simple FSM 1(synchoronous reset) (Fsm1s)
3.2.5.3 Simple FSM 2(asynchoronous reset) (Fsm2)
3.2.5.4 Simple FSM 2(synchoronous reset) (Fsm2s)
前言
HDLbits网站如下
Problem sets - HDLBits (01xz.net)
从本期开始我们继续HDLbits第三章Circuits的学习,本期的内容是3.2.5 Finite State Machines有限状态机的第一小节(3.2.5.1-3.2.5.4)
3.2.5.1 Simple FSM 1(asynchoronous reset) (Fsm1)
这是一个摩尔状态机,有两种状态,单输入单输出。请实现这个状态机。请注意,复位状态为 B。
本练习与 fsm1s相似,但是使用异步复位。
Hint:是的,除了编写 FSM 之外,还有其他方法可以做到这一点。但这不是这个练习的重点。
- Hint:这是一个 T 输入反相的TFF 。
Solution:
module top_module (
input clk,
input in,
input areset,
output out
);
// 给出状态名称和赋值。我太懒了,所以我习惯使用十进制数字
// 使用什么赋值并不重要,只要他们是唯一的
parameter A=0, B=1;
reg state; // 确保 state 和 next 足够大以保存状态编码。
reg next;
// 一个有限状态机通常分为三部分:
// 状态转变逻辑
// 状态触发器
// 输出逻辑
// 有时可以将这些代码块中的一个或多个组合在一起,但要小心:有些代码块是组合的,有些是时序
// 使用组合always块表示状态转变逻辑,给出当前状态与输入,下一个状态应该是啥呢?
// 组合always块:使用阻塞赋值语句
always@(*) begin
case (state)
A: next = in ? A : B;
B: next = in ? B : A;
endcase
end
// 使用边沿触发always块(D触发器)来表示状态触发器,异步复位
always @(posedge clk, posedge areset) begin
if (areset) state <= B; // Reset to state B
else state <= next; // Otherwise, cause the state to transition
end
// 组合输出逻辑。在本题中,一个assign语句是最简单的
// 在更复杂的电路中,一个组合always块更合适
assign out = (state==B);
endmodule
这就是俗称的三段FSM
3.2.5.2 Simple FSM 1(synchoronous reset) (Fsm1s)
这是一个摩尔状态机,有两种状态,单输入单输出。请实现这个状态机。请注意,复位状态为 B。
本练习与 fsm1相似,但是使用同步复位。
Hint:是的,除了编写 FSM 之外,还有其他方法可以做到这一点。但这不是这个练习的重点。
- Hint:这是一个 T 输入反相的TFF 。
Solution:
// 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;
parameter A=0,B=1;
reg state, next;
always@(*) begin
case(state)
A:next=in?A:B;
B:next=in?B:A;
endcase
end
always@(posedge clk) begin
if(reset) begin
state<=B;
end
else begin
state<=next;
end
end
always@(*) begin
case(state)
A:out=1'b0;
B:out=1'b1;
endcase
end
endmodule
3.2.5.3 Simple FSM 2(asynchoronous reset) (Fsm2)
这是一个摩尔状态机,有两种状态,单输入单输出。请实现这个状态机。请注意,复位状态为 B。
本练习与fsm2s相似,但是使用异步复位。
Hint:是的,除了编写 FSM 之外,还有其他方法可以做到这一点。但这不是这个练习的重点。
- Hint:这是一个 JK触发器 。
Solution:
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;
always @(*) begin
case(state)
OFF:next=j?ON:OFF;
ON :next=k?OFF:ON;
endcase
end
always @(posedge clk, posedge areset) begin
if(areset)
state<=OFF;
else
state<=next;
end
assign out = (state == ON);
endmodule
3.2.5.4 Simple FSM 2(synchoronous reset) (Fsm2s)
这是一个摩尔状态机,有两种状态,单输入单输出。请实现这个状态机。请注意,复位状态为 B。
本练习与 fsm2相似,但是使用同步复位。
Hint:是的,除了编写 FSM 之外,还有其他方法可以做到这一点。但这不是这个练习的重点。
- Hint:这是一个 JK触发器 。
Solution:
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;
always @(*) begin
case(state)
OFF:next=j?ON:OFF;
ON :next=k?OFF:ON;
endcase
end
always @(posedge clk) begin
if(reset)
state<=OFF;
else
state<=next;
end
assign out = (state == ON);
endmodule
本小节的FSM都是入门级别的,熟练掌握三段式FSM非常有用