请教一个状态机进行序列检测的问题
本帖最后由 fpgaw 于 2010-11-18 16:16 编辑以前没有接收过这方面的系统训练,不太确定自己想的对不对。
我想实现对序列 11011进行检测,
绘制的状态转换图见附件
VHDL代码如后所示
该代码在QuartusII中综合后得到的RTL图与我这里设计的似乎不一样
请高手指教
谢谢
library ieee;
use ieee.std_logic_1164.all;
entity checksequ is
port(clk : in std_logic;
rst : in std_logic;
din : in std_logic;
dout : out std_logic);
end checksequ;
architecture behav of checksequ is
type state is (S5, S4,S3, S2, S1, S0);
signal CurState : state;
signal NextState: state;
BEGIN
process( clk, rst)
begin
if rst = '1' then
CurState <= S0;
elsif clk'event and clk = '1' then
CurState <= NextState;
end if;
end process;
PROCESS (clk, rst)
BEGIN
IF clk'EVENT AND clk = '1' THEN
CASE CurState IS
WHEN S0 =>
IF din = '1'THEN
NextState <= S1;
dout <= '0';
ELSE
NextState <= S0;
dout <= '0';
END IF;
WHEN S1 =>
IF din = '1'THEN
NextState <= S2;
dout <= '0';
ELSE
NextState <= S0;
dout <= '0';
END IF;
WHEN S2 =>
IF din = '0'THEN
NextState <= S3;
dout <= '0';
ELSE
NextState <= S2;
dout <= '0';
END IF;
WHEN S3 =>
IF din = '1'THEN
NextState <= S4;
dout <= '0';
ELSE
NextState <= S0;
dout <= '0';
END IF;
WHEN S4 =>
IF din = '1'THEN
NextState <= S5;
dout <= '1';
ELSE
NextState <= S0;
dout <= '0';
END IF;
WHEN S5 =>
IF din = '1'THEN
NextState <= S5;
dout <= '0';
ELSE
NextState <= S3;
dout <= '0';
END IF;
END CASE;
END IF;
END PROCESS;
END behav; 基本上就是这样了,<EDA实用教程>里有这个例子.<br>
异步复位在第二个进程里没有用啊. o ,我觉得第二个进程没有必要再用rst了的吧?<br>
先要了的,后来去掉了,忘了从敏感量列表中去掉了<br>
谢谢您的回复 仿真了一下,上面的代码有点儿错误,其实那个同步的时钟只需要在第一个process中有就可以了<br>
否则仿真结果会不对。<br>
即最后的代码如下:<br>
library ieee;<br>
use ieee.std_logic_1164.all;<br>
<br>
entity checksequ is<br>
port(clk : in std_logic;<br>
rst : in std_logic;<br>
din : in std_logic;<br>
dout : out std_logic);<br>
end checksequ;<br>
<br>
architecture behav of checksequ is<br>
type state is(S5,S4,S3,S2,S1,S0);<br>
signal CurState : state;<br>
signal NextState: state;<br>
BEGIN<br>
process( clk, rst)<br>
begin<br>
if rst = '1' then<br>
CurState <= S0;<br>
elsif clk'event and clk = '1' then<br>
CurState <= NextState;<br>
end if;<br>
end process;<br>
<br>
<br>
PROCESS (CurState, din)<br>
BEGIN<br>
CASE CurState IS<br>
WHEN S0 =><br>
IF din = '1' THEN<br>
NextState <= S1;<br>
dout <= '0';<br>
ELSE<br>
NextState <= S0;<br>
dout <= '0';<br>
END IF;<br>
<br>
WHEN S1 =><br>
IF din = '1' THEN<br>
NextState <= S2;<br>
dout <= '0';<br>
ELSE<br>
NextState <= S0;<br>
dout <= '0';<br>
END IF;<br>
<br>
WHEN S2 =><br>
IF din = '0' THEN<br>
NextState <= S3;<br>
dout <= '0';<br>
ELSE<br>
NextState <= S2;<br>
dout <= '0';<br>
END IF;<br>
<br>
WHEN S3 =><br>
IF din = '1' THEN<br>
NextState <= S4;<br>
dout <= '0';<br>
ELSE<br>
NextState <= S0;<br>
dout <= '0';<br>
END IF;<br>
<br>
WHEN S4 =><br>
IF din = '1' THEN<br>
NextState <= S5;<br>
dout <= '1';<br>
ELSE<br>
NextState <= S0;<br>
dout <= '0';<br>
END IF;<br>
<br>
WHEN S5 =><br>
IF din = '1' THEN<br>
NextState <= S5;<br>
dout <= '0';<br>
ELSE<br>
NextState <= S3;<br>
dout <= '0';<br>
END IF;<br>
END CASE;<br>
END PROCESS;<br>
<br>
END behav; 其实还有一种方法是用相关运算得到序列匹配的比特数,这样就可以实现容错检测.当序列比较长的时候,通常是用相关的方法. 原帖由 myxxyy 于 2006-4-8 18:20 发表<br>
其实还有一种方法是用相关运算得到序列匹配的比特数,这样就可以实现容错检测.当序列比较长的时候,通常是用相关的方法. 能否给个实际的例子或者介绍性资料? 谢谢 状态机我一直就没有领会其精髓 这么简单的检测还要用状态机啊? 这么简单的检测还要用状态机啊? <br>
<br>
----------<br>
那你说说看 原帖由 caesar000 于 2006-4-11 09:17 发表<br>
这么简单的检测还要用状态机啊? 当然可以不用状态机,对于这么简单的检测,可以采用下面的代码就可以了(当然或许大侠还有更精炼的,希望不吝赐教)<br>
我当时是为了练习状态机而写的,其实最初我写的代码大概是下面这个样子,希望再给予指点指点,我是初学者<br>
<br>
library ieee;<br>
use ieee.std_logic_1164.all;<br>
<br>
entity checksequ is<br>
port(clk : in std_logic;<br>
rst : in std_logic;<br>
din : in std_logic;<br>
dout : out std_logic);<br>
end checksequ;<br>
<br>
architecture behav of checksequ is<br>
signal regshift : std_logic_vector(4 downto 0);<br>
begin<br>
<br>
process(clk, rst)<br>
begin<br>
if rst = '0' then<br>
regshift <= "00000";<br>
elsif clk'event and clk = '1' then<br>
regshift(4 downto 1) <= regshift(3 downto 0);<br>
regshift(0) <= din;<br>
end if;<br>
end process;<br>
<br>
process(clk, rst)<br>
begin<br>
if rst = '0' then<br>
dout <= '0';<br>
elsif clk'event and clk = '1' then<br>
if regshift = "11011" then<br>
dout <= '1';<br>
else<br>
dout <= '0';<br>
end if;<br>
end if;<br>
end process;<br>
end behav;
页:
[1]
2