国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

FPGA開發(fā)基礎(chǔ)之三段式狀態(tài)機(jī)

這篇具有很好參考價(jià)值的文章主要介紹了FPGA開發(fā)基礎(chǔ)之三段式狀態(tài)機(jī)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

狀態(tài)機(jī)由狀態(tài)寄存器和組合邏輯電路構(gòu)成,能夠根據(jù)控制信號(hào)按照預(yù)先設(shè)定的狀態(tài)進(jìn)行狀態(tài)轉(zhuǎn)移,程序的運(yùn)行其本質(zhì)也是狀態(tài)機(jī),根據(jù)輸入完成輸出,得到新的狀態(tài)。

在平時(shí)硬件電路的設(shè)計(jì)中經(jīng)常需要用到狀態(tài)機(jī),例如CPU的取指、譯碼、執(zhí)行,這個(gè)流程可以使用狀態(tài)機(jī)來(lái)控制,相比于流水線能夠有效的較少資源的消耗,再或者序列檢測(cè)上,也可以使用狀態(tài)機(jī)。

狀態(tài)機(jī)有一段、二段、和三段式,三段式的寫法復(fù)雜些,但是相比于兩段式可以使輸出信號(hào)由寄存器來(lái)驅(qū)動(dòng),能夠有效的消除組合邏輯的不穩(wěn)定與毛刺等隱患。

首先給出三段式狀態(tài)機(jī)的通用形式:

三段式狀態(tài)機(jī)

Mealy型(米勒型)三段式狀態(tài)機(jī)

當(dāng)前輸出與當(dāng)前狀態(tài)和輸入有關(guān)

parameter S0=3'b000,
	state1=3'b001,
	state2=3'b010,
	S3=3'b011;

reg [2:0] current_state;
reg [2:0] next_state;


//在第一個(gè)always塊中只實(shí)現(xiàn)狀態(tài)的遷移,將第二個(gè)always塊中計(jì)算出的次態(tài)在時(shí)鐘上升沿復(fù)制給current_state
always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        begin
           current_state<=0;
           next_state<=0;
        end
    else
        begin
            current_state<=next_state;
        end
end

//在第二個(gè)always塊中計(jì)算next_state,使用組合邏輯來(lái)完成
always @(*)
begin
    case(current_state)
    S0:
        if(..) //當(dāng)然此刻的if判斷也能用三目運(yùn)算法來(lái)實(shí)現(xiàn),看上去會(huì)更便捷一些:
            next_state=S1;
        else
            next_state=S0;
    S1:
        if(..) 
            next_state=state?;
        else
            next_state=state?;
    S2:
        if(..) 
            next_state=state?;
        else
            next_state=state?;
    S3:
        if(..) 
            next_state=state?;
        else
            next_state=state?;
    default:
        	next_state=S0;
    endcase   
end
//在第三個(gè)always塊中計(jì)算輸出,在滿足什么情況下輸出
always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        begin
           signal_out<=0;
        end
    else
        begin
            if(current_state==state?&&signal_in==?)
                signal_out<=1;
            else
                signal_out<=0;    
        end
end
Moore型(摩爾型)三段式狀態(tài)機(jī)

當(dāng)前輸出僅僅與當(dāng)前狀態(tài)有關(guān)

parameter S0=3'b000,
	state1=3'b001,
	state2=3'b010,
	S3=3'b011;

reg [2:0] current_state;
reg [2:0] next_state;


//在第一個(gè)always塊中只實(shí)現(xiàn)狀態(tài)的遷移,將第二個(gè)always塊中計(jì)算出的次態(tài)在時(shí)鐘上升沿復(fù)制給current_state
always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        begin
           current_state<=0;
           next_state<=0;
        end
    else
        begin
            current_state<=next_state;
        end
end

//在第二個(gè)always塊中計(jì)算next_state,使用組合邏輯來(lái)完成
always @(*)
begin
    case(current_state)
    S0:
        if(..) //當(dāng)然此刻的if判斷也能用三目運(yùn)算法來(lái)實(shí)現(xiàn),看上去會(huì)更便捷一些:
            next_state=S1;
        else
            next_state=S0;
    S1:
        if(..) 
            next_state=state?;
        else
            next_state=state?;
    S2:
        if(..) 
            next_state=state?;
        else
            next_state=state?;
    S3:
        if(..) 
            next_state=state?;
        else
            next_state=state?;
    default:
        	next_state=S0;
    endcase   
