什么是状态机:状态机通过不同的状态迁移来完成特定的逻辑操作
$DA0lY\ wuzz Wq 状态机的分类:Moore型状态机和Mealy型状态机
"c!s\iuBU 2@08 V| n#z^uq|v Moore型:状态机的变化只与当前的状态有关
bw%1*;n) Mealy型:状态机的变化不仅与当前的状态有关,还与输入有关
edGV[=]F lx$Y-Tb^F /T#<g: 如何创建状态机:状态机的创建可以分为一段式,两段式和三段式
;T#t)oV hNDhee`%6 C$*`c6R 一段式:主要是讲所有的状态变化以及导致的输出变化都写在了一个always快中。
ejgg.G ^ 两段式:将一些复位信号,clk信号单独写在一个always快中,其他的状态变化,输出值得变化写在一个always快中。
F1M@$S, 三段式:将一些复位信号,clk信号单独写在一个always快中,其他的状态迁移变化写在一个always快中,对应状态的输出值得变化写在一个always快中。
&@dMk4BH< CSr{MF`]e `Z|sp 举个例子:从循环输入的字母中做连续检测,当连续检测到“hello”时,将led灯进行状态的翻转,继续进行下一次的检测。
@KOa5-u ~lDLdUs yp@mxI@1 O b8[P= 一段式的编写方式:
V.y+u7<3} LvWU
%? Td;e\s/] rFx2S V2g$"W?3 module hello(
Vaha--QB input clk,//系统时钟信号 50mHz
~%#?;hJ input rst_n,//系统复位信号,低电平有效
!-N!80 input [7:0] data,//连续输入的字母
.&sguAyG output reg led//led灯
"b1_vA]03 );
EHzZ9zH\ `b\4h/~ //设置需要改变的状态
IC}zgvcW parameter checkh = 5'b0000_1,
8OBvC\% checke = 5'b0001_0,
V ?_%Y<|L checkla = 5'b0010_0,
xje{kx# checklb = 5'b0100_0,
b%oma{I=.c checko = 5'b1000_0;
c'G\AbUVjE `/ HygC6 reg [4:0]state;
20fCWVw}?} aLsGden| always @(posedge clk or negedge rst_n)
dt5gQ9(B if(!rst_n)
qb" ! begin
4k#B5^iJ led <= 1'b0;
[")0{LSA= state <= checkh;
y:,{U*49 end
[;?^DAnK2 else
A%GJ|h,i begin
3/ [= case (state)
PH7L#H^ checkh:
]$L[3qA. if(data == "h") state <= checke;
?BLOc;I&a else state <= checkh;
3YLnh@- checke:
;zCHEz if(data == "e") state <= checkla;
+$UfP(XmH else state <= checkh;
<=zGaU, checkla:
<;XJ::d if(data == "l") state <= checklb;
|hdh4P$+| else state <= checkh;
B}M J?uvA checklb:
/C(L(X if(data == "l") state <= checko;
fk"{G>&8 else state <= checkh;
8odVdivh checko:
nuC K7X if(data == "o")
\;?\@vo< begin
q6ikJ8E8b led <= ~led;
<]9MgfAe
state <= checkh;
m_Rgv.gE^ end
y^nR=Q]_
else state <= checkh;
)8<X6 default:state <= checkh;
|.S;z"v![ endcase
ex|kD*= end
}UO,R~q~ /F4:1
} endmodule12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
JxvwquI wH`@r?& aQG#bh [ 两段式的编写方式:
z=fag'fzM /Mk)H
d : 1{j&$ module hello(
ms{R|vU%b input clk,
n (|>7 input rst_n,
G8&'*7Bb input [7:0] data,
]S:@=9JB' output reg led
w %zw+E );
XMdc n, |u+&xX7 yjr@v!o parameter checkh = 5'b0000_1,
a(7ryl~c= checke = 5'b0001_0,
NV gLq@F checkla = 5'b0010_0,
<- ?B# checklb = 5'b0100_0,
aE%VH ;? checko = 5'b1000_0;
s +GF-kJ* '
EDi6 reg [4:0] cstate;
b1#=q0Zl reg [4:0] nstate;
$"i690 K+}Z6_: always @(posedge clk or negedge rst_n)
toWmm(7v if(!rst_n)
_R<HC begin
|W <:rT cstate <= checkh;
zfZDtKq end
n1t(ns| else
}*'ha=`J cstate <= nstate;
| rvr Sab) LnDj ]Rye AJ3 always @(cstate or data)
=l(JJ case (cstate)
cOb%SC[A{ checkh:
c{Kl?0#[ if(data == "h") nstate <= checke;
nADd,|xD3 else nstate <= checkh;
k~R[5W|' checke:
eqR#` if(data == "e") nstate <= checkla;
R
u5&xIQ else nstate <= checkh;
=#tQIhX` checkla:
gp HwiFc if(data == "l") nstate <= checklb;
#H`y1zm else nstate <= checkh;
a%!XLyq checklb:
[Mz;:/ if(data == "l") nstate <= checko;
s]c$]&IGG else nstate <= checkh;
KV_Ga8hs checko:
a,~P_B|@ if(data == "o")
F4Uk+|]Bu begin
{wP|b@(1t led <= ~led;
As|/
O7% nstate <= checkh;
Z-|C{1}A end
G C'%s else nstate <= checkh;
?U08A{ c default:nstate <= checkh;
"^z=r]<5
endcase
E<uOk [QbXj0en$ endmodule123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
>n~p1: $ ;#9|l= k_>{"Rc 三段式的编写方式:
m;f?}z_\$ H4NEB1TO> %KF:-
w module hello(
)|R9mW=k9P input clk,
.,Qnn}:l input rst_n,
?MM3LA! < input [7:0] data,
Fz&ilB output reg led
Qiw4'xQm );
TEyx((SK ~C'nBV Ts .Zl{B parameter checkh = 5'b0000_1,
Ok&>[qu checke = 5'b0001_0,
b:Kw_Q checkla = 5'b0010_0,
]Cn*C{ checklb = 5'b0100_0,
EAw#$Aq= checko = 5'b1000_0;
*"FLkC4
IB{ZE/ reg [4:0] cstate;
v8bl-9DQ reg [4:0] nstate;
$af}+:' 8 QF?W{NK //复位信号,clk的处理(主要是对初始状态进行赋值操作)
^YJA\d@ always @(posedge clk or negedge rst_n)
%8CT -mQ if(!rst_n)
/}`/i(k begin
3C=clB9< cstate <= checkh;
h#>L:Wf5E end
gvqd1?0w else
ll\^9
4]Q cstate <= nstate;
9C}aX}` :$i:8lz
//状态迁移的处理
v7FRTrqjj always @(cstate or data)
; [%}Xx case (cstate)
D4Y!,7WEVt checkh:
yF5 if(data == "h") nstate <= checke;
k>&s(b else nstate <= checkh;
DJYXC,r checke:
N~;
khS] if(data == "e") nstate <= checkla;
&U$8zn~[k else nstate <= checkh;
9id~NNr7 checkla:
j22#Bw if(data == "l") nstate <= checklb;
_Sgk^i3v else nstate <= checkh;
#VdI{IbW checklb:
MAe<.DHY if(data == "l") nstate <= checko;
x)VIA] else nstate <= checkh;
(Ef2
w[' checko:
w$lfR, if(data == "o")
)xvx6?Ah| begin
.aismc`= nstate <= checkh;
>}DjHLTW\ end
zz 'dg-F else nstate <= checkh;
AIl$qPKj& default:nstate <= checkh;
hG~]~ ) endcase
O<dZA=Oez \gp,Txueb //输出数据的处理
VUy)4* always @(posedge clk or negedge rst_n)
B2G5hbaA if(!rst_n)
K rr?`n begin
0?F@iB~1F led <= 1'b1;
oBj>9I; end
I,<>%Z|' else
RZd4(7H=q case (cstate)
p_5>?[TW: checko:
}^pQbFku if(data == "o")
X(!AI|6Bt led <= ~led;
lv00sa2z default;
QypiF*fSU endcase
3j+=3n, l|vWeBs endmodule
W"-EC`nP ---------------------
%on9C`/ 版权声明:本文为CSDN博主「ruanyz_china」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
xS~yH[k 原文链接:
https://blog.csdn.net/ruanyz_nobody/article/details/49892037 yL;o{
G