《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > FPGA三段式狀態機的思維陷阱

FPGA三段式狀態機的思維陷阱

2022-07-14
來源:FPGA設計論壇
關鍵詞: FPGA三段式 狀態機

FPGA三段式描述狀態機是否完全正確?FPGA三段式描述有沒有思維陷阱呢?讓我們一起來解讀一下FPGA三段式狀態機的思維邏輯。



       用三段式描述狀態機的好處,國內外各位大牛都已經說的很多了,大致可歸為以下三點:

  1.將組合邏輯和時序邏輯分開,利于綜合器分析優化和程序維護;

  2.更符合設計的思維習慣;

  3.代碼少,比一段式狀態機更簡潔。

  對于第一點,我非常認可,后兩點在Clifford E. Cummings著的(Synthesizable Finite State Machine Design Techniques Using theNew SystemVerilog 3.0 Enhancements和The Fundamentals ofEfficient Synthesizable Finite State Machine Design using NC-Verilog andBuildGates)中多次提到,我并不完全贊同,下面談談我的一些看法。

  先談談第二點關于思維習慣。我發現有些人會有這樣一種習慣,先用一段式狀態機實現功能,仿真ok后,再將其轉成三段式,他們對這種開發方式的解釋是一段式更直觀,可以更便捷的構建功能框架,但是大家都說三段式性能會更好,所以最后又在搭好的邏輯框架下,將一段式轉化為了三段式。這從一個側面說明了,對一部人來說一段式更符合他們的思維習慣,但當已經習慣了一段式的思維方式后,再要換用三段式時,可就不這么容易了,一段式和三段式的寫法之間存在著思維陷阱,特權同學也曾經不小心在此失足過。

  舉一個例子,初始狀態是wr_st,q和p輸出都為0,當計數器count計數到指定的數值10后,輸出結束信號end,狀態機接收到end有效后跳轉為 rd_st,同時輸出q變為1,在rd_st狀態,如jump有效則跳轉到erase_st,如end有效p輸出0否則輸出1,用一段式實現起來很簡單,如下所示。

  assign end = (count == 10);

  always @(posedge clk)

  begin

  case(state)

  wr_st:  if(end) begin

  q     <= 1;

  state<= rd_st;

  end

  else  begin

  q     <= 0;

  state<= wr_st;

  end

  rd_st:  if(jump) begin

  p     <=1;

  state<= erase_st;

  end

  elseif(end) begin

  p     <=  0;

  state<= rd_st;

  end

  else  begin

  p     <=  1;

  state<= rd_st;

  end

  ...

  endcase

  end

  狀態機一

  輸出波形如下所示。

  圖一

  換用三段式描述時,有些人會寫成這樣。

  always @(posedge clk or negedge rst)

  begin

  if(!rst) state <= wr_st;

  else     state <=nextstate;

  end

  always @(*)

  begin

  case(state)

  wr_st: if(end)  nextstate = rd_st;

  else     nextstate = wr_st;

  rd_st: if(jump) nextstate = erase_st

  else     nextstate = rd_st;

  ...

  end

  endcase

  always @(posedge clk)

  begin

  case(nextstate)

  wr_st: if(end) q <= 1;

  else    q<= 0;

  rd_st:  if(end) p <= 0;

  else   p <= 1;

  ...

  endcase

  end

  狀態機二

  看似代碼好像沒有什么問題,但從輸出波形可以看出,q沒有正確輸出。

  圖二

  上圖中狀態轉移正確,但是q輸出錯誤,nextstate由組合邏輯輸出,當end有效后,nextstate立刻變為rd_st,導致A時刻q沒有變化,在將一段式改為三段式的過程中,我們仍保留了一段式的思維習慣,想當然的利用了end信號去控制狀態跳轉,同時又控制了q的輸出,這種思維誤區由以下兩點對三段式狀態機的認知缺陷構成。

  1.書本網上大部分狀態機例程的第三段都是基于nextstate輸出的,很少看到有基于state輸出的,這就形成了一種思維定勢,認為三段式的第三段只能基于nextstate描述。

  2.當三段式狀態機的輸出基于nextstate描述時,無法用同一個輸入信號即觸發當前狀態跳轉,又控制當前狀態輸出正確邏輯,上述例子中A時刻q的錯誤輸出印證了這一點,end可以觸發狀態從wr_st跳轉到rd_st,但無法同時讓q輸出1。

  有兩種解決辦法。

  第一種解決辦法是增加狀態,將wr_st拆分為wr_st0和wr_st1兩個狀態,end信號只控制狀態跳轉,q的輸出跟隨wr_st0和wr_st1變化,第一段不變,如下所示

  always @(*)

  begin

  case(state)

  wr_st0: if(end)  nextstate = wr_st1;

  else     nextstate = wr_st0;

  wr_st1:             nextstate= rd_st;

  rd_st:  if(jump) nextstate = erase_st;

  else      nextstate = rd_st;

  ...

  end

  endcase

  always @(posedge clk)

  begin

  case(nextstate)

  wr_st0:          q<= 0;

  wr_st1:          q<= 1;

  rd_st: if(end) p <= 0;

  else   p <= 1;

  ...

  endcase

  end

  狀態機三

  更改后波形輸出正確,如圖一所示。有些人會覺得這種方式沒有一段式直觀,數據手冊標明的協議只有寫和讀兩個狀態,為什么用三段式狀態機描述時還要增加一個狀態呢?反而有一種拼湊時序的感覺;另一些人會覺得這種思維方式很自然,協議里只有兩個狀態,但是每個狀態里又會有不同的輸出,根據輸入和輸出的不同可以將一個狀態解剖為多個細分狀態,狀態分的越細,越利于綜合工具分析優化,但是狀態太多了也不利于人員的查看維護。將這個問題延展開,目前網站書籍中講解狀態機的例子都以"狀態多,輸出少"為主,這種類型的狀態機,不用太多考慮狀態劃分問題,直接用moor型就ok了,不過,現實工作中我們還會遇到很多"狀態少,輸出多"的情況,那該如何劃分狀態呢?

  一幫人會覺得狀態少更直觀,使用盡量少的狀態,把所有跟當前狀態相關的輸出都寫在同一個狀態里,這種習慣會傾向于寫成一段式或者mealy型;

  一幫人覺得如果一個狀態里的輸出太多了不利于理解,會使用盡量多的狀態,每一個狀態只對應一種輸出,這種習慣會將狀態機傾向寫成moor型。

  如換用上文的例程,主張狀態少的幫派會寫成一段式的狀態機一,或寫成錯誤的狀態機二,主張多狀態的幫派會寫成狀態機三,從性能方面考慮,后者將狀態細分的更清楚,綜合工具會更容易優化分析,獲得更好的性能,但是綜合工具altera和xilinx每年都在更新,分析能力也越來越強,越來越聰明,減少開發者的經驗門檻,按這種趨勢,前者和后者的性能差異也會逐年縮小。從維護升級的方面考慮,前者和后者的輸出都一樣,但是前者的狀態少,代碼會更少些,更利于查看,對代碼理解上面,本來就存在兩種不同的思維習慣,只能智者見智了。

  回到本例中,第二種解決辦法是,僅將狀態機二的第三段的nextstate換成state,其他兩段不變,如下所示。

  always @(posedge clk)

  begin

  case(state)

  wr_st: if(end) q <= 1;

  else       q<= 0;

  rd_st: if(end)  p <= 0;

  else       p<= 1;

  ...

  endcase

  end

  輸出波形和一段式相同,如圖一所示,三段式狀態機的第三段并沒有規定一定要基于nextstate輸出,只是主流資料在介紹三段式狀態機時,多用moor型為例,moor型的特點是輸出僅由狀態決定,當狀態變化時,輸出立刻變化,如要實現輸出緊跟著狀態變化,第三段中就必須要基于nextstate輸出才可以,對比圖一和圖二B時刻,使用state時,當前狀態已經變為rd_st,輸出p滯后了一個時鐘才輸出,而使用nextstate時,當前狀態變為 rd_st的同時輸出p就變化了,再比較圖一和圖二的C時刻,在同一個狀態下,end有效后,兩者的p輸出都一樣,所以可得出,第三段使用nextstate和state的區別在于,當狀態跳轉時,基于nextstate的輸出是立刻變化的,而基于state輸出會延遲一個周期,其他情況都一樣,應該根據自己的時序要求,選擇用nextstate還是state。

  這里提到的三段式的思維陷阱,特權同學曾經也不小心犯過,所著的《深入淺出玩轉FPGA》的p40,漫談狀態機設計一節中舉了sram的例子比較一段式和三段式的區別,一段式是可以按照程序正常運行的,但是三段式的輸出在讀取的狀態下會和一段式略有不同,當cstate進入RD_S1時,如果此時wr_req有效,cmd不會輸出3`b101,而是3`b111,問題在于使用了 wr_req同時控制了RD_S1的跳轉和cmd輸出,RD_S2也存在同樣的問題,如下所示。

  case(cstate)

  ...

  RD_S1: if(wr_req) nstate <=WR_S2;

  else         nstate <= RD_S2;

  RD_S2: if(wr_req) nstate <=WR_S1;

  else         nstate <= IDLE;

  ...

  endcase

  ...

  case(nstate)

  ...

  WR_S2: cmd <= 3'b111;

  RD_S1: if(wr_req)  cmd <=3'b101;

  else          cmd <= 3'b110;

  RD_S2: if(wr_req)  cmd <=3'b011;

  else         cmd <= 3'b111;

  ...

  endcase

  再回到開篇,談談第三點關于代碼量,Clifford E. Cummings在文中提到一段式狀態機會比三段式狀態機會多20%到80%的代碼量,并舉例證明。但是舉得例子都有一個特點"狀態多,輸出少",比如有 10種狀態,但是輸出種類只有5種,很多的狀態都是相同的輸出,這在第三段式描述時就可以利用case的簡寫語法減少代碼量,如下所示

  case (next)

  S0, S2, S4, S5 : ; // defaultoutputs

  S7             :   y3<= 1'b1;

  S1             :   y2<= 1'b1;

  S3             :begin

  y1<= 1'b1;

  y2<= 1'b1;

  end

  S8             :begin

  y2<= 1'b1;

  y3<= 1'b1;

  end

  S6,S9         : begin

  y1<= 1'b1;

  y2<= 1'b1;

  y3<= 1'b1;

  end

  endcase

  但是實際的狀態機中,還有很多是“狀態少,輸出多”的情況,每種狀態都會有不同的輸出,這就無法利用上述的case的簡寫語法了,再試著比較一下,一段式和三段式的輸出邏輯代碼量幾乎一樣,狀態轉移部分也差不多,但是在輸入判斷代碼量方面,一段式只用判斷一次可完成狀態轉移和輸出,對于mealy型,第二段和第三段都要判斷,這就肯定比一段式多了,對于moor型,第二段需要判斷一次,第三段雖然不用判斷但是為了實現相同的功能肯定要將狀態擴展,相比一段式增加了不少的代碼量。所以不能一概而論一段式的代碼量就一定比三段式多,要視具體情況而定。

  


 更多信息可以來這里獲取==>>電子技術應用-AET<<


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美中文字幕| 欧美v亚洲v综合ⅴ国产v| 欧美成人中文字幕在线| 久久成人免费电影| 99精品视频网| 一色屋精品视频在线看| 亚洲另类视频| 亚洲精品少妇| 一区二区三区精品视频在线观看| 国产精品久久久久久久一区探花| 国产精品成av人在线视午夜片| 在线免费一区三区| 国产日本欧美在线观看| 国产欧美精品一区二区色综合| 国产精品福利在线观看| 欧美另类视频在线| 久久综合图片| 亚洲欧美日韩精品久久| 欧美日韩亚洲综合一区| 韩日成人在线| 一区精品在线播放| 香蕉亚洲视频| 久色婷婷小香蕉久久| 国产精品嫩草影院av蜜臀| 午夜欧美视频| 久久久国产精彩视频美女艺术照福利| 亚洲欧美日韩天堂| 日韩一级大片| 国产精品免费久久久久久| 亚洲人成精品久久久久| 国产日韩欧美在线看| 久久久女女女女999久久| 国产日韩精品综合网站| 欧美精品激情在线观看| 欧美福利视频一区| 韩日欧美一区| 欧美日韩18| 日韩午夜电影av| 欧美性猛交xxxx乱大交蜜桃| 99在线精品观看| 国产女人aaa级久久久级| 欧美日韩亚洲一区二区| 牛夜精品久久久久久久99黑人| 国产在线麻豆精品观看| 亚洲主播在线播放| 欧美视频在线观看视频极品| 亚洲综合国产激情另类一区| 欧美人与性动交a欧美精品| 国产午夜精品久久久| 嫩草国产精品入口| 午夜在线一区| 99视频精品全部免费在线| 亚洲人成久久| 亚洲一二三区在线| 欧美日韩在线播放| 亚洲激精日韩激精欧美精品| 亚洲欧洲视频| 国产在线精品成人一区二区三区| 久久精品免视看| 国产精品午夜在线观看| 亚洲韩国精品一区| 久久视频精品在线| 亚洲国产精品久久久久久女王| 欧美插天视频在线播放| 欧美日本三级| 欧美午夜精品一区二区三区| 久久久一本精品99久久精品66| 亚洲已满18点击进入久久| 亚洲欧美日本视频在线观看| 在线亚洲激情| 欧美婷婷六月丁香综合色| 国产精品久久久久久久第一福利| 夜夜嗨av色综合久久久综合网| 欧美1区3d| 亚洲尤物视频在线| 欧美成人在线免费观看| 久久免费高清视频| 欧美日韩一区二区三区在线| 亚洲欧美日韩综合| 久久精品30| 久久久999精品视频| 亚洲国内自拍| 欧美精品手机在线| 一区二区激情小说| 在线成人欧美| 国产综合久久| 亚洲欧美中文在线视频| 欧美午夜一区| 激情亚洲网站| 久久精品99| 久久成人免费日本黄色| 欧美福利电影在线观看| 国产日韩一区二区三区| 欧美国产综合一区二区| 国产精品一国产精品k频道56| 国产精品揄拍500视频| 亚洲午夜一区| 欧美调教vk| 欧美日韩在线高清| 国产精品久久毛片a| 亚洲免费观看高清在线观看| 精品福利免费观看| 亚洲人成人99网站| 久久综合亚洲社区| 久久精品夜色噜噜亚洲a∨| 亚洲欧美日韩直播| 99riav1国产精品视频| 久久一区二区三区四区| 国内外成人免费激情在线视频| 国产精品黄页免费高清在线观看| 老司机免费视频久久| 欧美一区二视频在线免费观看| 久久视频一区| 亚洲图片在区色| 欧美激情小视频| 亚洲精品视频二区| 欧美在线高清视频| 久久久久久香蕉网| 黄色欧美日韩| 亚洲乱码一区二区| 国产乱码精品一区二区三区av| 国产丝袜美腿一区二区三区| 国产精品久久久久7777婷婷| 国产三级欧美三级日产三级99| 免费看的黄色欧美网站| 性做久久久久久| 国产精品一区在线观看你懂的| 国产日韩欧美精品综合| 一色屋精品视频在线观看网站| 免费观看30秒视频久久| 亚洲免费观看高清完整版在线观看| 久久成人亚洲| 亚洲精选一区| 黄色成人精品网站| 欧美午夜精品久久久久久人妖| 欧美人与禽猛交乱配视频| 美女主播一区| 亚洲欧美日韩另类精品一区二区三区| 乱码第一页成人| 一区二区三区在线免费播放| 国产一区成人| 亚洲一区国产| 欧美日韩一区二区三区免费| 国内自拍一区| 久久久久久免费| 激情一区二区| 亚洲精品久久7777| 国产精品综合av一区二区国产馆| 久久国产精品亚洲va麻豆| 在线观看国产一区二区| 亚洲摸下面视频| 欧美日韩第一区| 亚洲美女区一区| 韩日欧美一区二区三区| 亚洲欧美日韩电影| 亚洲电影av| 国产美女精品一区二区三区| 麻豆精品视频在线观看| 国产精品自在在线| 亚洲人成网站在线观看播放| 在线免费不卡视频| 国内久久精品| 国产精品人成在线观看免费| 国内精品久久久久久久果冻传媒| 国内精品99| 久久久久99精品国产片| 另类春色校园亚洲| 亚洲欧美综合一区| 欧美视频在线观看视频极品| 欧美日韩一区二区三区| 欧美日韩国产丝袜另类| 亚洲老司机av| 免费观看30秒视频久久| 国内视频精品| 国产一区二区三区免费不卡| 国产亚洲观看| 久久网站热最新地址| 国产亚洲视频在线观看| 另类图片综合电影| 欧美日韩在线观看视频| 狠狠久久五月精品中文字幕| 欧美中文字幕在线观看| 亚洲视频欧美在线| 亚洲欧美日韩一区二区三区在线观看| 亚洲综合国产激情另类一区| 亚洲免费在线| 91久久精品国产91性色| 久久精品视频99| 国产精品乱子乱xxxx| 另类天堂av| 国产精品欧美一区二区三区奶水| 亚洲影院一区| 亚洲国语精品自产拍在线观看| 亚洲伊人久久综合| 欧美人与性动交α欧美精品济南到| 亚洲深夜福利网站| 久久久久久久久久久成人| 亚洲国产欧美在线人成| 亚洲欧美日本精品| 在线欧美视频| 亚洲第一精品在线| 欧美激情一区二区三区蜜桃视频| 亚洲一区二区三区午夜| 欧美激情亚洲综合一区| 国产亚洲午夜| 欧美成人一区在线| 久久精品导航| 国产精品xnxxcom| 亚洲国产欧美一区二区三区丁香婷| 一区二区三区欧美在线观看| 午夜视黄欧洲亚洲| 久久婷婷色综合| 在线中文字幕一区| 欧美日韩在线精品一区二区三区| 日韩一区二区免费高清| 国产欧美欧洲在线观看| 猫咪成人在线观看| 国产精品自拍一区| 国一区二区在线观看| 亚洲高清在线播放| 免费日本视频一区| 在线不卡a资源高清| 欧美影院午夜播放| 国产精品豆花视频| 国产主播在线一区| 欧美国产日本高清在线| 国产精品久久久久久久久久久久| 亚洲第一精品在线| 一区二区三区不卡视频在线观看| 亚洲国产精品传媒在线观看| 亚洲经典视频在线观看| 你懂的一区二区| 欧美国产专区| 亚洲国产精品va在线看黑人| 欧美精品国产精品日韩精品| 亚洲欧美日韩精品久久| 中日韩在线视频| 久久久久久色| 激情综合网激情| 国精品一区二区三区| 亚洲国产成人tv| 99精品视频一区| 欧美日韩中文在线观看| 亚洲福利专区| 久久久国产精品一区| 牛牛影视久久网| 欧美天堂亚洲电影院在线播放| 国产综合视频在线观看| 亚洲欧美国产日韩中文字幕| 欧美激情麻豆| 欧美精品v日韩精品v国产精品| 欧美久久久久免费| 亚洲精品久久久一区二区三区| 亚洲午夜一区二区| 欧美在线观看一区二区三区| 久久www成人_看片免费不卡| 国产视频丨精品|在线观看| 国产精品视频一二三| 久久三级福利| 一本到高清视频免费精品| 亚洲精品综合精品自拍| 欧美一区二视频| 亚洲一区二区黄| 国产午夜精品美女视频明星a级| 欧美日韩另类丝袜其他| 亚洲视频二区| 欧美国产亚洲视频| 亚洲一二三区精品| 欧美日韩中文精品| 国产精品porn| 狠狠色狠狠色综合人人| 中日韩午夜理伦电影免费| 欧美精品午夜| 欧美一区二区女人| 久久久久久有精品国产| 影音先锋在线一区| 最新高清无码专区| 国产在线观看91精品一区| 午夜久久电影网| 亚洲天堂成人在线视频| 国产一区二区三区在线免费观看| 美日韩精品免费| 久久综合中文| 亚洲激情国产精品| 一区二区三区波多野结衣在线观看| 亚洲欧美日韩高清| 日韩小视频在线观看专区| 亚洲日本国产| 国产一区二区在线观看免费播放| 韩国精品主播一区二区在线观看| 亚洲综合欧美| 欧美大片免费观看在线观看网站推荐| 欧美1区免费| 在线精品亚洲| 国产精品美女久久久久久免费| 欧美理论电影在线观看| 亚洲欧洲日产国产网站| 久久久久**毛片大全| 最新国产精品拍自在线播放| 亚洲资源av| 伊人成年综合电影网| 黑丝一区二区| 欧美一区免费| 欧美与黑人午夜性猛交久久久| 欧美日韩综合另类| 久久综合九色综合欧美就去吻| 鲁鲁狠狠狠7777一区二区| 午夜精品在线看| 亚洲一区二区在线观看视频| 亚洲欧美综合国产精品一区| 欧美精品一区在线| 国产视频久久久久久久| 亚洲激情影院| 国产一区二区三区无遮挡| 欧美日韩中国免费专区在线看| 91久久精品久久国产性色也91| 男人的天堂成人在线| 久久精品人人爽| 久久综合网络一区二区| 国产精品久久久久久久久动漫| 欧美激情视频网站| 亚洲一区3d动漫同人无遮挡| 欧美国产一区二区在线观看| 亚洲日韩欧美视频| 宅男噜噜噜66国产日韩在线观看| 亚洲欧美激情四射在线日| 91久久极品少妇xxxxⅹ软件| 一区二区三区视频免费在线观看|