HANG 发表于 2010-6-26 00:59:48

请教一个关于状态机的问题

本帖最后由 fpgaw 于 2010-11-18 16:24 编辑

"一个简单的状态机设计,功能是检测一个5 位二进制序列10010考虑到序列重叠的可能,有限状态机共提供8 个状态(包括初始状态IDLE)."<br>
我对有限状态机不是很明白,请问为什么需要8个状态那么多呢?和我自己推的结果不一样
各位能否给我稍微解释一下"考虑到序列重叠的可能"是什么意思?和状态的数目的关系

usb 发表于 2010-6-26 01:37:17

考虑到序列重叠的可能是指比如 10010010 这个序列有2个10010

tim 发表于 2010-6-26 01:54:09

10010010的重复我知道,但是还是推不出8种状态来,能否解释一下为什么状态B在输入为1的情况下会变成状态F而不是A呢?程序如下:<br>
seqdet.v<br>
module seqdet(x,z,clk,rst,state);<br>
input x,clk,rst;<br>
output z;<br>
output state;<br>
reg state;<br>
wire z;<br>
parameter IDLE='d0, A='d1, B='d2,<br>
C='d3, D='d4,<br>
E='d5, F='d6,<br>
G='d7;<br>
assign z = ( state==E &amp;&amp; x==0 )? 1 : 0; <br>
always @(posedge clk)<br>
if(!rst)<br>
begin<br>
state &lt;= IDLE;<br>
end<br>
else<br>
casex(state)<br>
IDLE : if(x==1)<br>
begin<br>
state &lt;= A;<br>
end<br>
A: if(x==0)<br>
begin<br>
state &lt;= B;<br>
end<br>
B: if(x==0)<br>
begin<br>
state &lt;= C;<br>
end<br>
else<br>
begin<br>
state &lt;= F;<br>
end<br>
C: if(x==1)<br>
begin<br>
state &lt;= D;<br>
end<br>
else<br>
begin<br>
state &lt;= G;<br>
end<br>
D: if(x==0)<br>
begin<br>
state &lt;= E;<br>
end<br>
else<br>
begin<br>
state &lt;= A;<br>
end<br>
E: if(x==0)<br>
begin<br>
state &lt;= C;<br>
end<br>
else<br>
begin<br>
state &lt;= A;<br>
end<br>
F: if(x==1)<br>
begin<br>
state &lt;= A;<br>
end<br>
else<br>
begin<br>
state &lt;= B;<br>
end<br>
G: if(x==1)<br>
begin<br>
state &lt;= F;<br>
end<br>
default:state=IDLE; //缺省状态为初始状态。<br>
endcase<br>
endmodule

usd 发表于 2010-6-26 02:47:05

是我发的夏宇闻的书中的程序吧。<br>
我也觉得有问题,F状态跟A状态其实是重合的,G状态跟IDLE状态重合,因为其在相同输入情况下到达同一个状态。<br>
不知道是否理解有误。

UFP 发表于 2010-6-26 03:17:34

还有控制程序吧

VVC 发表于 2010-6-26 04:49:24

对呀,我还是想不通,下面是测试程序。<br>
//------------------ seqdet.v -------------------<br>
`timescale 1ns/1ns<br>
`include "./seqdet.v"<br>
module seqdet_Top;<br>
reg clk,rst;<br>
reg data;<br>
wire state;<br>
wire z,x;<br>
assign x=data;<br>
always #10 clk = ~clk;<br>
always @(posedge clk)<br>
data={data,data};<br>
initial<br>
begin<br>
clk=0;<br>
rst=1;<br>
#2 rst=0;<br>
#30 rst=1;<br>
data ='b1100_1001_0000_1001_0100;<br>
#500 $stop;<br>
end<br>
seqdet m(x,z,clk,rst,state);<br>
endmodule

interi 发表于 2010-6-26 05:55:18

我只用了5个状态,仿真了以下,发现还可以。

longtim 发表于 2010-6-26 06:30:26

比如序列是这样的:10010,01011。。。那么判断的结果是应该只有一个10010的序列,而不是两个,还需要3个状态来判断后面的重叠情况。

AAT 发表于 2010-6-26 08:17:35

我看的时候也发现这个问题了

Sunlife 发表于 2015-6-24 10:17:29

F状态跟A状态其实是重合的,G状态跟IDLE状态重合,因为其在相同输入情况下到达同一个状态。<br>
不知道是否理解有误。
页: [1]
查看完整版本: 请教一个关于状态机的问题