找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6828|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

Verilog狀態(tài)機(jī)實(shí)現(xiàn)序列檢測(cè)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105323 發(fā)表于 2016-2-23 01:18 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
經(jīng)常在筆試的時(shí)候出現(xiàn)這樣的題:檢測(cè)序列為11001101,輸出為1,否則輸出為0。抽空寫(xiě)了下代碼,僅供參考。

FSM1:一段式
module machine_test1(clk,rst,din,dout);
input clk,rst;
input din;
output dout;


//11001101
parameter idle=0,
    st0=1,
    st1=2,
    st2=3,
    st3=4,
    st4=5,
    st5=6,
    st6=7;


reg [3:0] next_state;
reg dout;



always @ (posedge clk or negedge rst)
begin
if(!rst)
begin
  next_state=idle;
  dout=0;
end
else
begin
  case(next_state)
  idle:
   if(din)
   begin
    next_state=st0;
    dout=0;
   end
   else
   begin
    next_state=idle;
    dout=0;
   end
  st0:
   if(din)
   begin
    next_state=st1;
    dout=0;
   end
   else
   begin
    next_state=idle;
    dout=0;
   end
  st1:
   if(!din)
   begin
    next_state=st2;
    dout=0;
   end
   else
   begin
    next_state=st1;
    dout=0;
   end
  st2:
   if(!din)
   begin
    next_state=st3;
    dout=0;
   end
   else
   begin
    next_state=st0;
    dout=0;
   end
  st3:
   if(din)
   begin
    next_state=st4;
    dout=0;
   end
   else
   begin
    next_state=idle;
    dout=0;
   end
  st4:
   if(din)
   begin
    next_state=st5;
    dout=0;
   end
   else
   begin
    next_state=idle;
    dout=0;
   end
  st5:
   if(!din)
   begin
    next_state=st6;
    dout=0;
   end
   else
   begin
    next_state=st1;
    dout=0;
   end
  st6:
   if(din)
   begin
    next_state=idle;
    dout=1;
   end
   else
   begin
    next_state=idle;
    dout=0;
   end
  default:
   begin
    next_state=idle;
    dout=0;
   end
  endcase
end
end  
  

endmodule


FSM2:兩段式
module machine_test(clk,rst,din,dout);
input clk,rst;
input din;
output dout;

//11001101
parameter idle=0,
    st0=1,
    st1=2,
    st2=3,
    st3=4,
    st4=5,
    st5=6,
    st6=7;

reg [3:0] current_state,next_state;
reg dout;


always @ (posedge clk or negedge rst)
begin
if(!rst)
  current_state<=idle;
else
  current_state<=next_state;
end

always @ (next_state or current_state or din or dout)
begin
case(current_state)
idle:
  if(din)
  begin
   next_state=st0;
   dout=0;
  end
  else
  begin
   next_state=idle;
   dout=0;
  end
st0:
  if(din)
  begin
   next_state=st1;
   dout=0;
  end
  else
  begin
   next_state=idle;
   dout=0;
  end
st1:
  if(!din)
  begin
   next_state=st2;
   dout=0;
  end
  else
  begin
   next_state=st1;
   dout=0;
  end
st2:
  if(!din)
  begin
   next_state=st3;
   dout=0;
  end
  else
  begin
   next_state=st0;
   dout=0;
  end
st3:
  if(din)
  begin
   next_state=st4;
   dout=0;
  end
  else
  begin
   next_state=idle;
   dout=0;
  end
st4:
  if(din)
  begin
   next_state=st5;
   dout=0;
  end
  else
  begin
   next_state=idle;
   dout=0;
  end
st5:
  if(!din)
  begin
   next_state=st6;
   dout=0;
  end
  else
  begin
   next_state=st1;
   dout=0;
  end
st6:
  if(din)
  begin
   next_state=idle;
   dout=1;
  end
  else
  begin
   next_state=idle;
   dout=0;
  end
default:
  begin
   next_state=idle;
   dout=0;
  end
endcase
end  

endmodule




FSM3:三段式
module machine_test2(clk,rst,din,dout);
input clk,rst;
input din;
output dout;

//11001101
parameter idle=0,
    st0=1,
    st1=2,
    st2=3,
    st3=4,
    st4=5,
    st5=6,
    st6=7,
    st7=8;

reg [3:0] current_state,next_state;
reg dout;


always @ (posedge clk or negedge rst)
begin
if(!rst)
  current_state<=idle;
else
  current_state<=next_state;
end

always @ (next_state or current_state or din or dout)
begin
case(current_state)
idle:
  if(din)
   next_state=st0;
  else
   next_state=idle;
st0:
  if(din)
   next_state=st1;
  else
   next_state=idle;
st1:
  if(!din)
   next_state=st2;
  else
   next_state=st1;
st2:
  if(!din)
   next_state=st3;
  else
   next_state=st0;
st3:
  if(din)
   next_state=st4;
  else
   next_state=idle;
st4:
  if(din)
   next_state=st5;
  else
   next_state=idle;
st5:
  if(!din)
   next_state=st6;
  else
   next_state=st1;
st6:
  if(din)
   next_state=st7;
  else
   next_state=idle;
st7:
  if(din)
   next_state=st1;
  else
   next_state=idle;
default:
  next_state=idle;
endcase
end  

always @ (posedge clk)
begin
if(next_state==st7)
  dout<=1'd1;
else
  dout<=1'd0;
end
   
endmodule

仿真結(jié)果:







分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:792100 發(fā)表于 2020-6-28 18:49 | 只看該作者
二段式具體的波形信號(hào)輸入的是多少呀
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表