end
//在第三個(gè)always塊中計(jì)算輸出,在滿足什么情況下輸出
always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        begin
           signal_out<=0;
        end
    else
        begin
            if(current_state==state?)
                signal_out<=1;
            else
                signal_out<=0;    
        end
end

兩種三段式狀態(tài)機(jī)的狀態(tài)圖會(huì)有區(qū)別

測(cè)試用例

接下來(lái)我們使用具體的場(chǎng)景來(lái)介紹兩者不同

設(shè)計(jì)一個(gè)狀態(tài)機(jī),用來(lái)檢測(cè)序列 10111,要求:

1、進(jìn)行非重疊檢測(cè) 即101110111 只會(huì)被檢測(cè)通過(guò)一次

2、寄存器輸出且同步輸出結(jié)果

信號(hào)示意圖:

三段式狀態(tài)機(jī),FPGA,fpga開發(fā)

輸入描述:

輸入信號(hào) clk rst data
類型 wire

輸出描述:

輸出信號(hào) flag
類型 reg

首先第一件事就是畫出狀態(tài)轉(zhuǎn)移,在此刻我們一定要注意到,flag是在檢測(cè)完成的這一個(gè)周期拉高的,而不是下個(gè)周期

Mealy型(米勒型)狀態(tài)圖——輸出與輸入和現(xiàn)態(tài)有關(guān)

這個(gè)時(shí)候我們來(lái)解析這張圖

三段式狀態(tài)機(jī),FPGA,fpga開發(fā)

復(fù)位之后當(dāng)前狀態(tài)是S0,假設(shè)在第一個(gè)時(shí)鐘上升沿之前,data輸入1,則通過(guò)第二個(gè)always組合邏輯塊,會(huì)計(jì)算出next_state=S1,在第一個(gè)時(shí)鐘上升沿,next_state=S1就會(huì)被賦值給current_state,也就是說(shuō)從第一個(gè)上升沿之后到第二個(gè)上升沿之前,current會(huì)一直保持S1的狀態(tài)。

假設(shè)在第一個(gè)上升沿之后到第二個(gè)上升沿之前,data輸入變?yōu)榱?,那么同理,組合邏輯會(huì)計(jì)算出新的next_state=S2,在第二個(gè)時(shí)鐘上升沿倘若data不發(fā)生變化,則新的next_state會(huì)被賦值給current_state,從第二個(gè)上升沿之后到第三個(gè)上升沿之前,current會(huì)一直保持S2的狀態(tài)。

假設(shè)在第二個(gè)上升沿之后到第三個(gè)上升沿之前,data輸入變?yōu)榱?,那么同理,組合邏輯會(huì)計(jì)算出新的next_state=S3,在第三個(gè)時(shí)鐘上升沿倘若data不發(fā)生變化,則新的next_state會(huì)被賦值給current_state,從第三個(gè)上升沿之后到第四個(gè)上升沿之前,current會(huì)一直保持S3的狀態(tài)。

假設(shè)在第三個(gè)上升沿之后到第四個(gè)上升沿之前,data輸入變?yōu)榱?,那么同理,組合邏輯會(huì)計(jì)算出新的next_state=S4,在第四個(gè)時(shí)鐘上升沿倘若data不發(fā)生變化,則新的next_state會(huì)被賦值給current_state,從第四個(gè)上升沿之后到第五個(gè)上升沿之前,current會(huì)一直保持S4的狀態(tài)。

假設(shè)在第四個(gè)上升沿之后到第五個(gè)上升沿之前,data輸入變?yōu)榱?,此時(shí)注意,前面我們談到過(guò),在這個(gè)題目中,在完成序列檢測(cè)的這一個(gè)周期,flag就要拉高,此時(shí)我們需要第五個(gè)上升沿將flag拉高,因此需要在第三個(gè)always語(yǔ)句塊中定位到這個(gè)時(shí)刻,也就是current_state= =S4&&data= =1,這也就是輸出和現(xiàn)態(tài)以及輸入都有關(guān),之后current_state將變?yōu)镾0,重新進(jìn)行一輪新的檢測(cè)。

