前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >序列检测一定要用状态机?

序列检测一定要用状态机?

作者头像
根究FPGA
发布2020-08-26 18:02:32
5960
发布2020-08-26 18:02:32
举报
文章被收录于专栏:根究FPGA根究FPGA

那些年,你总是不停的说序列检测,每当有人谈到序列检测你便说自己会一、二、三段式moore、mealy型状态机,茴字有几种写法...

假设需要一个01101010比特流检测电路,并输出检测成果标志

当你开始考虑使用几个状态的时候,并好不容易写出以下代码的时候:

代码语言:javascript
复制
module detect2(
input clk,
input rst_n,
input din, 
output reg flag
);
 
//reg [2:0]state=3'b000;
parameter IDLE=3'b000,  //0
       state1=3'd1,  //1
       state2=3'd2,  //0
       state3=3'd3,  //1
       state4=3'd4,  //0
       state5=3'd5,  //1
       state6=3'd6,  //1
       state7=3'd7;  //0

reg [2:0]cur_state;
reg [2:0]nxt_state;
 
//第一个always块用于状态转移       
always@(posedge clk or negedge rst_n)
if(~rst_n)
 cur_state<=IDLE;
else 
 cur_state<=nxt_state;
 
/*
检测8'b01101010
*/       
always@(*) 
begin
 case(cur_state)
  IDLE:
   begin 
   if(din==1'b0)    
    nxt_state=state1; //0
   else 
    nxt_state=IDLE;
  end 
  state1: 
   begin
   if(1'b1==din)
     nxt_state=state2;  //10
   else 
     nxt_state=IDLE; 
   end 
  state2: 
   begin
    if(1'b0==din)
    nxt_state=state3;  //010
   else 
     nxt_state=IDLE; 
   end 
  state3: //有三个正确的接收数字
   begin
    if(1'b1==din)
    nxt_state<=state4;  //1010
   else 
     nxt_state=IDLE; 
   end 
  state4: 
   begin
    if(1'b0==din)
     nxt_state=state5;  //01010
   else 
     nxt_state=IDLE; 
   end 
  state5: 
   begin
    if(1'b1==din)
    nxt_state=state6;  //101010
   else 
     nxt_state=IDLE; 
   end 
  state6: 
   begin
    if(1'b1==din)
    nxt_state=state7;  //110_1010
   else             
     nxt_state<=state3;  //010
   end 
  state7: 
   begin
    nxt_state=IDLE;  
   end   
 default:;
 endcase 
end  

always@(posedge clk or negedge rst_n)
if(~rst_n)
 flag<=1'b0;
else if(cur_state==state7&&(1'b0==din))
 flag<=1'b1;
else 
 flag<=1'b0;

endmodule

答应我:下次试试移位寄存器可以吗?

代码语言:javascript
复制
module detect(
input clk,
input rst_n,
input din,
output flag
);
reg [7:0]bug;
always@(posedge clk or negedge rst_n)
if(~rst_n)
 bug<=8'hff;
else 
 bug<={din,bug[7:1]};

assign flag=bug==8'b0110_1010;
endmodule

一样的:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 根究FPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档