久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1675|回復: 1
打印 上一主題 下一主題
收起左側

verilog狀態機編寫技巧

[復制鏈接]
跳轉到指定樓層
樓主
ID:704585 發表于 2020-3-28 14:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
時序電路的狀態是一個狀態變量集合,這些狀態變量在任意時刻的值都包含了為確定電路的未來行為而必需考慮的所有歷史信息。
     狀態機采用VerilogHDL語言編碼,建議分為三個always段完成。這是為什么呢?
    設計FSM的方法和技巧多種多樣,但是總結起來有兩大類:第一種,將狀態轉移和狀態的操作和判斷等寫到一個模塊(process、block)中。另一種是將狀態轉移單獨寫成一個模塊,將狀態的操作和判斷等寫到另一個模塊中(在Verilog代碼中,相當于使用兩個“always” block)。其中較好的方式是后者。其原因如下。
     首先FSM和其他設計一樣,最好使用同步時序方式設計,好處不再累述。而狀態機實現后,狀態轉移是用寄存器實現的,是同步時序部分。狀態的轉移條件的判斷是通過組合邏輯判斷實現的,之所以第二種比第一種編碼方式合理,就在于第二種編碼將同步時序和組合邏輯分別放到不同的程序塊(process,block)中實現。這樣做的好處不僅僅是便于閱讀、理解、維護,更重要的是利于綜合器優化代碼,利于用戶添加合適的時序約束條件,利于布局布線器實現設計。
     三段式建模描述FSM的狀態機輸出時,只需指定case敏感表為次態寄存器,然后直接在每個次態的case分支中描述該狀態的輸出即可,不用考慮狀態轉移條件。
   三段式描述方法雖然代碼結構復雜了一些,但是換來的優勢是使FSM做到了同步寄存器輸出,消除了組合邏輯輸出的不穩定與毛刺的隱患,而且更利于時序路徑分組,一般來說在FPGA/CPLD等可編程邏輯器件上的綜合與布局布線效果更佳。
示例如下:
//第一個進程,同步時序always模塊,格式化描述次態寄存器遷移到現態寄存器
always @ (posedge clk or negedge rst_n)   //異步復位
if(!rst_n)
    current_state <= IDLE;
else
    current_state <= next_state;//注意,使用的是非阻塞賦值
//第二個進程,組合邏輯always模塊,描述狀態轉移條件判斷
always @ (current_state)    //電平觸發
   begin
     next_state = x;   //要初始化,使得系統復位后能進入正確的狀態
     case(current_state)
     S1: if(...)
        next_state = S2;   //阻塞賦值
     ...
     endcase
end
//第三個進程,同步時序always模塊,格式化描述次態寄存器輸出
always @ (posedge clk or negedge rst_n)
...//初始化
case(next_state)
S1:
    out1 <= 1'b1;   //注意是非阻塞邏輯
S2:
    out2 <= 1'b1;
default:...    //default的作用是免除綜合工具綜合出鎖存器。
endcase
end
三段式并不是一定要寫為3個always塊,如果狀態機更復雜,就不止3段了。
//注:================================================================
1. 三段always模塊中,第一個和第三個always模塊是同步時序always模塊,用非阻塞賦值(“ <= ”);第二個always模塊是組合邏輯always模塊,用阻塞賦值(“ = ”)。
2. 第二部分為組合邏輯always模塊,為了抑制warning信息,對于always的敏感列表建議采用always@(*)的方式。
3. 第二部分,組合邏輯always模塊,里面判斷條件一定要包含所有情況!可以用else保證包含完全。
4. 第二部分,組合邏輯電平要維持超過一個clock,仿真時注意。
5. 需要注意:第二部分case中的條件應該為當前態(current_state),第三部分case中的條件應該為次態(next_state)。
6. 編碼原則,binary和gray-code適用于觸發器資源較少,組合電路資源豐富的情況(CPLD),對于FPGA,適用one-hot code。這樣不但充分利用FPGA豐富的觸發器資源,還因為只需比較一個bit,速度快,組合電路簡單。
7. 初始化狀態和默認狀態。
     一個完備的狀態機(健壯性強)應該具備初始化狀態和默認狀態。當芯片加電或者復位后,狀態機應該能夠自動將所有判斷條件復位,并進入初始化狀態。需要注明的一點是,大多數FPGA有GSR(Global Set/Reset)信號,當FPGA加電后,GSR信號拉高,對所有的寄存器,RAM等單元復位/置位,這時配置于FPGA的邏輯并未生效,所以不能保證正確的進入初始化狀態。所以使用GSR企圖進入FPGA的初始化狀態,常常會產生種種不必一定的麻煩。一般的方法是采用異步復位信號,當然也可以使用同步復位,但是要注意同步復位的邏輯設計。解決這個問題的另一種方法是將默認的初始狀態的編碼設為全零,這樣GSR復位后,狀態機自動進入初始狀態。
     令一方面狀態機也應該有一個默認(default)狀態,當轉移條件不滿足,或者狀態發生了突變時,要能保證邏輯不會陷入“死循環”。這是對狀態機健壯性的一個重要要求,也就是常說的要具備“自恢復”功能。對應于編碼就是對case,if-else語句要特別注意,要寫完備的條件判斷語句。VHDL中,當使用CASE語句的時候,要使用“When Others”建立默認狀態。使用“IF...THEN...ELSE”語句的時候,要用在“ELSE”指定默認狀態。Verilog中,使用“case”語句的時候要用“default”建立默認狀態,使用“if...else”語句的注意事項相似。
