天天看點

數字邏輯實踐4->面向硬體電路的設計思維--FPGA設計總述

本文主要介紹不同于之前軟體設計思維的硬體設計思維,從非阻塞指派、并行、面積速度轉換、同步電路設計原則、子產品劃分設計、if-case對比等方面進行整理。内容對于初入門者有一點多,有很多細節都不好了解。是以這篇文章就當作一個Verilog學習與FPGA設計的總述性文章,後續繼續學習我會加深對這些知識的了解。

本文是對實驗課上講解的“面向硬體電路的設計思維”的總結,結合數字邏輯課本,進行提煉和整理。

主要來源是課件與本人整理,部分參考了網絡大佬的部落格。

本文主要介紹不同于之前軟體設計思維的硬體設計思維,從非阻塞指派、并行、面積速度轉換、同步電路設計原則、子產品劃分設計、if-case對比等方面進行整理。

内容太多,我整理了好幾天,在浩如煙海的網絡前有點無力,想想是自己的實踐不夠,有一些問題沒有親身體驗;也不能一蹴而就,得久久為功。是以這篇文章就當作一個Verilog學習與FPGA設計的總述性文章,後續繼續學習我會加深對這些知識的了解。

回憶一下課本上的相關内容。

阻塞指派:

"="

Verilog編譯器按照這些語句在always塊中的先後順序依次執行。

如果一個變量通過阻塞指派語句指派,則這個新賦的值會在這個block中的後續語句中使用。

相當于串行

非阻塞指派:

"<="

always塊中所有非阻塞指派的語句在求值時所用的值是最初進入always時各個變量已經具有的值。

換一個角度講,"<="左側的被指派變量,隻在always結束時統一被更新。

相當于并行

先來看一看這段代碼:

可以看到關鍵點是g的表達式,由于是阻塞指派,是以相當于:

綜合出的電路如圖:

這個差別之處就在于這個g,是x3與前一個 f 進行"|"運算。

将阻塞指派的示例代碼中的兩個執行語句互換位置,會發生什麼情況?

可以料見影響比較大。

可見阻塞指派描述時序電路有風險。

相反的,如果我們要實作 f = a1a0 + a2a1這樣一個函數;

可見這段代碼有兩個特征;

非阻塞指派的結果在always結束後才可以看到

多次指派時,後覆寫前。

這兩個特征使得第二個f語句出現問題,因為第二個語句

右側的f的值是不可見的。

對組合邏輯模組化采用阻塞指派

對時序邏輯模組化采用非阻塞指派

用多個always塊分别對組合和時序邏輯模組化

盡量不要在一個always塊裡面混合使用阻塞指派和非阻塞指派。如果在同一個塊即為組合邏輯又為時序邏輯,應使用“非阻塞指派”

這裡給的例子沒怎麼看懂。自己查了一下。

先說結論:

各個always塊是并行執行的,

always塊和initial塊之間是并行執行的,

begin-end塊内是順序執行的,

但是非阻塞指派(<=)是并行執行的,阻塞指派(=)是順序執行的,這條優先。且硬體思想的集中展現就是前面提到過的非阻塞指派帶來的并行執行語句。

再回去看例子:

可以料見實作的電路:

下面借鑒了這篇文章

數字邏輯實踐4->面向硬體電路的設計思維--FPGA設計總述

波形圖:

數字邏輯實踐4->面向硬體電路的設計思維--FPGA設計總述

可以看到強調的還是上面說過的非阻塞指派的特點。

實驗任務裡總有這麼一句:“用可綜合的代碼......”

什麼是可綜合性,什麼又是不可綜合性呢?

下面學習了這篇文章

這篇文章講的挺多,但是我現在這個RTL級還沒搞明白的菜鳥用不到這麼多,基本篩選如下:

不可綜合的Verilog語句:

initial

隻能在test bench中使用,不能綜合。

assign 和deassign

不支援對reg 資料類型的assign或deassign進行綜合,支援對wire資料類型的assign或deassign進行綜合。

fork join 不可綜合,可以使用非塊語句達到同樣的效果。

這個塊是并行執行的,但是不可綜合。

