FPGA设计细节和实现(初学者)
隨著FPGA的制造工藝進步和計算需求的發展,一些資源豐富、性能強大的FPGA被用在越來越多的嵌入式處理領域。相對于GPU,FPGA的處理速度在相同的情況下,其功耗更低,體積更小,計算密度更大,價格更加能被普通的商業、工業場合應用。在機器人和工業檢測等需要高速并行的視覺處理系統鄰域,FPGA具有廣泛的應用前景。
FPGA(現場可編程門陣列)是一種集成電路,由于其具有重配置性能,開發人員可以自行進行設計制造,按照功能需求,將硬件電路進行搭建,因此現場可編程。FPGA常使用VHDL或者Verilog HDL硬件描述語言進行電路設計,也可以用電路圖設計。FPGA是基于LUT結構,包含一組可編程邏輯塊,以及可重構互連的層次結構,就像可以在不同配置中互連的許多邏輯門一樣。邏輯塊可以被配置為執行復雜組合功能,或者是簡單的邏輯門,如AND門和XOR門[26]。在FPGA中,邏輯塊還包括存儲元件。大多數FPGA的配置容易丟失,需要在每次上電的時候,重新載入,而配置數據包含在對系統編程的配置文件中[27][28]。
可編程邏輯器件大致分為兩種,一種是輸出(“或”門)陣列被固定連接代替,每一個或門都有一個固定數量的與門與之連接,這就是可編程陣列邏輯(PAL),如圖4.1左側所示。這種結構都由EEPROM和Flash工藝制造,該技術使器件能被擦除,并進行簡單的再編程而改變邏輯功能。另一種是固定其“與”的部分并且使用“或”部分成為可編程,如圖4.1右側所示。這種結構有效的產生了可編程只讀存儲器(PROM)和查找表(LUT)。FPGA就是基于查找表結構。
完整的FPGA設計流程包括設計輸入,綜合,轉換,映射,布局布線,生成配置文件以及下載和調試等步驟[29]。FPGA的設計一直伴隨著仿真,包括行為和功能仿真,門級仿真,時序仿真,系統內部驗證等。如圖4.3給出的設計流程圖。
最常見的FPGA架構由一系列的用來實現應用程序的可配置邏輯塊(LAB),I/O焊盤和路由通道組成。 I/O焊盤可以適應于陣列 寬度。邏輯塊 由幾個 單元組成,典型 是4輸入LUT,如圖4.2所示。FPGA內部 多是同步電路,需要一個全局時鐘信號,驅動整個FPGA上的信號同步和操作的時序。一個復雜的設計包含多個時鐘,因此需要內部全局時鐘通過不同頻率和相位的變換,產生單獨的時鐘域。這借助于PLL和(或)DLL實現。
?
設計輸入包括使用硬件描述語言和原理圖輸入兩種形式。HDL語言適用于自頂向下的設計,支持模塊化編程,不隨芯片的工藝布局變化而變化,程序的復用性和可移植性較好。而原理圖輸入在EDA軟件上繪制特定功能的電路圖實現,在頂層設計、手工優化電路方面有節省資源、圖形界面強的特點。
功能仿真,對所設計電路進行邏輯功能的測試和模擬。不依賴器件的具體特性,是初步設計最好的驗證手段。主要有測試文件輸入和激勵波形文件輸入兩種,一般采用的是測試文件輸入(Test Bench)。測試文件是用硬件描述語言編寫測試程序,設定好輸入信號,并且從某個進程或文本文件中讀取所需的輸入數據,將數據傳入待測試的模塊,并且將最后的結果和預期的數據進行比較來確定設計的功能是否正確[30]。通過功能仿真,調整時序和信號的延遲,這對于整個設計的信號同步很有必要。
綜合,對指定的電路實現功能和產生實現電路的約束文件,其主要機制是將HDL語言的具體功能的設計輸入翻譯轉換為與、或、非門以及查找表,觸發器等基本邏輯單元組成的邏輯連接,然后進行速度、面積的優化,輸出網表文件,供布局布線使用[31]。
映射布局布線,將綜合階段產生的邏輯網表文件適配到FPGA的具體電路中。布局指的是將邏輯網表中的硬件原語或底層單元適配到FPGA固有硬件結構上,布線指的是根據布局的拓撲結構,將所需要的邏輯塊正確合理的連接,搭建具有特定功能的模塊電路。
時序仿真和內部系統驗證,稱為后仿真,是具體在FPGA中實現時候,包含電路與邏輯門的延遲,以及布局布線的延遲,這是與FPGA實際執行功能的情況下進行比較,如果后仿真有問題,就需要返回設計輸入,重新規劃,這一步也確定了內部系統是否合理,驗證設計正確性,確保FPGA設計穩定可靠。
配置和下載,將正確的FPGA設計,所生成的配置文件,一般是Bit文件轉換為MCS文件,在經過外圍電路,利用JTAG下載到FPGA的外圍配置電路上,使得FPGA上電后能進行配置。
在本課題的設計中,遵循上述開發流程,對每一步都進行合理準確的設計和仿真。根據高速相機采集卡的驅動電路和配置文件,我們選擇VHDL語言進行輸入,在Xilinx的綜合設計平臺ISE14.7上進行設計,搭載Mentor Graphics的ModelSim SE 10.1c仿真工具對設計電路進行時序和設計仿真,數據對比,通過 更改,最后 到FPGA 上。
?
FPGA的選型,根據所設計功能所需的數據存儲容量,邏輯單元的數量,在應用場景的實際功耗,以及FPGA的I/O數量是否滿足要求進行選擇。著名的FPGA生產廠家是美國的Xilinx公司和Altera公司。在航空航天,自動駕駛,消費電子和能源產業中,均具有各類產品,能滿足不同性能需求。Xilinx生產的Spartan系列和Virtex系列應用較為廣泛,前者滿足低成本設計,后者針對于高性能設計。本課題選擇的是Spartan3系列的xc3s5000-4fg900芯片,采用的900球FBGA封裝技術,90nm制造工藝,系統門級數量有5M,可用的邏輯單元66560個,4輸入查找表66560,可配置邏輯塊8320個,分布式RAM有520K,塊RAM有1872K,專用乘法器104個,數字時鐘管理器4個,最大可用引腳784個[32]。考慮到處理的圖像是512×512大小,需要緩存的數據有5行,以及并行控制信號,在處理過程中所消耗的存儲器容量和乘法器資源,而Spartan3片上RAM-18K有104個,所提供的乘法器為18位雙輸入二進制乘法器,緩存容量足夠,提供算術操作的邏輯單元豐富,完全滿足圖像處理過程中的計算資源要求,因此采用本款芯片。
FPGA的設計中,時鐘系統的設計極其重要,通常時鐘信號會使用BUFG網絡減少傳輸延遲,提高系統性能并增強系統的穩定性。
?
?
在實際使用中,經常會遇到需要將某個BUFG上的時鐘信號通過FPGA的普通IO輸出。如果直接從BUFG上連接到OBUF上,在編譯器map的過程中就會出現錯誤,并提示規避錯誤的方法,就是在約束文件中加上一條約束,讓編譯器忽略時序約束的要求,直接通過普通邏輯資源連接。雖然這個約束能規避這個錯誤,但中間的時序將無法評估,因此可能會導致錯誤的發生。? ? ? ? ? ? ?
Xilinx Spartan6對于這種應用給出的解決方案是通過ODDR2來連接,每個IO都有ODDR2資源,這些資源可以連接到BUFG網絡上。
?
????使用舉例:
ODDR2#(
??????.DDR_ALIGNMENT("NONE"),// Sets output alignment to "NONE", "C0" or "C1"
??????.INIT(1'b0),????// Sets initial state of the Q outputto 1'b0 or 1'b1
??????.SRTYPE("SYNC")// Specifies "SYNC" or "ASYNC" set/reset
????) ODDR2_inst (
??????.Q(需要輸出的時鐘信號連線),???// 1-bit DDR output data
??????.C0(BUFG上的時鐘信號),???// 1-bit clock input
??????.C1(BUFG上的時鐘信號的180度反相信號),???// 1-bit clock input
??????.CE(1'b1), // 1-bit clock enable input
??????.D0(1'b1), // 1-bit data input (associatedwith C0)
??????.D1(1'b0), // 1-bit data input (associatedwith C1)
??????.R(1'b0),???// 1-bit reset input
??????.S(1'b0)????// 1-bit set input
????);
計算器原理圖:
?
?
波特率設置:
?
串口設置:
?
問題所在:
?
?
?
系統設計:
?
?
為了更好的觀察時鐘沿與地址、數據變化的過程,全編譯后進行時序仿真。讀數據時,可以看出第一個箭頭時鐘上升沿采到地址0;第二個時鐘上升沿開始賦值,但是由于邏輯延遲(紅框)后才開始賦值;因此第三個時鐘上升沿的數據才是穩定的。
?
FIFO這一章:
?
?
總結
以上是生活随笔為你收集整理的FPGA设计细节和实现(初学者)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 试管婴儿有爸爸什么事吗
- 下一篇: 怎么搜一幅画是谁画的呢?