抗擊疫情,在家辦公,第二天

2.10 今天繼續回顧基礎.

案例一:序列檢測

案例二:狀態機

狀態機描述時關鍵是要描述清楚幾個狀態機的要素,即如何進行
狀態的轉移,每個狀態的輸出是什麼,狀態轉移的條件。具體描述時
方法各種各樣,最常見的有三種描述方式:

1. 一段式:整個狀態機寫到一個 always 模塊裏面,在該模塊中
即描述狀態轉移,又描述狀態的輸入和輸出。
2. 兩段式:用兩個 always 模塊來描述狀態機,其中一個 always
模塊採用同步時序描述狀態轉移,另一個模塊採用組合邏輯判
斷狀態轉移條件,描述狀態轉移規律以及輸出。
3. 三段式:在兩個 always 模塊描述的方法基礎上,使用三個
always 模塊,一個 always 模塊採用同步時序描述狀態轉移,
一個 always 模塊採用組合邏輯判斷狀態轉移條件,描述狀態
轉移規律,另一個 always 模塊描述狀態輸出(可以用組合邏
輯電路輸出,也可以用時序邏輯電路輸出)。
 

一般而言,推薦的 FSM(有限自動狀態機)描述方法是後兩種。
這是因爲: FSM 和其他的設計一樣,最好使用同步時序方式設計,以
提高設計的穩定性,消除毛刺。狀態機實現後,一般來說,狀態轉移
 

部分是同步時序電路而狀態的轉移條件的判斷是組合邏輯。
第二種描述方法同第一種描述方法相比,將同步時序和組合邏輯
分別放到不同的 always 模塊中實現,這樣做的好處不僅僅是便於閱
讀、理解、維護,更重要的是利於綜合器優化代碼,利於用戶添加合
適的時序約束條件,利於佈局佈線器實現設計。在第二種方式的描述
中,描述當前狀態的輸出用組合邏輯實現,組合邏輯很容易產生毛刺,
造成設計的不穩定。
第三種描述方式與第二種相比,關鍵在於根據狀態轉移規律,在
上一狀態根據輸入條件判斷當前狀態的輸出,從而在不插入額外時鐘
節拍的前提下,實現了寄存器輸出
 

按鍵的抖動的處理:

1按鍵抖動帶來的危害
鍵抖動會引起一次按鍵被誤讀多次。爲確保 CPU 對鍵的一次閉
合僅作一次處理,必須去除鍵抖動。在鍵閉合穩定時讀取鍵的狀
態,並且必須判別到鍵釋放穩定後再作處理。
2. 抖動的一些參數
抖動時間的長短由按鍵的機械特性決定,一般爲 5ms~10ms。
這是一個很重要的時間參數,在很多場合都要用到。 按鍵穩定閉
合時間的長短則是由操作人員的按鍵動作決定的,一般爲零點幾
秒至數秒。
3. 解決辦法
一是延時重採樣;二是持續採樣。 從理論上來說,延時(如10ms)重採樣的準確率肯定低於持續採樣。 筆者採用持續採樣


Verilog HDL 語言中存在兩種賦值語言:
● 非阻塞型賦值語句
● 阻塞型賦值語句

1. 非阻塞型語句
以賦值操作符“ <=”來標識的賦值操作稱爲“ 非阻塞型過程賦值
(Nonblocking Assignment)”。 非阻塞型過程賦值語句的特點是:
(1) 在 begin-end 串行語句塊中,一條非阻塞過程語句的執行不會阻塞下一條
語句的執行,也就是說在本條非阻塞型過程賦值語句對應的賦值操作執行
完之前,下一條語句也可以開始執行。
(2) 仿真過程在遇到非阻塞型過程賦值語句後首先計算其右端賦值表達式的
值,然後等到仿真時間步結束時再將該計算結果賦值變量。也就是說,這
種情況下的賦值操作是在同一仿真時刻上的其他普通操作結束後纔得到
執行的。
如以下語句的程序 1:
Initial
begin
A<=B;//語句 S1
B<=A; //語句 S2
end
上述語句中包含了兩條非阻塞型過程賦值語句 S1 和 S2,當仿真進程遇到
Initial 過程塊後(0 時刻),語句 S1 首先開始執行,賦值表達式“B”的值得到
計算(但是對被賦值變量 A 的賦值操作要等到當前時間步結束才執行),同時由
於 S1 是一條非阻塞型賦值語句,所以 S1 的執行不會阻塞 S2 的執行;由於 S2
也隨即開始執行,其對應的賦值表達式“A”的值得到計算,由於這時 S1 對 A
的賦值操作還沒有執行,所以此時計算得到的賦值表達式取值是 A 的初值。由於
S2 也是一條非阻塞型賦值語句,它對應的爲變量 B 進行賦值操作也要等到當前
時間步結束時纔會得到執行;所以在當前時間步結束時, S1、 S2 兩條語句對應的賦值操作同時執行,分別將計算得到的 A 和 B 初值賦給變量 B 和 A,這樣就交
換了 A 與 B 的取值。
2. 阻塞型語句
以賦值操作符“=”來標識的賦值操作稱爲“阻塞型過程賦值( blocking
Assignment)”。非阻塞型過程賦值語句的特點是:
(1) 串行塊(begin-end)中的各條阻塞型過程賦值語句將以它們在順序塊後排
列次序依次得到執行。
(2)阻塞型過程賦值語句的執行過程是:首先計算右端賦值表達式的值,然後
立即將計算結果賦值給“=”左端的被賦值變量。
阻塞型過程賦值語句的這兩個特點表明:仿真進程在遇到阻塞型過程賦值
語句時將計算表達式的值並立即將其結果賦給等式左邊的被賦值變量;在串行語
句塊中,下一條語句的執行會被本條阻塞型過程賦值語句所阻塞,只有在當前這
條阻塞型過程賦值語句所對應的賦值操作執行完後下一條語句才能開始執行。
例如語句程序 2:
initial
begin
a=0;//語句 S1
a=1;//語句 s2
end
在這段語句中包含兩條阻塞型過程賦值語句 S1 和 S2,它們都是在仿真零時
刻得到執行的,其對應的賦值操作也都是在 0 時刻進行的。但由於它們是阻塞型
賦值語句,所以在執行 S1 語句是 S2 被阻塞而不能得到執行;只有在 S1 執行完,
a 被賦值 0 之後, S2 才能開始執行。而 S2 的執行將使 a 被重新賦值 1,所以上
面這個過程塊執行後變量 a 的值終取值爲 1.


關係運算符:

所有的關係運算符都有着相同的優先級別。關係運算符的優先級別低於
算數運算符的優先級別。


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章