8. 另外提一個技巧:大多數綜合器都支持Verilog編碼狀態機的完備狀態屬性--“full case”。這個屬性用于指定將狀態機綜合成完備的狀態,如Synplicity的綜合工具(Synplify/Synplify Pro,Amplify,etc)支持的命令格式如下:
     case (current_state) // synthesis full_case
     2’b00 : next_state <= 2’b01;
     2’b01 : next_state <= 2’b11;
     2’b11 : next_state <= 2’b00;
     //這兩段代碼等效
    case (current_state)
     2’b00 : next_state <= 2’b01;
     2’b01 : next_state <= 2’b11;
     2’b11 : next_state <= 2’b00;
     default : next_state <= 2bx;
     
9. Synplicity還有一個關于狀態機的綜合屬性,叫“synthesis parallel_case”,其功能是檢查所有的狀態是“并行的”(parallel),也就是說在同一時間只有一個狀態能夠成立。
10.            狀態機的定義可以用parameter定義,但是不推薦使用`define宏定義的方式,因為`define宏定義在編譯時自動替換整個設計中所定義的宏,而parameter僅僅定義模塊內部的參數,定義的參數不會與模塊外的其他狀態機混淆。
11.            對于狀態比較多的狀態機,可以將所有狀態分為幾個大狀態,然后再使用小狀態,可以減少狀態譯碼的時間。
12.            在代碼中添加綜合器的綜合約束屬性或者在圖形界面下設置綜合約束屬性可以比較方便的改變狀態的編碼。
如VHDL的示例:
Synplicity:
     attribute syn_encoding : string;
     attribute syn_encoding of <signal_name> : type is "value ";
     -- The syn_encoding attribute has 4 values : sequential, onehot, gray and safe.
     Exemplar:
     -- Declare TYPE_ENCODING_STYLE. attribute
     -- Not needed if the exemplar_1164 package is used
     type encoding_style. is (BINARY, ONEHOT, GRAY, RANDOM, AUTO);
     attribute TYPE_ENCODING_STYLE. encoding_style;
     ...
     attribute TYPE_ENCODING_STYLE. of <typename> : type is ONEHOT;
Verilog示例:
    Synplicity:
     Reg[2:0] state; /* synthesis syn_encoding = "value" */;
     // The syn_encoding attribute has 4 values : sequential, onehot, gray and safe.
       Exemplar:
     Parameter /* exemplar enum <type_name> */ s0 = 0, s1 = 1, s2 = 2, s3 = 3, S4 = 4;
     Reg [2:0] /* exemplar enum <type_name> */ present_state, next_state ;
13.            小技巧:仔細檢查綜合器的綜合報告,目前大多數的綜合器對所綜合出的latch都會報“warning”,通過綜合報告可以較為方便地找出無意中生成的latch


verilog狀態機編寫技巧.doc

41.5 KB, 下載次數: 10, 下載積分: 黑幣 -5

verilog狀態機編寫技巧

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:5203 發表于 2020-3-29 09:40 | 只看該作者
謝謝樓主分享!!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久国产成人免费 | 四虎永久免费地址 | 九九成人 | 中文字幕免费视频 | 一级毛片视频在线 | 一区二区三区欧美在线 | 久久高清精品 | 国产乱一区二区三区视频 | 欧美久久久久久 | 91精品国产91久久久久久吃药 | 日本一级淫片免费啪啪3 | 免费一级黄色 | 日韩久久久久 | 久操伊人 | 97人人澡人人爽91综合色 | 亚洲精品久久久一区二区三区 | 国产中文一区二区三区 | 波波电影院一区二区三区 | 综合国产在线 | 免费一区二区三区 | 国产高清av免费观看 | 超碰在线人人干 | 国产亚洲第一页 | 亚洲欧美在线免费观看 | 午夜在线精品偷拍 | 波多野结衣亚洲 | 免费久久99精品国产婷婷六月 | 成人综合视频在线 | 国产一区二区三区久久久久久久久 | 99精品在线免费观看 | 精品一区二区久久久久久久网精 | 美女131mm久久爽爽免费 | 久久精彩视频 | 国产精品精品 | 亚洲精品综合 | 欧美伊人久久久久久久久影院 | 亚洲激精日韩激精欧美精品 | 日本三级电影免费 | 久久一区精品 | 黄色在线免费看 | 午夜精品|