1、狀態機設計
Mealy 機方框圖
狀態寄存器輸出當前的信號,用來控制下一個狀態是什么,和當前狀態下的輸出是什么。
Moore機方框圖
2、狀態機---3種類型
二元的:(CPLD與陣列扇入比較多,寄存器比較少)
S1 = 001, S2 = 010, S3 = 011, S3 = 100,etc。。。
枚舉的:
S1 = 100, S2 = 110, S3 = 101, S4 = 111,etc。。。
One Hot:每1 個狀態機只有1個寄存器(FPGA觸發器比較多)
S1 = 00000001, S2 =00000010,S3 = 00000100,etc。。。
3、對生剩余狀態的處理
1、在CASE 語句中增加語句,對每個非法狀態明確地給出狀態輪換的指示;
2、用OTHERS語句來對未提及的狀態做統一處理。
Moore 型狀態機設計
摩爾型的有限狀態機的輸出只與當前狀態有關,而與輸入信號的當前值無關,且僅豐時鐘信號邊沿到來時才發生變化。
要實現這種結構,必須使用暫存信號(如 temp)來存儲電路的輸出值,當今信號在時鐘邊沿出現時才能夠更新輸出。
例:
library ieee;
use ieee.std_logic_1164.all;
entity s_machine2 is
port(
clk, reset : in std_logic;
x : in std_logic;
z : out std_logic
);
architecture behav of s_machine2 is
type m_state is(s0, s1, s2);
signal present_state, next_state : m_state;
signal temp : std_logic;
begin
-----------------------時序進程---------------------------
reg : process(reset, clk)
begin
if reset = ‘1’ then present_state 《= s0;
elsif clk = ‘1’ and clk‘event then
z 《=temp; --只有在時鐘的上升沿時,輸出才會發生變化。是同步輸出。
prsent_state 《=nxet_state;
end if;
end process;
-------------------------組合進程-----------------------------
com : process(present_state, x)
begin
case prsent_state is
when s0 =》
if x = ’0‘ then next_state 《= s0;
else next_state 《= s1;
end if;
temp 《= ’0‘;
when s1 =》
if x = ’0‘ then next_state 《= s0;
else next_state 《= s2;
end if;
temp 《= ’0‘;
when s2 =》
if x = ’0‘; then next_state 《= s0; temp 《= ’1‘;
else next_state 《= s2; temp 《= ’0‘;
end if
end case;
end process;
end behv;
Mearly 型的有限狀態機設計
米立狀態機的輸出信號是當前狀態和輸出信號的函數,它的輸出在輸入變化后立即發生變化,
不依賴時鐘信號的同步。是異步輸出。
例:
library ieee;
use ieee.std_logic_1164.all;
entity s_machine1 is
port(
clk, reset : in std_logic;
x : in std_logic;
z : out std_logic
);
end s_machine1;
architecture behav of s_machine2 is
type m_state is(s0, s1, s2);
signal present_state, next_state : m_state;
begin
-----------------------時序進程---------------------------
reg : process(reset, clk)
begin
if reset = ’1‘ then present_state 《= s0;
elsif clk = ’1‘ and clk’event then
prsent_state 《=nxet_state;
end if;
end process;
-------------------------組合進程-----------------------------
com : process(present_state, x)
begin
case prsent_state is
when s0 =》
if x = ‘0’ then next_state 《= s0;
else next_state 《= s1;
end if;
z 《= ‘0’;
when s1 =》
if x = ‘0’ then next_state 《= s0;
else next_state 《= s2;
end if;
z 《= ‘0’;
when s2 =》
if x = ‘0’; then next_state 《= s0; z 《= ‘1’;
else next_state 《= s2; z《= ‘0’;
end if
end case;
end process;
end behv;
可以看到在該程序中,只要輸入有變化,輸出z就會有變化,它并不依賴于時鐘的上升沿。
怎樣確保一個進程是組合進程:
1、不出現帶沿的語句,即組合進程中決不能出現用時鐘沿控制的敏感信號;
2、在組合電路的進程中,給出輸出端口的缺省值,這樣可以防止鎖存器的生成;
3、在敏感清單中包含所有的輸入量,防止鎖存器的生成。
敏感清單不全的話綜合時可能出現敬告。
例:下例敏感清單中輸入端口不全,可能出現鎖存器
p0 : process (a)
begin
q 《= a and b;
end process p0;
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
下面是一個實例,洗衣機的工作過程:
TYPE state_type IS(idle, fill, heat_w, wash, drain);
entity wm is
port(
clk, reset, door_closed, full : in std_logic;
heat_demand, done, empty : in std_logic;
water, spin, heat, pump : out std_logic
);
end wm;
architecture behave of wm is
------------------------說明部分--------------------------
--說明部分用枚舉數據類型來字義狀態機中的狀態;并把狀態變量(如現態和次態)定義為信號。
type state_type is (
idle, fill, heat_w, wash, drain);
signal state : state_type;
begin
process (clk, reset)
begin
if reset = ‘1’ then
state 《= idle;
elsif clk‘event and clk= ’1‘ then
case state is
when idle =》
if door_closed = ’1‘ then
state 《= fill;
else
state 《= idle;
end if
when fill =》
if full =’1‘; then
state 《= neat_w;
else
state 《= fill;
。
。
。
when others =》
state 《= idle;
end case
end if;
end process;
----------------------------------------------
利用兩個進程(純組合邏輯措施一)
--------------時序進程----------------------------
--時序進程是指在時鐘驅動下負責狀態轉換的進程,只表示次態和現態的關系
process(clk, reset)
begin
if reset =’1‘ then
state 《= idle;
elsif clk’event and clk = ‘1’ then
state 《= next_state;
end if;
end process;
------------------組合進程---------------------
組合進程的任務是根據輸入信號和現態對輸出端口賦值以及確定狀態機的下一個狀態,由于沒有任何信號
的賦值是通過其他某個信號的跳變來觸發的,所以不會產生寄存器。一般用CASE 或IF語句來實現
process(state, door_closed, full,
heat_demand, done, empty)
begin
case state is
when idle =》
if door_closed =‘1’ then
next_state 《= fill;
else
next_state 《= idle;
end if;
when fill =》
if full = ‘1’ then
next_state 《= heat_w;
else
next_state 《= fill;
。
。
。
end case;
end if;
end process;
process(state)
begin
water_i 《= ‘0’;
spin_i 《= ‘0’;
heat_i 《= ‘0’;
pump_i 《= ‘0’;
case state is
when idle =》
when fill =》
water_i 《= ‘1’;
when heat_w =》
spin_i 《=‘1’;
heat_i 《= ‘1’;
when wash =》
spin_i 《= ‘1’;
when drain =》
spin_i 《= ‘1’;
pump_i 《= ‘i’;
end case;
end process;
--------------寄存輸出---------------------
process (clk)
begin
if rising_edge(clk) then
water 《= water_i;
spin 《= spin_i;
heat 《= heat_i;
pump 《= pump_i;
end if;
end process
-
寄存器
+關注
關注
31文章
5343瀏覽量
120365 -
狀態機
+關注
關注
2文章
492瀏覽量
27541
發布評論請先 登錄
相關推薦
評論