為什麼使用PLD器件?
衆所周知,徒手連接配接74門來實作數字系統是一件枯燥的事情,即使在現代的EDA工具上使用Block Diagram連接配接各種單元子產品也會費時費力。如果是一個小小的數字鐘那還很好辦,随着電路複雜度的增加,實作也變得更加困難。是以70-80年代人們創造了各種PLD器件,使用EDA工具在計算機上進行RTL級描述或進行Schematic Design,最後通過編譯綜合生成Bit流下載下傳到PLD器件中。現代的PLD器件發展到什麼程度呢,在2019年,Intel和Xilinx各自推出了号稱“世界上最大的FPGA器件”:2019年8月Xilinx推出Virtex UltraScale+ VU19P FPGA 16nm工藝,內建約350億個半導體,約900萬個邏輯單元。2019年11月Intel推出Stratix 10 GX 10M FPGA,14nm工藝,內建約433億個半導體,約1020萬邏輯單元。如此龐大的器件,這上面的數字邏輯如果以傳統的74門的方式實作,工作量以及實物的體積和功耗會達到不可思議的程度。使用這樣的器件進行開發時,就必須借助EDA工具來完成了。(FPGA器件擁有1000萬邏輯單元是什麼概念?入門使用的Altera EP4CE6或者Xilinx XC6SLX9器件的資源連1萬邏輯單元都達不到,最大的FPGA邏輯資源數量至少是入門款的1000倍)
VCU118 Evaluation Kit:

VIRTEX FPGA:
(圖檔來自xilinx.com)
常見的PLD器件:
PLD器件分類衆多,我們按它的配置方式分類,一種是易失性的基于SRAM工藝的器件FPGA,需要外部的配置晶片,還有一種基于FLASH或EPROM工藝的CPLD器件,無需外部配置晶片。這兩種器件各有各的優勢,常見的搭配案例有:使用CPLD和Flash存儲器實作FPGA的配置,合理地利用了CPLD器件的非易失性。相對于FPGA,CPLD器件也有它的缺點,比如資源不會很多,速度也不會很快,最大的邏輯器件是FPGA而不是CPLD,這些是由器件的結構決定的。兩者各有優缺點,而不是哪種“更好”。
數字系統的設計流程:
一個ASIC數字系統的設計過程:Idea->行為級描述->RTL描述->門級網表->實體版圖,如果我們的設計最終是下載下傳到CPLD或FPGA中:Idea->行為級描述->RTL描述->綜合->布局布線->配置固化(下載下傳到器件)上述流程中的行為級描述未必是HDL代碼,也可以是原理圖(Block Diagram/Schematic)或者IP核。
這個設計流程是給複雜的數字系統設計做參考的。在在做一些小的工程時,比如一個流水燈或者數字鐘,就不必那麼複雜。
關于HLS:
行為級描述通常使用計算機進階語言,用這些語言描述一些思路和算法,很多EDA軟體的開發者提供了可将這些進階語言程式的行為級描述代碼直接轉化成HDL代碼的高層次綜合工具(HLS)。關于HLS的使用也存在很多争議,有興趣的可以移步這個号稱人均年薪百萬的知乎平台看看。https://www.zhihu.com/question/320190011/answer/679538501
怎樣了解HDL?
很多人在最初接觸HDL時常嘗試以“程式”的思維來了解HDL,甚至因為Verilog和C語言有些地方比較相似,将二者比較進而了解。這是越學越難,給自己找坑的一種路線。反之,嘗試以電路框圖(Block Diagram/Schematic)的方式了解Verilog才是開啟學習Verilog的正确路線,再多抽象的講解也不如看看RTL圖來得實在。我們不應把每條語句單純了解為計算機程式中的“執行”,了解為生成電路更合适。
當初學者看到一行行的代碼時一定會愈發頭痛,因為這比框圖更加抽象難以了解。然而當他們漸漸掌握這種“抽象的”設計方式後,一定會覺得十分快速高效。
用Verilog寫一個最簡單的資料選擇器:
為什麼學習FPGA要從這些基本的數字子產品開始?這有助于抽象的HDL和數字電子技術的結合。雖然它們實作了一些FPGA邏輯單元裡存在的一些東西,看起來很荒唐,但是這一舉動存在學習的意義。這個二選一資料選擇器有兩個資料輸入端口,一個選擇輸入端口,和一個資料輸出端,很好了解。
論“茴”的四種寫法:
衆所周知,“茴”有四種寫法,這個資料選擇器也有很多種寫法。
無論哪種寫法,最後生成的電路功能是相同的,甚至很多時候電路也是完全相同的,滿足設計的需求,在功能電路方面即可認為是沒有差別。但是在程式的維護,可讀性方面就會有所不同。這個就要看個人的選擇。初學者可以嘗試用不同的寫法來了解程式,也是加深HDL文法印象的一種方法。
跑FPGA工程綜合時太慢怎麼辦?
如果是單片機的程式可能很快就編譯成功了,而FPGA工程的綜合與仿真總是十分漫長,随着工程量的增加,器件資源的增加,動辄幾十分鐘甚至幾個小時,幾十個小時。我們如果有幾片不同的FPGA,可以把一些想法在小一點的FPGA上驗證後再移植到大的FPGA上來,這能縮短很多時間。另一方面,在等綜合的空餘做一些其他的事情,比如畫畫PCB,看看文檔手冊,這樣“消磨”一下時光免得浪費。