FPGA初学者入门相关概念知识点
一、基礎入門
1、整體理解
簡單來說,FPGA 就是“可反復編程的邏輯器件”。
ASIC 和 FPGA 就如同印刷品和白紙
ARM 雖然有很多外設,DSP 雖然具備強大的信號運算能力,但是,ARM 能做的,DSP 能做的,FPGA 一定也都能做;而 FPGA 可以做的,ARM 不一定行,DSP 也不一定行。
FPGA 固然強大,它高高在上的成本、功耗和開發復雜性還是會讓很多潛在的目標客戶望而卻步。
2、學習方向
“熟練”:不僅要初步了解 FPGA 是什么、能做什么等基本的理論;更重要的是要學會 HDL語言( Verilog 或 VHDL), 能夠使用 EDA 工具完成 FPGA 的代碼設計、 仿真驗證、 時序設計(這一步相對較難一些,往往需要結合實際應用,所以往往也可以屬于下一階段)、綜合和映射,能夠在開發板上下載并跑例程,這可以說是完成了入門階段。
“精通”:如何用合適的 HDL 語法風格設計出最優化的電路;對 EDA 工具的使用,也不是僅僅會了就好,而應該讓 EDA 工具的不同設置功能服務于具體的設計優化;同時也應該掌握不同的板級調試手段;
“專業”:參與一個新項目,開發一款新產品。
二、邏輯設計
1、簡單晶體管實現基本邏輯門電路
2、在實際工程實踐中
FPGA 必須是可編程的(Programmable),意味著我們至少必須要設計一個 2 輸入、1輸出的可編程的電路才能夠名副其實。
前面的晶體管結構的邏輯門電路中,需要 6 個晶體管實現與門和非門電路。但是用 LUT
來實現,同樣只是 4 個簡單的地址和數據結構就能實現。
以 Xilinx Artix7 系列 FPGA 器件為例,它使用的是 6 輸入 LUT 結構。這 6 個獨立的輸入(稱為 A1~A6)可以配置為單輸出(O6)模式和雙輸出(O5 和 O6)模式。如圖 2.29 所示,6 輸入 1 輸出的 LUT 內部對應著 1 個 64 個地址的存儲單元。
如圖 2.30 所示,5 輸入 2 輸出的 LUT 內部對應著 2 個 32 個地址的存儲單元,輸出 O5
和 O6 都有其對應的獨立的 32 個地址單元。它的應用場景是一組最多 5 輸入同時對應 2 個輸出的情況。
3、可配置邏輯塊
一顆 FPGA 內部通常都會有豐富的可配置邏輯塊(Configurable Logic Block,簡稱 CLB),根據不同的器件規模,CLB 的數量從數千到數十萬不等。如圖 2.31 所示,呈矩陣排布的 CLB 就構成了最基本的 FPGA 邏輯資源的架構。
從微觀角度看,如圖 2.32 所示,CLB 內部主要由 2 個更小的單位 Slice 所組成,每個 Slice都有獨立的高速進位鏈以及獨立的布線通道連接到矩陣開關,通過矩陣開關可以實現 Slice與 FPGA 大布線池之間的靈活編程
所有的 slice 的這些功能塊都可以用于支持邏輯、運算或 ROM 功能,此時我們稱之為
SLICEL;而某些 slice 則可以支持最大 256 位數據存儲的分布式 RAM 或最大 32 個 8 位寬的移位寄存器,此時我們稱之為 SLICEM。這種邏輯功能和存儲器功能之間的轉變其實很好理解,由于 slice 內部的 4 個 LUT 本身就是一種存儲器實現的結構,所以它也就理所當然的可以被輕易的設計成 ROM、RAM 或移位寄存器功能了。
線(Wires):用于連接各個不同的模塊單元,FPGA 內部通常有非常豐富的預連線資源,這些連線也都是根據實際應用設計“可編程”的;
輸入/輸出端口(Input/Output pads):FPGA 器件與外部芯片互聯的引腳。
4、Xilinx 的 Vivado 軟件上的編譯步驟
首先編寫“HDL代碼”來描述自己需要實現的電路功能;
然后在 EDA 工具中對其進行“RTL 綜合”和“綜合”,
“RTL 綜合”將 HDL 代碼轉換為邏輯電路,就如前面提到過的與、或、非等一大堆門電路的各種組合;
“綜合”這一步將經過“RTL 綜合”后的門電路映射為 FPGA 器件的物理結構;
“實現”這一步將對 FPGA 器件進行最終的布局布線;
最后這些結果將會被轉換為可以最終運行在 FPGA 器件上的二級制燒錄文件。
三、Verilog語法
1、基礎
1、模塊聲明類語法:module…endmodule
2、端口聲明:input, output, inout(inout 的用法比較特殊,需要注意)
3、參數定義:parameter
4、信號類型:wire,reg 等
如圖 3.1 所示,在這個簡單的電路中,分別定義兩個寄存器(reg)鎖存當前的輸入 din。
每個時鐘 clk 上升沿到來時,reg 都會鎖存到最新的輸入數據,而 wire 就是這兩個 reg 之間直接的連線。作為 input 或 inout 的信號端口只能是 wire 型,而 output 則可以是 wire 也可以是 reg。
需要特別說明的是,雖然在代碼中我們可以定義信號為 wire 或 reg 類型,但是實際的電路實現是否和我們預先的一致還要看綜合工具的表現。例如 reg 定義的信號通常會被綜合為一個寄存器(register),但這有一個前提,就是這個 reg 信號必須是在某個由特定信號邊沿敏感觸發的 always 語句中被賦值。
5、多語句定義:begin…end
6、比較判斷:if…else, case…default…endcase
7、循環語句:for
8、任務定義:task…endtask
Task 更像是 C 語言中的子函數,task 中可以有 input、output 和 inout 端口作為出入
口參數,它可以用于實現一個時序控制。task 沒有返回值,因此不可以用在表達式中。
9、連續賦值:assign,問號表達式(?:)
10、always 模塊:(敏感表可以為電平、沿信號 posedge/negedge;通常和@連用)。
11、運算操作符:各種邏輯操作符、移位操作符、算術操作符大多是可綜合的。
12、賦值符號:= 和<=
13、Verilog 關鍵詞
always endmodule medium reg tranif0 and end primitive module release
tranif1 assign endspecify nand repeat tri attribute endtable negedge rnmos tri0
begin endtask nmos rpmos tri1 buf event nor rtran triand bufif0 for not
rtranif0 trior bufif1 force notif0 rtranif1 trireg case forever notif1 scalared
unsigned casex fork or signed vectored casez function output small wait
cmos highz0 parameter specify wand deassign highz1 pmos specparam weak0
default if posedge strength weak1 defparam ifnone primitive strong0 while
disable initial pull0 strong1 wire edge inout pull1 supply0 wor else input
pulldown supply1 xnor end integer pullup table xor endattribute join remos
task endcase large real time endfunction macromodule realtime tran
VHDL 關鍵詞
abs downto library postponed subtype access else linkage procedure then
after elsif literal process to alias end loop pure transport all entity map range
type and exit mod record unaffected architecture file nand register units
array for new reject until assert function next rem use attribute generate
nor report variable begin generic not return wait block group null rol when
body guarded of ror while buffer if on select with bus impure open
severity xnor case in or shared xor component inertial others signal
configuration inout out sla constant is package sra disconnect label port srl
對于低電平有效的信號或端口,通常加后綴“_n”表示。
2、例:寄存器電路的Verilog設計方式
① 簡單的寄存器輸入輸出的模型如圖 3.2 所示。每個時鐘信號 clk 的有效沿(通常是上
升沿),輸入端數據 din 將被鎖存到輸出端 dout。
② 帶異步復位的寄存器輸入輸出的模型如圖 3.3 所示。每個時鐘信號 clk 的有效沿(通常是上升沿),輸入端數據 din 將被鎖存到輸出端 dout;而異步復位信號 clr 的下降沿(低電平有效復位)將強制給輸出數據 dout 賦值為 0(不論此時的輸入數據 din 取值),此輸出狀態將一直保持到 clr 拉高后的下一個 clk 有效觸發沿。
③ 帶異步置位的寄存器輸入輸出的模型如圖 3.4 所示。每個時鐘信號 clk 的有效沿(通常是上升沿),輸入端數據 din 將被鎖存到輸出端 dout;而異步置位信號 set 的上升沿(高電平有效置位)將強制給輸出數據 dout 賦值為 1(不論此時的輸入數據 din 取值),此輸出狀態將一直保持到 set 拉低后的下一個 clk 有效觸發沿。
④ 既帶異步復位,又帶異步置位的寄存器則如圖 3.5 所示。既帶異步復位,又帶異步置位的寄存器其實是個很矛盾的模型,我們可以簡單的分析一下,如果 set 和 clr 都處于無效狀態(set=0,clr=1),那么寄存器正常工作;如果 set 有效(set=1)且 clr 無效(clr=1),那么 dout=1 沒有異議;同理,如果 set 無效(set=0)且 clr 有效(clr=0),那么 dout=0 也沒有異議;但是如果 set 和 clr 同時有效(set=1,clr=0),輸出 dout 咋辦?到底是 1 還是 0?
其實這個問題也不難,設置一個優先級不就好了。當然了,圖 3.5 的理想寄存器模型通常只是作為電路的一部分來實現。如果我們期望這種既帶異步復位,又帶異步置位的寄存器在復位和置位同時出現時,異步復位的優先級高一些,那么代碼書寫方式可以如下:
⑤ 如圖 3.7 所示,這是一種很常見的帶同步使能功能的寄存器。每個時鐘 clk 的有效沿(通常是上升沿),判斷使能信號 ena 是否有效(我們取高電平為有效),在 ena 信號有效的情況下 din 的值才會輸出到 dout 信號上。
3、時序邏輯電路
在一個時序邏輯中,時鐘信號掌控著所有輸入和輸出信號的進出。在每個時鐘有效沿(通常是上升沿),寄存器的輸入數據將會被采樣并傳送到輸出端,此后輸出信號可能會在經歷長途跋涉般的“旅途”中經過各種組合邏輯電路并會隨著信號的傳播延時而處于各種“搖擺晃蕩”之中,直到所有相關的信號都到達下一級寄存器的輸入端。這個輸入端的信號將會一直保持直到下一個時鐘有效沿的來臨。每一級寄存器都在不斷的重復著這樣的數據流采集和傳輸。
4、提升系統性能的代碼風格
① 減少關鍵路徑的邏輯等級
②邏輯復制(減少重載信號的散出)與資源共享
③ 消除組合邏輯的毛刺
總結
以上是生活随笔為你收集整理的FPGA初学者入门相关概念知识点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win11显示字体大小怎么设置(win1
- 下一篇: 幽默聊天句子 逗人笑的幽默聊天对话154