前言
最近群內同學問到:啥是阻塞,啥是非阻塞。實際電路中有這玩意兒嗎?
個人覺得阻塞非阻塞是**電路下的描述,實際電路中是沒有這個描述的。
實際的電路中只有組合邏輯和時序邏輯,不可能存在誰阻塞了誰。只是**中需要特別注意。
按照書上的描述:阻塞相當於軟體中的順序執行,非阻塞相當於併發執行。
模擬為阻塞就是乙個人幹活,如果一條語句為乙個活,那麼先乾前面的活再幹後面的活。非阻塞就是多個人一起幹活,每一條語句都是乙個人在幹活,則為併發。
流程以下對幾種情況進行了相應的測試。
(1)時序邏輯使用非阻塞。(業界正確用法)
推斷結果:
綜合結果:
對於上述邏輯,相當於多打了一拍。
(2)時序邏輯使用阻塞。
推斷結果:
綜合結果:
可以看到,中間邏輯被打平,優化掉了。
(3)組合邏輯使用非阻塞。
推斷結果:
綜合結果:
可以看到,推斷的結果可能跟實際上是不一致的,**中置了初始值,當然對實際組合電路沒啥卵用,只是**中指定固定態而已,只供參考,實際以綜合後結果為準。可以看到就是個或門的lut。
(4)組合邏輯使用阻塞。(業界正確用法)
推斷結果:
綜合結果:
可以看到,推斷的結果可能跟實際上是不一致的,只供參考,實際以綜合後結果為準。可以看到就是個或門的lut。
結論所以,根據實際測試結果來看,時序邏輯使用阻塞,會導致中間態被優化。組合邏輯用啥都無所謂。本句話僅表示實際電路,不代表**如此。
vivado的推斷闊能是不正確的,以綜合結果為準。
寫**遵循業界規則,否則可能給自己埋坑。
寫**只需記住:時序邏輯就是資料流。組合邏輯就是物理連線。世界豁然開朗。
寫綜合**只需遵循:
(1)組合邏輯用阻塞幅值。
(2)時序邏輯用非阻塞幅值。
(3)不要在乙個塊語句中混用阻塞非阻塞。
以上。
通過RTL電路深入理解阻塞賦值和非阻塞賦值的區別
稍微接觸過verilog hdl的都對阻塞與非阻塞賦值略知一二,也是我們經常強調的重點之一,在課堂上還是有學員問什麼不一樣呢,為什麼我用阻塞賦值也能得出正確的結果呢?在編寫可綜合 的時候,建議大家不要忘了開啟rtl網表檢視器看看我們自己綜合出來的電路是不是自己想要的邏輯。我就阻塞與非阻塞賦值這個問題...
恆幅值變換和恆功率變換的matlab驗證
在matlab中驗證clark和park變換後的曲線以及幅值。關於變換的原理請參考 當恆幅值變換時 程式中 conamp 1,恆幅值輸出,iq的幅值和ia幅值相等。程式中 conamp 0,恆功率輸出,iq的幅值和ia幅值相等。電機abc模型推導dq模型過程中的公式驗證 恆功率模型,恆幅值模型只需要...
關於浮點數實際值和預設值
1.1程式如下 1.2.結果如下 預期 1.2f與1.2是相等的,顯示後面的小數應該全是0。實際 1.2f實際是1.2000000476837158 並不是精確的1.2,而1.2f也與1.2不相等。原因 1 float的有效數字只有8個,也就是1.2f輸出20個位時只能保證前8位 1.2000000...