我是靠谱客的博主 阔达钢铁侠,最近开发中收集的这篇文章主要介绍FPGA——三段式状态机——序列检测器1101(重叠+非重叠)2、三段式状态机3、应用4、序列检测器:,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
1、 定义:状态机表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
分类: 输出只和当前状态有关而与输入无关成为Moore型状态机,输出和当前状态、输入都有关称为Mealy型状态机
2、三段式状态机
使用 3 个 always 模块,一个 always模块采用同步时序描述状态转移;第二个采用组合逻辑判断状态转移条件,描述状态转移规律;第三个 always 模块描述状态输出(可以用组合电路输出,也可以用时序电路输出)。三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。
always @(posedge clk or negedge rst)
always @(cur_state)
always @(posedge clk or negedge rst)
3、应用
3.1序列检测器(重叠+非重叠)
//(2)用状态机写法实现*重叠*/非重叠检测;
module detect_1101 (
input clk,
input rst,
input data_in,
input data_vld,
output result
);
reg [2:0] cur_state , next_state ; //现态、次态
parameter REPEAT = 1'b1; //1--重复检测;0--非重复检测
localparam IDLE = 3'd0,
A = 3'd1,
B = 3'd2,
C = 3'd3,
D = 3'd4;
//三段式状态机第1段(现态到次态)
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cur_state <= IDLE;
else if(data_vld==1)
cur_state <= next_state;
else
cur_state <= cur_state
end
//三段式状态机第2段(状态的转移)Moore 状态机:组合逻辑的输出只取决于当前状态,而与输入状态无关.
always@(cur_state)
begin
case(cur_state)
IDLE: next_state = data_in ? A : IDLE;
A : next_state = data_in ? IDLE: B;
B : next_state = data_in ? B: C;
C : next_state = data_in ? D : IDLE;
D : next_state = REPEAT ? (x ? B : IDLE) : (x ? A : IDLE); //是否重复检测
default:next_state = IDLE;
endcase
end
//三段式状态机第3段(输出段)
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
result <= 1'b0;
else
case(cur_state)
D : result<= 1'b1;
default : result <= 1'b0;
endcase
end
endmodule
4、序列检测器:
检测输入信号(a)是否满足011100序列, 要求以每六个输入为一组,不检测重复序列。
本程序的状态机在基本的三段式状态机上加入了计数器cnt
,并使用cnt
对状态转移进行约束,以确保正常工作时,状态机每6个周期循环一次。其中FAIL
状态仅在计数器cnt==6
时才会切换到别的状态,match
和not_match
也仅在cnt==6
时才进行更新; ZERO
为启动态,系统复位时,处于该状态。
状态机每6个周期循环一次
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt<=0;
else
cnt <= cnt==6? 1: cnt+1;
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
output reg match,
output reg not_match
);
reg [2:0] next_state, curr_state;
reg match_n,not_match_n;
reg [2:0] cnt;
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt<=0;
else
cnt <= cnt==6? 1: cnt+1;
localparam IDLE =3'd0,
A=3'd1,
B=3'd2,
C=3'd3,
D=3'd4,
E=3'd5,
F=3'd6,
FAIL=3'd7;
always @(posedge clk or negedge rst_n)
if(!rst_n)
curr_state<=IDLE;
else
curr_state<=next_state;
always @(*)
begin
case(curr_state)
IDLE:next_state<= data? FAIL : A;
A:next_state<= data? B:FAIL;
B:next_state<= data? C:FAIL;
C:next_state<= data? D:FAIL;
D:next_state<= data? FAIL : E;
E:next_state<= data? FAIL : F;
F:next_state<= data? FAIL : A;
FAIL : next_state = cnt==6&&data==0? IDLE: FAIL;
default:next_state = FAIL;
endcase
end
always @(*)
begin
if(!rst_n)
begin
match<=1'b0;
not_match <=1'b0;
end
else
begin
match = cnt==6&&curr_state==F;
not_match = cnt==6&&curr_state==FAIL;
end
end
endmodule
最后
以上就是阔达钢铁侠为你收集整理的FPGA——三段式状态机——序列检测器1101(重叠+非重叠)2、三段式状态机3、应用4、序列检测器:的全部内容,希望文章能够帮你解决FPGA——三段式状态机——序列检测器1101(重叠+非重叠)2、三段式状态机3、应用4、序列检测器:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复