`timescale 1ns/1ns

module sequence_test1(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);


  parameter S0=0,
			S1=1,
			S2=2,
			S3=3,
			S4=4,
			S5=5;
	reg [2:0] current_state;
	reg [2:0] next_state;
  always @(posedge clk or negedge rst)
  begin
	  if(!rst)
	  begin
		current_state<=0;
		next_state<=0;
	  end
	  else
	  begin
		current_state<=next_state;
	  end
  end

  always @(*)
  begin
	case(current_state)
	  	S0:begin
			next_state<=data==1?S1:S0;
	  	end
		S1:begin
			next_state<=data==0?S2:S0;
	  	end
		S2:begin
			next_state<=data==1?S3:S0;
	  	end
		S3:begin
			next_state<=data==1?S4:S0;
	  	end
	  	S4:begin
			next_state<=S0;
	  	end
	  	end
        default:
            nex_state<=S0;
	endcase
  end

  always @(posedge clk or negedge rst)
  begin
	  if(!rst)
	  begin
		flag<=0;
	  end
	  else
	  begin
          if(current_state==S4&&data==1) 
		flag<=1;
		else
		flag<=0;
	  end
  end

endmodule
Moore型(摩爾型)狀態(tài)圖——輸出只與現(xiàn)態(tài)有關(guān)

三段式狀態(tài)機(jī),FPGA,fpga開發(fā)

Moore型(摩爾型)狀態(tài)機(jī)與米勒型稍有不同,下面我們嘗試用摩爾狀態(tài)機(jī)來(lái)解決這個(gè)問(wèn)題

倘若在某個(gè)時(shí)鐘上升沿時(shí),當(dāng)前current_state=S4時(shí),此時(shí)若data=1,按照題目的要求,在這個(gè)上升沿結(jié)束之后flag就應(yīng)該立刻拉高,而Moore型狀態(tài)機(jī)的輸出只與現(xiàn)態(tài)有關(guān),在這個(gè)時(shí)刻current_state=S4,僅僅根據(jù)這個(gè)條件我們無(wú)法判斷輸出是0還是1,若將flag拉高了,但是data為0,那就是錯(cuò)誤的,因此在當(dāng)前時(shí)刻必須結(jié)合輸入才能得出正確的輸出,在下一個(gè)時(shí)鐘上升沿,檢測(cè)到current_state=S5時(shí)才能將flag拉高,這是才是正確的,因此Moore型狀態(tài)機(jī)相比Mealy狀態(tài)機(jī)會(huì)延遲一個(gè)周期。

代碼如下

`timescale 1ns/1ns

module sequence_test1(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);


  parameter S0=0,
			S1=1,
			S2=2,
			S3=3,
			S4=4,
			S5=5;
	reg [2:0] current_state;
	reg [2:0] next_state;
  always @(posedge clk or negedge rst)
  begin
	  if(!rst)
	  begin
		current_state<=0;
		next_state<=0;
	  end
	  else
	  begin
		current_state<=next_state;
	  end
  end

  always @(*)
  begin
	case(current_state)
	  	S0:begin
			next_state<=data==1?S1:S0;
	  	end
		S1:begin
			next_state<=data==0?S2:S0;
	  	end
		S2:begin
			next_state<=data==1?S3:S0;
	  	end
		S3:begin
			next_state<=data==1?S4:S0;
	  	end
	  	S4:begin
			next_state<=data==1?S5:S0;
	  	end
	  	S5:begin
			next_state<=S0;
	  	end
        default:
            nex_state<=S0;
	endcase
  end

  always @(posedge clk or negedge rst)
  begin
	  if(!rst)
	  begin
		flag<=0;
	  end
	  else
	  begin
          if(current_state==S5) ,
		flag<=1;
		else
		flag<=0;
	  end
  end

endmodule
修改后的Moore型(摩爾型)狀態(tài)機(jī)

我們可以通過(guò)將判斷條件改為next_state==S5,這種方式將輸出提前一個(gè)周期,因?yàn)閚ext_state本就是根據(jù)current_state和data得出的,所以提前一個(gè)周期用也無(wú)妨。

