论坛风格切换切换到宽版
发帖 回复
返回列表  提醒:不能用迅雷等P2P下载,否则下载失败标(二级)的板块,需二级才能下载,没二级不要购买,下载不了
  • 955阅读
  • 6回复

[资料贡献]fpga状态机详解 [复制链接]

上一主题 下一主题
 

性别:
人妖
发帖
365
金币
0
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看楼主 倒序阅读 使用道具 0楼 发表于: 2020-06-04
什么是状态机:状态机通过不同的状态迁移来完成特定的逻辑操作 $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|s p  
举个例子:从循环输入的字母中做连续检测,当连续检测到“hello”时,将led灯进行状态的翻转,继续进行下一次的检测。 @KOa5-u  
~lDLdUs  
yp@mxI@1  
O b8[P=  
一段式的编写方式: V.y+u7<3}  
LvWU %?  
T d;e\s/]  
rFx2 S  
V2g$"W?3  
module  hello( Vaha--QB  
input clk,//系统时钟信号  50mHz ~%#?;hJ  
input rst_n,//系统复位信号,低电平有效 !-N!8 0  
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}MJ?uvA  
                checklb: /C(L(X  
                    if(data == "l") state <= checko; fk"{G>&8  
                    else  state <= checkh; 8odVdivh  
                checko: nuCK7X  
                    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; |rvrSab)  
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_\$  
H4NEB1 TO>  
%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 .Z l{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 gvqd 1?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) B2G5h baA  
if(!rst_n) Krr?`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  


评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

一般

差劲
离线yangxf0120

性别:
帅哥
发帖
4974
金币
3315
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 1楼 发表于: 2020-06-04
谢谢分享fpga状态机详解


离线tengcai

性别:
人妖
发帖
108
金币
99
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 2楼 发表于: 2020-06-05
学习状态机,没学习就直接弄过,总觉得少点理解


离线armstm32

性别:
人妖
发帖
1548
金币
2502
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 3楼 发表于: 2020-06-05



性别:
人妖
发帖
1447
金币
790
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 4楼 发表于: 2020-06-05
    


离线墙头草

性别:
人妖
发帖
1213
金币
2022
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 5楼 发表于: 2020-06-05


离线zzl123

性别:
人妖
发帖
298
金币
1064
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 6楼 发表于: 2020-06-18
FPGA需要了解一些


快速回复
限150 字节
 
上一个 下一个