導航:首頁 > 源碼編譯 > fpga演算法教程

fpga演算法教程

發布時間:2023-08-25 03:15:49

① 如何用fpga實現演算法的硬體加速

首先,利用傳統的軟體技巧來優化演算法,然後將其轉向定製指令以加速演算法。我們將討論不同實現方法的性能比較和折衷。
CRC演算法可用來校驗數據在傳輸過程中是否被破壞。這些演算法很流行,因為它們具有很高的檢錯率,而且不會對數據吞吐量造成太大影響,因為CRC校驗位被添加進數據信息中。但是,CRC演算法比一些簡單的校驗和演算法有更大的計算量要求。盡管如此,檢錯率的提高使得這種演算法值得去實施。
一般說來,發送端對要被發送的消息執行CRC演算法,並將CRC結果添加進該消息中。消息的接收端對包括CRC結果在內的消息執行同樣的CRC操作。如果接收端的結果與發送端的不同,這說明數據被破壞了。
CRC演算法是一種密集的數學運算,涉及到二元模數除法(molo-2 division),即數據消息被16或32位多項式(取決於所用CRC標准)除所得的余數。這種操作一般通過異或和移位的迭代過程來實現,當採用16位多項式時,這相當於每數據位元組要執行數百條指令。如果發送數百個位元組,計算量就會高達數萬條指令。因此,任何優化都會大幅提高吞吐量。
代碼列表1中的CRC函數有兩個自變數(消息指針和消息中的位元組數),它可返回所計算的CRC值(余數)。盡管該函數的自變數是一些位元組,但計算要逐位來執行。該演算法並不高效,因為所有操作(與、移位、異或和循環控制)都必須逐位地執行。
列表1:逐位執行的CRC演算法C代碼。
/*
* The width of the CRC calculation and result.
* Modify the typedef for a 16 or 32-bit CRC standard.
*/
typedef unsigned char crc;
#define WIDTH (8 * sizeof(crc))
#define TOPBIT (1 << (WIDTH - 1))
crc crcSlow(unsigned char const message[], int nBytes)
{
crc remainder = 0;
/*
* Perform molo-2 division, a byte at a time.
*/
for (int byte = 0; byte < nBytes; ++byte)
{
/*
* Bring the next byte into the remainder.
*/
remainder ^= (message[byte] << (WIDTH - 8));
/*
* Perform molo-2 division, a bit at a time.
*/
for (unsigned char bit = 8; bit > 0; "bit)
{
/*
* Try to divide the current data bit.
*/
if (remainder & TOPBIT)
{
remainder = (remainder << 1) ^ POLYNOMIAL;
}
else
{
remainder = (remainder << 1);
}
}
}
/*
* The final remainder is the CRC result.
*/
return (remainder);
}
1.傳統的軟體優化
圖3:帶CRC外圍電路和DMA的系統模塊示意圖。
讓我們看一下如何利用傳統的軟體技巧來優化CRC演算法。因為CRC操作中的一個操作數,即多項式(除數)是常數,位元組寬CRC操作的所有可能結果都可以預先計算並存儲在一個查找表中。這樣,通過一個讀查找表動作就可讓操作按逐個位元組執行下去。
採用這一演算法時,需要將這些預先計算好的值存儲在存儲器中。選擇ROM或RAM都可以,只要在啟動CRC計算之前將存儲器初始化就行。查找表有256個位元組,表中每個位元組位置包含一個CRC結果,共有256種可能的8位消息(與多項式大小無關)。
列表2示出了採用查找表方法的C代碼,包括生成查找表crcInit()中數值的代碼。
列表2:採用查找表方法的CRC演算法C代碼。
crc crcTable[256];
void crcInit(void)
{
crc remainder;
/*
* Compute the remainder of each possible dividend.
*/
for (int dividend = 0; dividend < 256; ++dividend)
{
/*
* Start with the dividend followed by zeros.
*/
remainder = dividend << (WIDTH - 8);
/*
* Perform molo-2 division, a bit at a time.
*/
for (unsigned char bit = 8; bit > 0; "bit)
{
/*
* Try to divide the current data bit.
*/
if (remainder & TOPBIT)
{
remainder = (remainder << 1) ^ POLYNOMIAL;
}
else
{
remainder = (remainder << 1);
}
}
/*
* Store the result into the table.
*/
crcTable[dividend] = remainder;
}
} /* crcInit() */
crc crcFast(unsigned char const message[], int nBytes)
{
unsigned char data;
crc remainder = 0;
/*
* Divide the message by the polynomial, a byte at a time.
*/
for (int byte = 0; byte < nBytes; ++byte)
{
data = message[byte] ^ (remainder >> (WIDTH - 8));
remainder = crcTable[data] ^ (remainder << 8);
}
/*
* The final remainder is the CRC.
*/
return (remainder);
} /* crcFast() */
整個計算減少為一個循環,每位元組(不是每位)有兩個異或、兩個移位操作和兩個裝載指令。基本上,這里是用查找表的存儲空間來換取速度。該方法比逐位計算的方法要快9.9倍,這一提高對某些應用已經足夠。如果需要更高的性能,可以嘗試編寫匯編代碼或增加查找表容量以擠出更多性能來。但是,如果需要20、50甚至500倍的性能提高,就要考慮採用硬體加速來實現該演算法了。
表1:各種規模的數據模塊下CRC演算法測試比較結果。
2.採用定製指令方法
CRC演算法由連續的異或和移位操作構成,用很少的邏輯即可在硬體中簡單實現。由於這一硬體模塊僅需幾個周期來計算CRC,採用定製指令來實現CRC計算要比採用外圍電路更好。此外,無須涉及系統中任何其它外圍電路或存儲器。僅需要一個微處理器來支持定製指令即可,一般是指可配置微處理器。
當在硬體中實現時,演算法應該每次執行16或32位計算,這取決於所採用的CRC標准。如果採用CRC-CCITT標准(16位多項式),最好每次執行16位計算。如果使用8位微處理器,效率可能不太高,因為裝載操作數值及返回CRC值需要額外的周期。圖2示出了用硬體實現16位CRC演算法的內核。
信號msg(15..0)每次被移入異或/移位硬體一位。列表3示出了在64KB數據模塊上計算CRC的一些C代碼例子。該實例是針對Nios嵌入式處理器。
列表3:採用定製指令的CRC計算C代碼。
unsigned short crcCompute(unsigned short *data_block, unsigned int nWords)
{
unsigned short* pointer;
unsigned short word;
/*
* initialize crc reg to 0xFFFF
*/
word = nm_crc (0xFFFF, 1); /* nm_crc() is the CRC custom instruction */
/*
* calculate CRC on block of data
* nm_crc() is the CRC custom instruction
*
*/
for (pointer = data_block; pointer < (data_block + nWords); pointer ++)
word = nm_crc(*pointer, 0) return (word);
}
int main(void)
{
#define data_block_begin (na_onchip_memory)
#define data_block_end (na_onchip_memory + 0xffff)
unsigned short crc_result;
unsigned int data_block_length = (unsigned short *)data_block_end - (unsigned short
*)data_block_begin + 1;
crc_result = crcCompute((unsigned short *)data_block_begin, data_block_length);
}
採用定製指令時,用於計算CRC值的代碼是一個函數調用,或宏。當針對Nios處理器實現定製指令時,系統構建工具會生成一個宏。在本例中為nm_crc(),可用它來調用定製指令。
在啟動CRC計算之前,定製指令內的CRC寄存器需要先初始化。裝載初始值是CRC標準的一部分,而且每種CRC標准都不一樣。接著,循環將為數據模塊中的每16位數據調用一次CRC定製指令。這種定製指令實現方式要比逐位實現的方法快27倍。
3.CRC外圍電路方法
如果將CRC演算法作為硬體外圍電路來實現,並利用DMA將數據從存儲器轉移到外圍電路,這樣還可以進一步提高速度。這種方法將省去處理器為每次計算而裝載數據所需要的額外周期。DMA可在此外圍電路完成前一次CRC計算的時鍾周期內提供新的數據。圖3示出了利用DMA、CRC外圍電路來實現加速的系統模塊示意圖。
在64KB數據模塊上,利用帶DMA的定製外圍電路可獲得比逐位計算的純軟體演算法快500倍的性能。要知道,隨著數據模塊規模的增加,使用DMA所獲得的性能也隨之提高。這是因為設置DMA僅需很少的開銷,設置之後DMA運行得特別快,因為每個周期它都可以傳遞數據。因此,若只有少數位元組的數據,用DMA並不劃算。
這里所討論的所有採用CRC-CCITT標准(16位多項式)的演算法都是在Altera Stratix FPGA的Nios處理器上實現的。表1示出了各種數據長度的測試比較結果,以及大致的硬體使用情況(FPGA中的存儲器或邏輯單元)。
可以看出,演算法所用的硬體越多,演算法速度越快。這是用硬體資源來換取速度。

② 在FPGA上快速實現MD5演算法的新方法論文

在FPGA上快速實現MD5演算法的新方法論文

摘 要 文章介紹了一種在FPGA上快速實現MD5演算法的新方法,給出了優化設計的原理、實現的具體方法及其重要模塊的設計實現方案。

關鍵詞 MD5;FPGA;Verilog語言;集成電路;關鍵路徑

1 引言

隨著電子商務和網路通信的發展,網路信息安全的重要性越來越顯著,信息加密、數字簽名、數據的完整性認證、身份驗證等成為信息安全領域的重要內容。MD5演算法本身是為數字簽名應用而設計的,隨後也應用在信息驗證技術當中。作為應用最廣泛的安全散列演算法,MD5演算法的高效實現就成為研究的需要,MD5演算法本身可以採用軟體實現,但其性能受到處理器件性能的制約不能滿足網路通信帶寬日益增長的要求,因而通過硬體實現高速MD5 運算就成為需要。

2 MD5演算法介紹

MD5 演算法可以對任何長度不超過 264二進制位的消息產生128 位的單向散列消息摘要輸出, RFC1321 標准中的MD5 演算法主要步驟如下:

在一些初始化處理後,MD5以512位分組來處理輸入文本,每一分組又劃分為16個32位子分組。演算法的輸出由四個32位分組組成,將它們級聯形成一個128位散列值。

(1)附加填充比特:填充消息使其長度恰好為一個比512位的倍數僅小64位的數。即對報文進行填充使報文的長度(比特數)與448模512同餘。填充方法是附一個1在消息後面接所要求的多個比特0。

(2)附加長度值:在其後附上64位的消息長度(填充前)。如果消息長度大於 264,僅使用該長度的低64比特。這樣,該域包含的長度值為初始長度模264 的值。

這兩步的作用是使消息長度恰好是512位的整數倍(演算法的其餘部分要求如此),同時確保不同的消息在填充後不相同。

(3)初始化寄存器:四個32位初始化變數為:

它們也被稱為鏈接變數(chaining variable)

(4)進行演算法的主循環:這一步是演算法的核心,它是一個包含四個大循環的64步函數,四個大循環結構相同,但每次使用的邏輯函數不同,每一個大循環由對512比特的16步操作組成,即每16步為一輪大循環。

每次操作如下(設 Ai+1、Bi+1 、Ci+1 、Di+1 為第 +1個時鍾周期時打入寄存器的值):

以一下是每輪中用到的四個非線性函數(每輪一個)。

常數ti可以如下選擇:在第i步中,ti是4294967296*abs(sin(i))的整數部分,i的單位是弧度。Wi是512位消息分組中的一個,Si是每次循環移位的次數。對每次而言也是固定的常數。

(5)結果輸出:所有64步完成之後,將第64步的輸出加到四個初始化變數上作為新的初始化變數,進行下一個512比特分組的運算,直到所有分組處理完畢,單次操作圖如下:

圖1. MD5演算法單步操作圖

3 演算法優化

由上圖可以看到,硬體實現時,MD5演算法每一步操作中的關鍵路徑在於B的求取(其他三個變數都是直接傳遞),這個關鍵路徑包括了四個模 232加法運算、三輸入變數的邏輯運算、"兩個查找表運算及一個循環左移運算,而在FPGA設計中,加法運算最為耗時,四個加法運算至少需要三個加法器級聯完成,加法運算嚴重製約了整個操作的速度,可見要加快演算法運行速度就必須在簡化這一關鍵路徑上下工夫,經過觀察我們發現,在

中 對每個周期都是已知的常數,是輸入的512比特的一個32位分組,這樣,在512比特輸入初始化完成後,也可看作固定常數,

Ai是第i時鍾周期里寄存器D 的值,而 Di的值又是第i-1周期里的Ci-1 ,即Ai 的`值是第i-1周期里Ci-1的值。

若在第i周期設中間寄存器變數 ,並令

那麼在第i+1周期,

就可以表示為

操作就可以用下面幾個式子代替:

其中, Ai+1沒有參與任何運算,因此上式可以接著化簡為

這樣一來,原來一個周期內需要完成三級加法和相應的組合邏輯,現在只需要完成兩級加法和部分組合邏輯就行了,大大提高了演算法速度,只要在運算開始時加-個周期的初始化即可,簡化後的系統框圖如下:

圖2. 改進後的單步操作圖

4 結果比較

由上文中的演算法分析部分不難看出,傳統的實現方式關鍵路徑是3級32比特加法器延遲和組合邏輯的延遲,而改進的實現方式減少了一級加法器的延遲,並把組合邏輯的延遲分散到不同路徑上,因此,採用改進的實現方式大約可以將速度提高到原來的1.5倍左右。同時,為了實現數據的初始化,需要提前一個周期計算出寄存器A的值,因此整個演算法的實現需要65個周期。我們採用 VerilogHDL 描述,選擇Altera Stratix II EP2S15F672C5 FBGA晶元,在QuartusII6.0上驗證通過。由於在FPGA中,連線延時也很關鍵,而這部分延時不能像加法延時那樣通過預先計算並存儲在寄存器中來消除一部分,所以實際的MD5改進演算法與傳統型相比較,速度的提高約為1.3,資源方面由於只是增加了一個時鍾節拍,寄存器數量和組合邏輯並沒有增加,所以改進型在資源方面和傳統型相當。下表為演算法改進前後在資源、頻率、流量上的比較。

表1. 改進前後資源比較

5 結束語

由表1可見,改進型MD5演算法實現,使用的資源並沒有明顯增加,但速度的改善十分明顯,基本實現了用較少的資源得到較高速率的目標,證明了結構的正確性和合理性。實驗結果也說明,這種利用寄存器來減少加法器級聯從而減少關鍵路徑的實現方法也可用於一般的FPGA硬體設計中。

參考文獻

[1] R.Rivest. The MD5 Message-Digest Algorithm,RFC1321 1992。

[2] Jarvinen K, Tommiska M,Skytta J.Hardware implementation analysis of the MD5 hash algorithm.System Sciences,2005.HICSS』05.Proceedings of the 38th Annual Hawaii International conference on 03-06 Jan.2005:298

[3] Bruce Schneier. 應用密碼學.北京:機械工業出版社,2000:188~194

[4] William Stallings. 密碼編碼學與網路安全:原理與實踐.北京:電子工業出版社,2001: 216~222。

[5] 夏宇聞.Verilog 數字系統設計教程.航空航天大學出版社,2005

;

③ 用verilog語言實現FPGA的循環碼編碼器設計

摘 要
隨著電子技術的發展,具有防盜報警等功能的電子密碼鎖代替密碼量少、安全性差的機械式密碼鎖已是必然趨勢。電子密碼鎖與普通機械鎖相比,具有許多獨特的優點:保密性好,防盜性強,可以不用鑰匙,記住密碼即可開鎖等。目前使用的電子密碼鎖大部分是基於單片機技術,以單片機為主要器件,其編碼器與解碼器的生成為軟體方式。在實際應用中,由於程序容易跑飛,系統的可靠性能較差。

本文主要闡述了一種基於現場可編程門陣列FPGA器件的電子密碼鎖的設計方法。用FPGA器件構造系統,所有演算法完全由硬體電路來實現,使得系統的工作可靠性大為提高。由於FPGA具有現場可編程功能,當設計需要更改時,只需更改FPGA中的控制和介面電路,利用EDA工具將更新後的設計下載到FPGA中即可,無需更改外部電路的設計,大大提高了設計的效率。因此,採用FPGA開發的數字系統,不僅具有很高的工作可靠性,而且升級也極其方便。

本文採用EDA技術,利用Quartus II工作平台和硬體描述語言,設計了一種電子密碼鎖,並通過一片FPGA晶元實現。

關鍵詞:電子密碼鎖;FPGA;硬體描述語言;EDA

目 錄
1 緒 論 1
1.1 國內外現狀及其發展 1
1.2 電子密碼鎖的原理 2
1.3 電子密碼鎖的系統簡介 4
1.4 系統設計要求 4
1.5 本課題的研究目的和意義 5
2 現場可編程門陣列FPGA 6
2.1 FPGA的基本結構 6
2.2 FPGA的優點 10
2.3 FPGA的設計流程 11
2.4 自頂向下設計法 17
2.5用模塊化設計FPGA 18
3 VHDL硬體描述語言 20
3.1 VHDL語言的基本結構 20
3.2 結構體的描述方式 21
3.3 自上而下(TOP DOWN)的設計方法 22
4 電子密碼鎖的設計與模擬 24
4.1 硬體設備 24
4.2 幾個主要功能模塊的設計 25
4.3 計算機模擬 32
結 束 語 38
參考文獻 39
附錄1英文原文 41
附錄2中文譯文 50
附錄3源程序 57

1.1 國內外現狀及其發展
隨著人們生活水平的提高和安全意識的加強,對安全的要求也就越來越高。鎖自古以來就是把守護門的鐵將軍,人們對它要求甚高,既要安全可靠的防盜,又要使用方便,這也是制鎖者長期以來研製的主題。隨著電子技術的發展,各類電子產品應運而生,電子密碼鎖就是其中之一。據有關資料介紹,電子密碼鎖的研究從20世紀30年代就開始了,在一些特殊場所早就有所應用。這種鎖是通過鍵盤輸入一組密碼完成開鎖過程。研究這種鎖的初衷,就是為提高鎖的安全性。由於電子鎖的密鑰量(密碼量)極大,可以與機械鎖配合使用,並且可以避免因鑰匙被仿製而留下安全隱患。電子鎖只需記住一組密碼,無需攜帶金屬鑰匙,免除了人們攜帶金屬鑰匙的煩惱,而被越來越多的人所欣賞。電子鎖的種類繁多,例如數碼鎖,指紋鎖,磁卡鎖,IC卡鎖,生物鎖等。但較實用的還是按鍵式電子密碼鎖。

20世紀80年代後,隨著電子鎖專用集成電路的出現,電子鎖的體積縮小,可靠性提高,成本較高,是適合使用在安全性要求較高的場合,且需要有電源提供能量,使用還局限在一定范圍,難以普及,所以對它的研究一直沒有明顯進展。

目前,在西方發達國家,電子密碼鎖技術相對先進,種類齊全,電子密碼鎖已被廣泛應用於智能門禁系統中,通過多種更加安全,更加可靠的技術實現大門的管理。在我國電子鎖整體水平尚處於國際上70年代左右,電子密碼鎖的成本還很高,市場上仍以按鍵電子鎖為主,按鍵式和卡片鑰匙式電子鎖已引進國際先進水平,現國內有幾個廠生產供應市場。但國內自行研製開發的電子鎖,其市場結構尚未形成,應用還不廣泛。國內的不少企業也引進了世界上先進的技術,發展前景非常可觀。希望通過不斷的努力,使電子密碼鎖在我國也能得到廣泛應用[1]。

目前使用的電子密碼鎖大部分是基於單片機技術,以單片機為主要器件,其編碼器與解碼器的生成為軟體方式[2]。在實際應用中,由於程序容易跑飛,系統的可靠性能較差。基於現場可編程邏輯門陣列FPGA器件的電子密碼鎖,用FPGA器件構造系統,所有演算法完全由硬體電路來實現,使得系統的工作可靠性大為提高。由於FPGA具有現場可編程功能,當設計需要更改時,只需更改FPGA中的控制和介面電路,利用EDA工具將更新後的設計下載到FPGA中即可,無需更改外部電路的設計,大大提高了設計的效率。

1.3 電子密碼鎖的系統簡介
通用的電子密碼鎖主要由三個部分組成:數字密碼輸入電路、密碼鎖控制電路和密碼鎖顯示電路。

(1) 密碼鎖輸入電路包括時序產生電路、鍵盤掃描電路、鍵盤彈跳消除電路、鍵盤解碼電路等幾個小的功能電路。

(2)密碼鎖控制電路包括按鍵數據的緩沖存儲電路,密碼的清除、變更、存儲、激活電鎖電路(寄存器清除信號發生電路),密碼核對(數值比較電路),解鎖電路(開/關門鎖電路)等幾個小的功能電路。

(3)密碼顯示電路主要將顯示數據的BCD碼轉換成相對應的編碼。如,若選用七段數碼管顯示電路,主要將待顯示數據的BCD碼轉換成數碼器的七段顯示驅動編碼[4]。

1.4 系統設計要求
設計一個具有較高安全性和較低成本的通用電子密碼鎖,具體功能要求如下:

(1)數碼輸入:每按下一個數字鍵,就輸入一個數值,並在顯示器上的顯示出該數值,同時將先前輸入的數據依序左移一個數字位置。

(2)數碼清除:按下此鍵可清除前面所有的輸入值,清除為「0000」。

(3)密碼更改:按下此鍵時會將目前的數字設定成新的密碼。

(4)激活電鎖:按下此鍵可將密碼鎖上鎖。

(5)解除電鎖:按下此鍵會檢查輸入的密碼是否正確,密碼正確即開鎖。

1.5 本課題的研究目的和意義
隨著人們生活水平的提高,對家庭防盜技術的要求也是越來越高,傳統的機械鎖由於其構造的簡單,被撬的事件屢見不鮮,電子鎖由於其保密性高,使用靈活性好,安全系數高,受到了廣大用戶的歡迎。現在市場上主要是基於單片機技術的電子密碼鎖,但可靠性較差。FPGA即現場可編程門陣列,它是在PAL、GAL、EPLD等可編程器件的基礎上進一步發展的產物,是一種超大規模集成電路,具有對電路可重配置能力。通常FPGA都有著上萬次的重寫次數,也就是說現在的硬體設計和軟體設計一樣靈活、方便。相對於基於單片機技術的電子密碼鎖,用FPGA器件來構成系統,可靠性提高,並且由於FPGA具有的現場可編程功能,使得電子密碼鎖的更改與升級更為方便簡單[3]。

通過本次設計掌握FPGA系統設計的方法,熟悉FPGA設計的相關軟體,以及硬體描述語言的使用,了解電子密碼鎖的系統構成,利用FPGA實現電子密碼鎖的設計與實現,可以加深自己對所學專業的認識,關聯知識,增強自己的動手能力,積累實踐經驗,為以後的工作打好基礎。

參考文獻
[1] 李連華.基於FPGA的電子密碼鎖設計.中國科技信息,2006,(01):64

[2] 許琦.基於FPGA的電子密碼鎖的設計.科技信息,2006,(10):240-241

[3] 王衛兵,劉克剛,朱秋萍.用FPGA的電子密碼鎖.電子技術,2005,(01):26-28

[4] 趙益丹,徐曉林,周振峰.電子密碼鎖的系統原理、設計程序及流程圖.嘉興學院學報,2003,15(S1):103-105

[5] 陸重陽,盧東華.FPGA技術及其發展趨勢.微電子技術,2003,(01):5-7

[6] 王曉勇.FPGA的基本原理及運用.艦船電子工程,2005,(02):82-85

[7] 程耀林.FPGA的系統設計方法解析.現代電子技術,2005,(19):90-93

[8] K. Benkrid, A. Benkrid and S. Belkacemi .Efficient FPGA hardware development: A multi-language approach .Journal of Systems Architectur -e, 2007(04):184-209

[9] Altera, Novas Team for FPGA Visibility Enhancement .Electronic News (North America).2006,(11):12

[10] 張忠.自頂向下的FPGA設計.電子產品世界,1998,(11):33-34,72

[11] 路而紅.專用集成電路設計與電子設計自動化.北京:清華大學出版社,2004:162-181,239-280,329-332

[12] 羅傑,康華光.兩種硬體描述語言VHDL/Verilog的發展及其應用.電氣電子教學學報, 2002,24(04):1-5

[13] 曹建國, 王威, 王丹. 一種基於VHDL的電子密碼鎖的設計與實現.沈陽大學學報 , 2006,18(04):77-79

[14] 譚會生,瞿遂春.EDA技術綜合應用實例與分析.西安:西安電子科技大學出版社,2004.1-42,64-85

[15] 梁麗.電子密碼鎖的計算機模擬設計.計算機模擬,2005,22(02):218-220

④ FPGA現在學起來怎麼樣難不需要了解哪些基礎課程

FPGA學習重點

1. 看代碼,建模型

只有在腦海中建立了一個個邏運祥模輯模型,理解FPGA內部邏輯結構實現的基礎,才能明白為什麼寫Verilog和寫C整體思路是不一樣的,才能理解順序執行語言和並行執行語言的設計方法上的差異。在看到一段簡單程序的時候應該想到是什麼樣的功能電路。2. 用數學思維來簡化設計邏輯

學習FPGA不僅邏輯思維很重要,好的數學思維也能讓你的設計化繁為簡,所以啊,那些看見高數就頭疼的童鞋需要重視一下這門課哦。舉個簡單的例子,比如有兩個32bit的數據X[31:0]與Y[31:0]相乘。當然,無論Altera還是Xilinx都有現成的乘法器IP核可以調用,這也是最簡單的方法,但是兩個32bit的乘法器將耗費大量的資源。那麼有沒有節省資源,又不太復雜的方式來實現呢?我們可以稍做修改:將X[31:0]拆成兩部分X1[15:0]和X2[15:0],令X1[15:0]=X[31:16],X2[15:0]=X[15:0],則X1左移16位後與X2相加可以得到X;同樣將Y[31:0]拆成兩部分宴者Y1[15:0]和Y2[15:0],令 Y1[15:0]=Y[31:16],Y2[15:0]=Y[15:0],則Y1左移16位後與Y2相加可以得到Y,則X與Y的相乘可以轉化為X1和X2 分別與Y1和Y2相乘,這樣一個32bit*32bit的乘法運算轉換成了四個16bit*16bit的乘法運算和三個32bit的加法運算。轉換後的佔用資源將會減少很多,有興趣的童鞋,不妨綜合一下看看,看看兩者差多少。3. 時鍾與觸發器的關系

「時鍾是時序電路的控制者」這句話太經典了,可以說是FPGA設計的聖言。FPGA的設計主要是以時序電路為主,因為組合邏輯電路再怎麼復雜也變不出太多花樣,理解起來也不沒太多困難。但是時序電路就不同了,它的所有動作都是在時鍾一拍一拍的節奏下轉變觸發,可以說時鍾就是整個電路的控制者,控制不好,電路功能就會混亂。打個比方,時鍾就相當於人體的心臟,它每一次的跳動就是觸發一個 CLK,向身體的各個器官供血,維持著機體的正常運作,每一個器官體統正常工作少不了組織細胞的構成,那麼觸發器就可以比作基本單元組織細胞。

時序邏輯電路的時鍾是控制時序邏輯電路旁緩狀態轉換的「發動機」,沒有它時序邏輯電路就不能正常工作。因為時序邏輯電路主要是利用觸發器存儲電路的狀態,而觸發器狀態變換需要時鍾的上升或下降沿,由此可見時鍾在時序電路中的核心作用。最後簡單說一下體會吧,歸結起來就是多實踐、多思考、多問。實踐出真知,看100遍別人的方案不如自己去實踐一下。實踐的動力一方面來自興趣,一方面來自壓力。有需求會容易形成壓力,也就是說最好能在實際的項目開發中鍛煉,而不是為了學習而學習。為什麼你會覺得FPGA難學?

1. 不熟悉FPGA的內部結構

FPGA為什麼是可以編程的?恐怕很多初學者不知道,他們也不想知道。因為他們覺得這是無關緊要的。他們潛意識的認為可編程嘛,肯定就是像寫軟體一樣啦。軟體編程的思想根深蒂固,看到Verilog或者VHDL就像看到C語言或者其它軟體編程語言一樣。一條條的讀,一條條的分析。

拒絕去了解為什麼FPGA是可以編程的,不去了解FPGA的內部結構,要想學會FPGA 恐怕是天方夜譚。那麼FPGA為什麼是可以「編程」的呢?首先來了解一下什麼叫「程」。其實 「程」只不過是一堆具有一定含義的01編碼而已。編程,其實就是編寫這些01編碼。只不過我們現在有了很多開發工具運算或者是其它操作。所以軟體是一條一條的,通常都不是直接編寫這些01編碼,而是以高級語言的形式來編寫,最後由開發工具轉換為這種01編碼而已。對於軟體編程而言,處理器會有一個專門的解碼電路逐條把這些01編碼翻譯為各種控制信號,然後控制其內部的電路完成一個個的讀,因為軟體的操作是一步一步完成的。

而FPGA的可編程,本質也是依靠這些01編碼實現其功能的改變,但不同的是FPGA之所以可以完成不同的功能,不是依靠像軟體那樣將01編碼翻譯出來再去控制一個運算電路,FPGA裡面沒有這些東西。FPGA內部主要三塊:可編程的邏輯單元、可編程的連線和可編程的IO模塊。

可編程的邏輯單元

其基本結構某種存儲器(SRAM、 FLASH等)製成的4輸入或6輸入1輸出的「真值表」加上一個D觸發器構成。任何一個4輸入1輸出組合邏輯電路,都有一張對應的「真值表」,同樣的如果用這么一個存儲器製成的4輸入1輸出的「真值表」,只需要修改其「真值表」內部值就可以等效出任意4輸入1輸出的組合邏輯,這些「真值表」內部值就是那些01編碼。

如果要實現時序邏輯電路怎麼辦?任何的時序邏輯都可以轉換為組合邏輯+D觸發器來完成。但這畢竟只實現了4輸入1輸出的邏輯電路而已,通常邏輯電路的規模那是相當的大。可編程連線

那怎麼辦呢?這個時候就需要用到可編程連線了。在這些連線上有很多用存儲器控制的鏈接點,通過改寫對應存儲器的值就可以確定哪些線是連上的而哪些線是斷開的。這就可以把很多可編程邏輯單元組合起來形成大型的邏輯電路。

可編程的IO

任何晶元都必然有輸入引腳和輸出引腳。有可編程的IO可以任意的定義某個非專用引腳(FPGA中有專門的非用戶可使用的測試、下載用引腳)為輸入還是輸出,還可以對IO的電平標准進行設置。

總歸一句話,FPGA之所以可編程是因為可以通過特殊的01代碼製作成一張張 「真值表」,並將這些「真值表」組合起來以實現大規模的邏輯功能。不了解FPGA內部結構,就不能明白最終代碼如何變到FPGA裡面去的,也就無法深入的了解如何能夠充分運用FPGA。現在的FPGA,不單單是有前面講的那三塊,還有很多專用的硬體功能單元,如何利用好這些單元實現復雜的邏輯電路設計,是從菜鳥邁向高手的路上必須要克服的障礙。而這一切,還是必須先從了解FPGA內部邏輯及其工作原理做起。

2. 錯誤理解HDL語言,怎麼看都看不出硬體結構

HDL語言的英語全稱是:Hardware Deion Language,注意這個單詞Deion,而不是Design。老外為什麼要用Deion這個詞而不是Design呢?因為HDL確實不是用用來設計硬體的,而僅僅是用來描述硬體的。

描述這個詞精確地反映了HDL語言的本質,HDL語言不過是已知硬體電路的文本表現形式而已,只是將以後的電路用文本的形式描述出來而已。而在編寫語言之前,硬體電路應該已經被設計出來了。語言只不過是將這種設計轉化為文字表達形式而已。

硬體設計也是有不同的抽象層次,每一個層次都需要設計。最高的抽象層次為演算法級、然後依次是體系結構級、寄存器傳輸級、門級、物理版圖級。

使用HDL的好處在於我們已經設計好了一個寄存器傳輸級的電路,那麼用HDL描述以後轉化為文本的形式,剩下的向更低層次的轉換就可以讓EDA工具去做了,這就大大的降低了工作量。這就是可綜合的概念,也就是說在對這一抽象層次上硬體單元進行描述可以被EDA工具理解並轉化為底層的門級電路或其他結構的電路。在FPGA設計中,就是在將這以抽象層級的意見描述成HDL語言,就可以通過FPGA開發軟體轉化為上一點中所述的FPGA內部邏輯功能實現形式。HDL也可以描述更高的抽象層級如演算法級或者是體系結構級,但目前受限於EDA軟體的發展,EDA軟體還無法理解這么高的抽象層次,所以HDL描述這樣抽象層級是無法被轉化為較低的抽象層級的,這也就是所謂的不可綜合。

所以在閱讀或編寫HDL語言,尤其是可綜合的HDL,不應該看到的是語言本身,而是要看到語言背後所對應的硬體電路結構。3. FPGA本身不算什麼,一切皆在FPGA之外

FPGA是給誰用的?很多學校是為給學微電子專業或者集成電路設計專業的學生用的,其實這不過是很多學校受資金限制,買不起專業的集成電路設計工具而用FPGA工具替代而已。其實FPGA是給設計電子系統的工程師使用的。這些工程師通常是使用已有的晶元搭配在一起完成一個電子設備,如基站、機頂盒、視頻監控設備等。當現有晶元無法滿足系統的需求時,就需要用FPGA來快速的定義一個能用的晶元。前面說了,FPGA裡面無法就是一些「真值表」、觸發器、各種連線以及一些硬體資源,電子系統工程師使用FPGA進行設計時無非就是考慮如何將這些以後資源組合起來實現一定的邏輯功能而已,而不必像IC設計工程師那樣一直要關注到最後晶元是不是能夠被製造出來。

本質上和利用現有晶元組合成不同的電子系統沒有區別,只是需要關注更底層的資源而已。要想把FPGA用起來還是簡單的,因為無非就是那些資源,在理解了前面兩點再搞個實驗板,跑跑實驗,做點簡單的東西是可以的。而真正要把FPGA用好,那光懂點FPGA知識就遠遠不夠了。因為最終要讓FPGA裡面的資源如何組合,實現何種功能才能滿足系統的需要,那就需要懂得更多更廣泛的知識。4. 數字邏輯知識是根本

無論是FPGA的哪個方向,都離不開數字邏輯知識的支撐。FPGA說白了是一種實現數字邏輯的方式而已。如果連最基本的數字邏輯的知識都有問題,學習FPGA的願望只是空中樓閣而已。數字邏輯是任何電子電氣類專業的專業基礎知識,也是必須要學好的一門課。

如果不能將數字邏輯知識爛熟於心,養成良好的設計習慣,學FPGA到最後仍然是霧里看花水中望月,始終是一場空的。以上四條只是我目前總結菜鳥們在學習FPGA時所最容易跑偏的地方,FPGA的學習其實就像學習圍棋一樣,學會如何在棋盤上落子很容易,成為一位高手卻是難上加難。要真成為李昌鎬那樣的神一般的選手,除了靠刻苦專研,恐怕還確實得要一點天賦。薦讀

1. 入門首先要掌握HDL(HDL=verilog+VHDL)

第一句話是:還沒學數電的先學數電。然後你可以選擇verilog或者VHDL,有C語言基礎的,建議選擇VHDL。因為verilog太像C了,很容易混淆,最後你會發現,你花了大量時間去區分這兩種語言,而不是在學習如何使用它。當然,你思維能轉得過來,也可以選verilog,畢竟在國內verilog用得比較多。接下來,首先找本實例抄代碼。抄代碼的意義在於熟悉語法規則和編譯器(這里的編譯器是硅編譯器又叫綜合器,常用的編譯器有:Quartus、ISE、Vivado、Design Compiler 、Synopsys的VCS、iverilog、Lattice的Diamond、Microsemi/Actel的Libero、Synplify pro),然後再模仿著寫,最後不看書也能寫出來。編譯完代碼,就打開RTL圖,看一下綜合出來是什麼樣的電路。HDL是硬體描述語言,突出硬體這一特點,所以要用數電的思維去思考HDL,而不是用C語言或者其它高級語言,如果不能理解這句話的,可以看《什麼是硬體以及什麼是軟體》。在這一階段,推薦的教材是《Verilog傳奇》、《Verilog HDL高級數字設計》或者是《用於邏輯綜合的VHDL》。不看書也能寫出個三段式狀態機就可以進入下一階段了。此外,你手上必須准備Verilog或者VHDL的官方文檔,《verilog_IEEE官方標准手冊-2005_IEEE_P1364》、《IEEE Standard VHDL Language_2008》,以便遇到一些語法問題的時候能查一下。2. 獨立完成中小規模的數字電路設計

現在,你可以設計一些數字電路了,像交通燈、電子琴、DDS等等,推薦的教材是夏老《Verilog 數字系統設計教程》(第三版)。在這一階段,你要做到的是:給你一個指標要求或者時序圖,你能用HDL設計電路去實現它。這里你需要一塊開發板,可以選Altera的cyclone IV系列,或者Xilinx的Spantan 6。

還沒掌握HDL之前千萬不要買開發板,因為你買回來也沒用。這里你沒必要每次編譯通過就下載代碼,咱們用modelsim模擬(此外還有QuestaSim、NC verilog、Diamond的Active-HDL、VCS、Debussy/Verdi等模擬工具),如果模擬都不能通過那就不用下載了,肯定不行的。在這里先掌握簡單的testbench就可以了。推薦的教材是《WRITING TESTBENCHES Functional Verification of HDL Models》。3. 掌握設計方法和設計原則

你可能發現你綜合出來的電路盡管沒錯,但有很多警告。這個時候,你得學會同步設計原則、優化電路,是速度優先還是面積優先,時鍾樹應該怎樣設計,怎樣同步兩個異頻時鍾等等。

推薦的教材是《FPGA權威指南》、《IP核芯志-數字邏輯設計思想》、《Altera FPGA/CPLD設計》第二版的基礎篇和高級篇兩本。學會加快編譯速度(增量式編譯、LogicLock),靜態時序分析(timequest),嵌入式邏輯分析儀(signaltap)就算是通關了。如果有不懂的地方可以暫時跳過,因為這部分還需要足量的實踐,才能有較深刻的理解。4. 學會提高開發效率

因為Quartus和ISE的編輯器功能太弱,影響了開發效率。所以建議使用Sublime text編輯器中代碼片段的功能,以減少重復性勞動。Modelsim也是常用的模擬工具,學會TCL/TK以編寫適合自己的DO文件,使得模擬變得自動化,推薦的教材是《TCL/TK入門經典》。

你可能會手動備份代碼,但是專業人士都是用版本控制器的,所以,為了提高工作效率,必須掌握GIT。文件比較器Beyond Compare也是個比較常用的工具。此外,你也可以使用System Verilog來替代testbench,這樣效率會更高一些。如果你是做IC驗證的,就必須掌握System Verilog和驗證方法學(UVM)。推薦的教材是《Writing Testbenches using SystemVerilog》、《The UVM Primer》、《System Verilog1800-2012語法手冊》。掌握了TCL/TK之後,可以學習虛擬Jtag(ISE也有類似的工具)製作屬於自己的調試工具,此外,有時間的話,最好再學個python。腳本,意味著一勞永逸。5. 增強理論基礎

這個時候,你已經會使用FPGA了,但是還有很多事情做不了(比如,FIR濾波器、PID演算法、OFDM等),因為理論沒學好。我大概地分幾個方向供大家參考,後面跟的是要掌握的理論課。信號處理 —— 信號與系統、數字信號處理、數字圖像處理、現代數字信號處理、盲信號處理、自適應濾波器原理、雷達信號處理

介面應用 —— 如:UART、SPI、IIC、USB、CAN、PCIE、Rapid IO、DDR、TCP/IP、SPI4.2(10G乙太網介面)、SATA、光纖、DisplayPort

無線通信 —— 信號與系統、數字信號處理、通信原理、移動通信基礎、隨機過程、資訊理論與編碼

CPU設計 —— 計算機組成原理、單片機、計算機體系結構、編譯原理

儀器儀表 —— 模擬電子技術、高頻電子線路、電子測量技術、智能儀器原理及應用

控制系統 —— 自動控制原理、現代控制理論、過程式控制制工程、模糊控制器理論與應用

壓縮、編碼、加密 —— 數論、抽象代數、現代編碼技術、資訊理論與編碼、數據壓縮導論、應用密碼學、音頻信息處理技術、數字視頻編碼技術原理現在你發現,原來FPGA會涉及到那麼多知識,你可以選一個感興趣的方向,但是工作中很有可能用到其中幾個方向的知識,所以理論還是學得越多越好。如果你要更上一層,數學和英語是不可避免的。6. 學會使用MATLAB模擬

設計FPGA演算法的時候,多多少少都會用到MATLAB,比如CRC的系數矩陣、數字濾波器系數、各種表格和文本處理等。此外,MATLAB還能用於調試HDL(用MATLAB的計算結果跟用HDL算出來的一步步對照,可以知道哪裡出問題)。推薦的教材是《MATLAB寶典》和杜勇的《數字濾波器的MATLAB與FPGA實現》。7. 圖像處理

Photoshop

花一、兩周的時間學習PS,對圖像處理有個大概的了解,知道各種圖片格式、直方圖、色相、通道、濾鏡、拼接等基本概念,並能使用它。這部分是0基礎,目的讓大家對圖像處理有個感性的認識,而不是一上來就各種各樣的公式推導。推薦《Photoshop CS6完全自學教程》。基於MATLAB或OpenCV的圖像處理

有C/C++基礎的可以學習OpenCV,否則的話,建議學MATLAB。這個階段下,只要學會簡單的調用函數即可,暫時不用深究實現的細節。推薦《數字圖像處理matlab版》、《學習OpenCV》。圖像處理的基礎理論

這部分的理論是需要高數、復變、線性代數、信號與系統、數字信號處理等基礎,基礎不好的話,建議先補補基礎再來。看不懂的理論也可以暫時先放下,或許學到後面就自然而然地開竅了。推薦《數字圖像處理》。基於FPGA的圖像處理

把前面學到的理論運用到FPGA上面,如果這時你有前面第七個階段的水平,你將輕松地獨立完成圖像演算法設計(圖像處理是離不開介面的,上面第五個階段有講)。推薦《基於FPGA的嵌入式圖像處理系統設計》、《基於FPGA的數字圖像處理原理及應用》。進一步鑽研數學。要在演算法上更上一層,必然需要更多的數學,所以這里建議學習實分析、泛涵分析、小波分析等。

⑤ FPGA怎麼開始學

學習步驟:

1,計算機必不可少。可以選擇安裝quartusII或者ISE軟體。這是必備的軟體環境。
2、熟悉verilog語言或者vhdl語言 ,熟練使用quartusII或者ISE軟體。
3、設計一個小代碼,下載到目標板看看結果。
4、設計稍微復雜的代碼,下載到目標板看看結果。
5、設計復雜的代碼,下載到目標板看看結果。
6、設計高速介面,譬如ddr2或者高速串列介面
7、設計一個復雜的協議,譬如USB、PCIexpress、圖像編解碼等。
8、學習再學習,知道「學無止境,山外有山」。
注意事項:第一步:學習了解FPGA結構,FPGA到底是什麼東西,晶元裡面有什麼,不要開始就拿個開發板照著別人的東西去編程。
第二步:掌握FPGA設計的流程。了解每一步在做什麼,為什麼要那麼做。
第三步:開始學習代碼了。不要一開始就走入誤區。
第四步:template很重要。能不能高效利用FPGA資源,一是了解fpga結構,二是了解欲實現的邏輯功能和基本機構,三是使用正確的模板。
總結:理解時序,邏輯是一拍一拍的東西,在設計初期想的不是很清楚的時候可以畫畫時序圖,這樣思路會更加的清晰,還有就是模擬很重要,不要寫完程序就去往FPGA中去載入,首先要模擬,尤其是對比較大型一點的程序,想像自己是在做asic,是沒有二次機會的,所以一定要把模擬做好。

閱讀全文

與fpga演算法教程相關的資料

熱點內容
編譯器有幾個好用的 瀏覽:500
資料庫和網站如何搭載伺服器 瀏覽:154
網路流理論演算法與應用 瀏覽:795
java和matlab 瀏覽:388
釘釘蘋果怎麼下app軟體 瀏覽:832
php網站驗證碼不顯示 瀏覽:859
鋁膜構造柱要設置加密區嗎 瀏覽:344
考駕照怎麼找伺服器 瀏覽:884
阿里雲伺服器如何更換地區 瀏覽:972
手機app調音器怎麼調古箏 瀏覽:503
銳起無盤系統在伺服器上需要設置什麼嗎 瀏覽:19
紅旗計程車app怎麼應聘 瀏覽:978
如何編寫linux程序 瀏覽:870
吉利車解壓 瀏覽:248
java輸入流字元串 瀏覽:341
安卓軟體沒網怎麼回事 瀏覽:785
dvd壓縮碟怎麼導出電腦 瀏覽:275
冒險島什麼伺服器好玩 瀏覽:542
如何在伺服器上做性能測試 瀏覽:794
命令序列錯 瀏覽:261