`timescale 1ns/1ns

module sequence_test1(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);


  parameter S0=0,
			S1=1,
			S2=2,
			S3=3,
			S4=4,
			S5=5;
	reg [2:0] current_state;
	reg [2:0] next_state;
  always @(posedge clk or negedge rst)
  begin
	  if(!rst)
	  begin
		current_state<=0;
		next_state<=0;
	  end
	  else
	  begin
		current_state<=next_state;
	  end
  end

  always @(*)
  begin
	case(current_state)
	  	S0:begin
			next_state<=data==1?S1:S0;
	  	end
		S1:begin
			next_state<=data==0?S2:S0;
	  	end
		S2:begin
			next_state<=data==1?S3:S0;
	  	end
		S3:begin
			next_state<=data==1?S4:S0;
	  	end
	  	S4:begin
			next_state<=data==1?S5:S0;
	  	end
	  	S5:begin
			next_state<=S0;
	  	end
        default:
            nex_state<=S0;
	endcase
  end

  always @(posedge clk or negedge rst)
  begin
	  if(!rst)
	  begin
		flag<=0;
	  end
	  else
	  begin
          if(next_state==S5) ,
		flag<=1;
		else
		flag<=0;
	  end
  end

endmodule

這種方法相比于Mealy機(jī)多了一個(gè)狀態(tài)S5文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-762283.html

到了這里,關(guān)于FPGA開發(fā)基礎(chǔ)之三段式狀態(tài)機(jī)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【零基礎(chǔ)玩轉(zhuǎn)BLDC系列】無(wú)刷直流電機(jī)無(wú)位置傳感器三段式啟動(dòng)法詳細(xì)介紹及代碼分享

    無(wú)刷直流電動(dòng)機(jī)基本轉(zhuǎn)動(dòng)原理等內(nèi)容請(qǐng)參考《基于霍爾傳感器的無(wú)刷直流電機(jī)控制原理》、《基于反電動(dòng)勢(shì)過(guò)零檢測(cè)法的無(wú)刷直流電機(jī)控制原理》與《以GD32F30x為例定時(shí)器相關(guān)功能詳解》,BLDC基本原理及基礎(chǔ)知識(shí)本篇不再贅述。 直流無(wú)刷電機(jī)由于定子繞組的反電動(dòng)勢(shì)與電機(jī)的

    2023年04月08日
    瀏覽(30)
  • Flutter BottomSheet 三段式拖拽

    Flutter BottomSheet 三段式拖拽

    前面倒是有講過(guò)Android原生的BottomSheetBehavior,使用場(chǎng)景還是蠻多的,最近在用Flutter做一款地圖App,有用到BottomSheet的功能,但是 Flutter 自帶的BottomSheet有點(diǎn)拉,只能顯示和隱藏銷毀,不支持折疊為最小高度狀態(tài)也不支持三段式拖動(dòng) ,那就自己擼一個(gè)吧: 既然是基于系統(tǒng)的Bot

    2024年02月09日
    瀏覽(24)
  • [Daimayuan] 三段式(C++,數(shù)組前綴和)

    有一個(gè)長(zhǎng)度為 n n n 的序列,現(xiàn)在我們想把它切割成三段(每一段都是連續(xù)的),使得每一段的元素總和都相同,請(qǐng)問(wèn)有多少種不同的切割方法 輸入描述 第一行給出一個(gè)數(shù) n n n ,( 1 ≤ n ≤ 1 0 5 1≤n≤10^5 1 ≤ n ≤ 1 0 5 ) 第二行給出序列 a 1 a_1 a 1 ? , a 2 a_2 a 2 ? , a 3 a_3 a 3 ?

    2024年02月05日
    瀏覽(18)
  • 電力系統(tǒng)電流三段式保護(hù)MATLAB仿真模型

    電力系統(tǒng)電流三段式保護(hù)MATLAB仿真模型

    完整資源請(qǐng)查看主頁(yè)置頂博客(專享優(yōu)惠) 整體模型如下: Matlab/Simulink搭建的電力系統(tǒng)電流保護(hù)模型采用輻射型單電源供電的運(yùn)行方式 Ⅰ段保護(hù)的搭建 Ⅰ段保護(hù)為瞬時(shí)速斷保護(hù),根據(jù)Ⅰ段整定原則確定整定值。線路發(fā)生短路故障時(shí),短路電流急劇增大;超過(guò)設(shè)置的整定值時(shí)

    2024年02月14日
    瀏覽(24)
  • 三段式電流保護(hù)與自動(dòng)重合閘MATLAB仿真模型

    三段式電流保護(hù)與自動(dòng)重合閘MATLAB仿真模型

    微 ? 關(guān)注“電氣仔推送”獲得資料(專享優(yōu)惠) 前加速、后加速的區(qū)別: 前加速是保護(hù)裝置不判別是永久性故障還是瞬時(shí)故障,直接跳閘,然后經(jīng)重合閘裝置來(lái)糾正;后加速是保護(hù)裝置是先判別故障類型有選擇性跳閘 以下只敘述后加速的相關(guān)內(nèi)容,前加速不在贅述?。?!

    2024年02月02日
    瀏覽(22)
  • 【FPGA零基礎(chǔ)學(xué)習(xí)之旅#10】按鍵消抖模塊設(shè)計(jì)與驗(yàn)證(一段式狀態(tài)機(jī)實(shí)現(xiàn))

    【FPGA零基礎(chǔ)學(xué)習(xí)之旅#10】按鍵消抖模塊設(shè)計(jì)與驗(yàn)證(一段式狀態(tài)機(jī)實(shí)現(xiàn))

    ??歡迎來(lái)到FPGA專欄~按鍵消抖模塊設(shè)計(jì)與驗(yàn)證 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏與酒 ?? ? 博客主頁(yè): 小夏與酒的博客 ??該系列 文章專欄: FPGA學(xué)習(xí)之旅 文章作者技術(shù)和水平有限,如果文中出現(xiàn)錯(cuò)誤,希望大家能指正?? ?? 歡迎大家關(guān)注! ?? ?? 模塊設(shè)計(jì): ?? 按鍵消

    2024年02月12日
    瀏覽(24)
  • 【FPGA零基礎(chǔ)學(xué)習(xí)之旅#9】狀態(tài)機(jī)基礎(chǔ)知識(shí)

    【FPGA零基礎(chǔ)學(xué)習(xí)之旅#9】狀態(tài)機(jī)基礎(chǔ)知識(shí)

    ??歡迎來(lái)到FPGA專欄~狀態(tài)機(jī)基礎(chǔ)知識(shí) ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏與酒 ?? ? 博客主頁(yè): 小夏與酒的博客 ??該系列 文章專欄: FPGA學(xué)習(xí)之旅 文章作者技術(shù)和水平有限,如果文中出現(xiàn)錯(cuò)誤,希望大家能指正?? ?? 歡迎大家關(guān)注! ?? ?? Hello狀態(tài)機(jī)例程 : RTL視圖: 狀態(tài)

    2024年02月16日
    瀏覽(17)
  • FPGA在校學(xué)習(xí)記錄系列---實(shí)驗(yàn)4不同狀態(tài)的LED+開發(fā)板(Verilog HDL)

    FPGA在校學(xué)習(xí)記錄系列---實(shí)驗(yàn)4不同狀態(tài)的LED+開發(fā)板(Verilog HDL)

    此系列記錄FPGA在學(xué)校的學(xué)習(xí)過(guò)程。 FPGA系列 需要用到的軟硬件: 軟件:Quartus II 15.0 (64-bit) 硬件: 5CEBA4F23C7芯片 鏈接: FPGA在校學(xué)習(xí)記錄系列—新建一個(gè)FPGA工程編寫程序并仿真(Verilog HDL) 創(chuàng)建的工程名字為:LED (這次不用仿真,直接用開發(fā)板驗(yàn)證) 編譯文件 按鍵資源:

    2024年04月09日
    瀏覽(27)
  • FPGA設(shè)計(jì)開發(fā)(基礎(chǔ)課題):分頻器設(shè)計(jì)

    FPGA設(shè)計(jì)開發(fā)(基礎(chǔ)課題):分頻器設(shè)計(jì)

    一、設(shè)計(jì)目的 1、掌握分頻器的設(shè)計(jì)原理; 2、用HDL語(yǔ)言設(shè)計(jì)分頻器。 二、設(shè)計(jì)原理 分頻器與計(jì)數(shù)器類似,也是要對(duì)時(shí)鐘脈沖進(jìn)行計(jì)數(shù),但其輸出的不是對(duì)時(shí)鐘脈沖個(gè)數(shù)的計(jì)數(shù)值,而是其頻率與時(shí)鐘的頻率成固定比例關(guān)系的脈沖信號(hào)。整數(shù)分頻是所有分頻器中最簡(jiǎn)單,最容易

    2024年02月13日
    瀏覽(24)
  • FPGA開發(fā)基礎(chǔ)篇之一(接口篇)UART串口

    寫在前面 從本文開始,將連載fpga開發(fā)基礎(chǔ)知識(shí),將這幾年淺顯的fpga開發(fā)經(jīng)驗(yàn)整理出來(lái),一是梳理一下這幾年給別人做fpga的經(jīng)歷,同時(shí)也是分享給大家,也希望大牛批評(píng)指正。 一、UART串口通信基本概念 串口通信是非?;厩覒?yīng)用十分廣泛的低速通信接口,無(wú)論是在dsp、單片

    2024年02月02日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包