敏感清單裡同時帶有posedge和negedge 如:(現在也碰不到

這裡我們說的面積:設計所占用的FPGA邏輯資源數目,一般用所消耗的觸發器和查找表(還沒學)來衡量。

速度:是指在晶片上可以穩定運作時能達到的最高頻率

兩者性能上的調配方法:

子產品複用

串并變換

可以看到這種串并轉換,用更大的面積(即多個子子產品并行),達到高頻率的效果。這一點後面還會再提到。

流水線

後續學習入口

同步設計的優點:

可以有效避免毛刺的影響,提高設計的可靠性

可以簡化時序分析過程

可以減少工作環境對設計的影響

設計原則:

(由于應用還不多,對這些體會還不深刻,簡單記錄:

單時鐘

全局時鐘網絡的時鐘是性能最優,最便于預測的時鐘,具有最強的驅動能力

單時鐘沿

混合時鐘會使時序分析複雜、電路工作頻率降低

避免使用門控時鐘

即時鐘不要與組合邏輯再進行組合,如下:

可能引起毛刺、偏移

在子產品内部不要再産生時鐘了。

這有點像C++的封裝。

上一層子產品隻負責下一層子產品的依據(即原材料),而具體行為互不相關。

這樣就保證了各個子產品的相對獨立性和内部結構的合理性,便于維護,也使得相同邏輯可以複用同一子產品。

在設計時,應盡量将子產品中的同步時序邏輯輸出信号以寄存器的形式送出,以便于綜合工具區分時序群組合邏輯;

并且時序輸出的寄存器應符合流水線設計思路,能工作在更高的頻率,以極大地提高子產品吞吐量。

流水線設計思路是什麼? 就是将組合邏輯系統地分割,并在各個部分(分級)之間插入寄存器,并暫存中間資料的方法。 目的是将一個大操作分解成若幹的小操作,每一步小操作的時間較小,是以能提高頻率,各小操作能并行執行,是以能提高資料吞吐率(提高處理速度)。

對于我這個初學者來說,邏輯複用和邏輯複制十分相似,了解後就知道确實不同,主要是涉及性能衡量尺度:速度和面積的統籌。

邏輯複用是通過提高工作頻率來節省面積的優化方法,經常用于存在多個資源可共享單元的設計中。

PS:相當于為了節省人力,而讓一個人幹三個人的活。

10MHZ乘法器

兩個5MHZ乘法器

邏輯複制——面積換速度

邏輯複用是通過增加面積而改善設計時序的優化方法,經常用于調整信号的扇出。

舉例就類似于上面的面積換速度

鍊狀結構

樹狀結構

If語句指定了一個有優先級的編碼邏輯,

而case語句生成的邏輯是并行的,不具有優先級。

這裡的if的優先級就引起一些其他問題:

而case是并行的,沒有優先級。

if語句可以包含一系列的表達式;/有時甚至一個else就可以是一個二路選擇器。

而case語句比較的是一個公共的控制表達式。整個語句塊一起構成了一個多路選擇器。

這個很好了解。

通常if-else結構速度較慢,但占用的面積小;

case語句結構速度較快,但占用的面積較大。

嵌套的if語句如果使用不當,就會導緻設計的更長延時。

如果想利用if語句來實作那些對延時要求苛刻的路徑,應将最高優先級給最遲到達的關鍵信号。(最小生成樹思想)。

有時為了兼顧面積和速度,可以将if和case語句合用。

想象一下是什麼電路?

就是一個四選一,需要兩位的控制信号,這個控制信号就正好是s。

實作電路也是類似上面的電路。

鎖存器在課本裡學過,是用于存儲一位資料的元件,電平觸發。

其特點是:鎖存器在不鎖存資料時,輸出随輸入變化;但一旦資料鎖存時,輸入對輸出不産生任何影響。

而我們在設計電路時,應該避免無意之間産生這種鎖存器,否則會導緻一些邏輯上的錯誤。

引起意外鎖存器的原因

翻閱了很多網上的總結。有一些規則比較複雜,考慮到我現在的水準,我隻記錄對初入門水準夠用且好了解的方面。後續繼續學習可以深入了解更多。

if……else……結構中缺少else

case結構中的分支沒有包含所有情況且沒有default語句。

如果使用if語句,最好寫上else分支;

如果使用case語句,最好寫上default語句。

即使需要鎖存器,也通過else分支或default分支來顯式說明。而不要利用語言特性觸發生成(因為不可控)

内容真的好多,一時間難以完全消化...

上傳于2021年11月25日23時