集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2932|回复: 9

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

[复制链接]
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[2:0] state;<br>
reg[2:0] 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[23:0] data;<br>
wire[2:0] state;<br>
wire z,x;<br>
assign x=data[23];<br>
always #10 clk = ~clk;<br>
always @(posedge clk)<br>
data={data[22:0],data[23]};<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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-6 16:25 , Processed in 0.065162 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表