1. 标准三段式写法:
1.一段代表当前状态赋值;
2.一段代表下一个状态如何跳变
3.一段代表输出控制
一定要带上复位
前两段模板集合一样,第三段取决于具体需求
parameter IDLE_ST = 4'b0000;
parameter TEST_ST = 4'b0001;
...
reg [3:0] current_st, next_st
always@(posedge clk or negedge rst)
begin
if(rst)
current_st <= IDLE_ST;
else
current_st <= next_st ;
always@(*)begin
case(current_st)
IDLE_ST: next_st = TEST_ST;
...
default: next_st = IDLE_ST;
endcase
end
reg out_valid;
always@(posedge clk or posedge rst) begin//可以是组合也可以是时序,取决于具体需求
if(rst)
out_valid <= IDLE_ST;
else begin
case(current_st)
IDLE_ST: out_valid <= TEST_ST;
end
end
2. 设计-1(售货机)
2.1 设计要求
输入只识别5毛和一元两种硬币。饮料价格为1.5元,超过不找零
输入有三种:
5角 2'b01
1元 2'b10
其他 2'b00/11
状态定义及输出:
没有投入硬币,不掉出饮料
一共投入5角,不掉出饮料
一共投入1元,不掉出饮料
一共投入1.5元,掉出饮料
2.2 思路
重点:第一步:判断共有几个状态,共有哪些输入和输出
第二步:画状态转换图(每个状态需要表示出所有输入输出组合)
状态定义及输出:
S0,Drink_out = 0
S1,Drink_out = 0
S2,Drink_out = 0
S3,Drink_out = 1
2.3 设计代码
第一段:定义参数,确定状态
第二段:状态跳转
第三段:根据状态,输出结果,根据实际需求确定写组合逻辑或者时序逻辑
3. 设计-2(序列检测)
2.1 设计要求
使用FSM有限状态机设计一个电路,它检测单比特输入引脚in,当输入序列为10011时,输出match为高,其余输入组合match输出为0(可以复用已有bit)。并设计一个测试环境测试改序列检测电路。输入in前10bit为0011001100,之后再随机输入50bit in,检查输出结果。
2.2 思路
输入有两种:0和1
状态转换图
S0:初始状态,输入为0
S1:累计输入为1,输出为0
S2:累计输入为10,输出为0
S3:累计输入为100,输出为0
S4:累计输入为1001,输出为0
S5:累计输入为10011,输出为1
2.3 设计代码
第一段:
第二段:
第三段: