FPGA學(xué)習(xí)重點(diǎn)
1. 看代碼,建模型
只有在腦海中建立了一個(gè)個(gè)邏輯模型,理解FPGA內(nèi)部邏輯結(jié)構(gòu)實(shí)現(xiàn)的基礎(chǔ),才能明白為什么寫Verilog和寫C整體思路是不一樣的,才能理解順序執(zhí)行語(yǔ)言和并行執(zhí)行語(yǔ)言的設(shè)計(jì)方法上的差異。在看到一段簡(jiǎn)單程序的時(shí)候應(yīng)該想到是什么樣的功能電路。
2. 用數(shù)學(xué)思維來(lái)簡(jiǎn)化設(shè)計(jì)邏輯
學(xué)習(xí)FPGA不僅邏輯思維很重要,好的數(shù)學(xué)思維也能讓你的設(shè)計(jì)化繁為簡(jiǎn),所以啊,那些看見(jiàn)高數(shù)就頭疼的童鞋需要重視一下這門課哦。舉個(gè)簡(jiǎn)單的例子,比如有兩個(gè)32bit的數(shù)據(jù)X[31:0]與Y[31:0]相乘。當(dāng)然,無(wú)論Altera還是Xilinx都有現(xiàn)成的乘法器IP核可以調(diào)用,這也是最簡(jiǎn)單的方法,但是兩個(gè)32bit的乘法器將耗費(fèi)大量的資源。那么有沒(méi)有節(jié)省資源,又不太復(fù)雜的方式來(lái)實(shí)現(xiàn)呢?我們可以稍做修改:
將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(jié),則X與Y的相乘可以轉(zhuǎn)化為X1和X2 分別與Y1和Y2相乘,這樣一個(gè)32bit32bit的乘法運(yùn)算轉(zhuǎn)換成了四個(gè)16bit16bit的乘法運(yùn)算和三個(gè)32bit的加法運(yùn)算。轉(zhuǎn)換后的占用資源將會(huì)減少很多,有興趣的童鞋,不妨綜合一下看看,看看兩者差多少。
3. 時(shí)鐘與觸發(fā)器的關(guān)系
“時(shí)鐘是時(shí)序電路的控制者”這句話太經(jīng)典了,可以說(shuō)是FPGA設(shè)計(jì)的圣言。FPGA的設(shè)計(jì)主要是以時(shí)序電路為主,因?yàn)榻M合邏輯電路再怎么復(fù)雜也變不出太多花樣,理解起來(lái)也不沒(méi)太多困難。但是時(shí)序電路就不同了,它的所有動(dòng)作都是在時(shí)鐘一拍一拍的節(jié)奏下轉(zhuǎn)變觸發(fā),可以說(shuō)時(shí)鐘就是整個(gè)電路的控制者,控制不好,電路功能就會(huì)混亂。
打個(gè)比方,時(shí)鐘就相當(dāng)于人體的心臟,它每一次的跳動(dòng)就是觸發(fā)一個(gè) CLK,向身體的各個(gè)器官供血,維持著機(jī)體的正常運(yùn)作,每一個(gè)器官體統(tǒng)正常工作少不了組織細(xì)胞的構(gòu)成,那么觸發(fā)器就可以比作基本單元組織細(xì)胞。
時(shí)序邏輯電路的時(shí)鐘是控制時(shí)序邏輯電路狀態(tài)轉(zhuǎn)換的“發(fā)動(dòng)機(jī)”,沒(méi)有它時(shí)序邏輯電路就不能正常工作。因?yàn)闀r(shí)序邏輯電路主要是利用觸發(fā)器存儲(chǔ)電路的狀態(tài),而觸發(fā)器狀態(tài)變換需要時(shí)鐘的上升或下降沿,由此可見(jiàn)時(shí)鐘在時(shí)序電路中的核心作用。
FPGA開(kāi)發(fā)籠統(tǒng)的說(shuō)可以分為兩個(gè)方向,一個(gè)是接口方向、一個(gè)是算法方向。
接口方向
接口方向可不是簡(jiǎn)單的uart、IIC、SPI等這些簡(jiǎn)單接口,這些東西不足以支撐一個(gè)方向,大部分都是基于serdes的高速?gòu)?fù)雜接口,例如PCIE、SATA等。還有以太網(wǎng),甚至可能不太復(fù)雜的SDRAM控制接口。
這些接口簡(jiǎn)單么? 簡(jiǎn)單,不是都有IP核可以調(diào)用么,IP核是個(gè)好東西,節(jié)省了我們大部分的時(shí)間,要不自己寫一個(gè)試試?感覺(jué)impossible啊,看看那一堆復(fù)雜的協(xié)議,光用ip核都一大堆問(wèn)題了,還敢夸口自己寫,
要是沒(méi)人帶,很難自己搞的出來(lái)。這也是我害怕搞接口的原因。之前公司有一個(gè)華為的大牛,沒(méi)有用廠家的IP核,說(shuō)這個(gè)收費(fèi)的IP核要多少W美刀,硬是自己寫了一個(gè),我是一直都很佩服他的,因?yàn)檫@種接口如此的復(fù)雜,光理解那些協(xié)議還是英文的,我都不知道能不能理解。也許是他之前在華為搞過(guò)這個(gè)接口,但早期華為出來(lái)的人,估計(jì)大概是(03年~13年)在華為吧,真的是有很厲害,現(xiàn)在的華為據(jù)說(shuō)分的特別細(xì),可能一個(gè)人就負(fù)責(zé)一個(gè)模塊,好幾年都是這樣,把細(xì)節(jié)做到極致,但是人就螺絲釘化了,有好有不好吧。
因?yàn)楣ぷ鞯脑?,現(xiàn)在已經(jīng)接觸到了serdes以及基于serdes的jesd和cpri協(xié)議等,可以說(shuō)接口方面也算是入了門的吧,但實(shí)際上也都是IP核來(lái)實(shí)現(xiàn)的,光ip核調(diào)試起來(lái)有時(shí)候都要磨很久了。甚至有時(shí)候光一個(gè)小問(wèn)題磨你一兩個(gè)月都很常見(jiàn)
因?yàn)榻涌诜较蛭铱赡苁侨腴T水準(zhǔn),也就不說(shuō)太多了。
總之接口方向就是 復(fù)雜的接口+復(fù)雜的協(xié)議,要閱讀海量的數(shù)據(jù)手冊(cè),跟硬件專業(yè)親密的扯皮加配合,踩過(guò)無(wú)數(shù)的坑,方能略有小成
算法方向
接下來(lái)說(shuō)說(shuō)算法方向,一般來(lái)說(shuō)以算法作為一個(gè)方向,那么這個(gè)算法整體來(lái)說(shuō)是非常復(fù)雜的。以導(dǎo)航的定位解算來(lái)舉例。
導(dǎo)航的定位解算包括:中頻信號(hào)搬頻到基帶、進(jìn)行信號(hào)的捕獲(涉及相關(guān)運(yùn)算、FFT等)、信號(hào)的跟蹤(數(shù)字鎖頻環(huán)、數(shù)字鎖相環(huán)、觀測(cè)量提取、電文的提?。㈦娢奶崛。ㄐ诺澜獯a、解交織、位同步、幀同步、電文解析)、定位解算(偽距計(jì)算輸出、載波相位輸出,最小二乘法算法,星歷參數(shù)計(jì)算,統(tǒng)稱PVT解算(位置、速度、時(shí)間) )
這么多算法全部整合在一起,需要進(jìn)行充分的驗(yàn)證,如果只是用類似modelsim來(lái)仿真,那速度真是慢的想哭。那么我們需要更高級(jí)的方法,我們需要一個(gè)定點(diǎn)模型,matlab定點(diǎn)模型或者C定點(diǎn)模型。對(duì)于某些要做芯片的工程,一般是要做成C模型,C模型的效率比matlab更高,雖然看起來(lái)matlab更簡(jiǎn)單直接
算法模型要做到什么程度呢,最理想的就是要做到和modelsim仿真結(jié)果一模一樣,無(wú)論是某些重要的中間結(jié)果還是最終結(jié)果,無(wú)論是數(shù)據(jù)流型的結(jié)果還是觸發(fā)型的結(jié)果,都要完全的一模一樣。因此算法模型的搭建會(huì)占用你大量的時(shí)間,但是一但搭建成功,則后面大部分驗(yàn)證都完全可以通過(guò)算法模型去仿真,不在需要在用modelsim進(jìn)行仿真了,因?yàn)閙odelsim相對(duì)于matlab或者C模型來(lái)說(shuō),實(shí)在是太慢太不方便了。
之前在那家創(chuàng)業(yè)公司弄GPS導(dǎo)航信號(hào)接收處理,捕獲部分是比較復(fù)雜的,100多個(gè)并行相關(guān)器進(jìn)行短時(shí)相關(guān)+FFT的操作,我是花了很多時(shí)間用matlab做了完全一致的定點(diǎn)化模型,完成了之后,后面要改什么,或者要驗(yàn)證什么就非常方便了,因?yàn)槲铱梢灾苯釉趍atlab模型上進(jìn)行驗(yàn)證了,無(wú)需通過(guò)跑modelsim,基本就知道其是否正確了
matlab做算法模型還比較好理解,但C做算法模型呢
以下這個(gè)這個(gè)例子,表示用C來(lái)實(shí)現(xiàn)GPS C/A碼并且進(jìn)行驗(yàn)證
#include
#include
#include
#include "PrnGen.h"
#include "PrnInit.h"
#include "GPSPrnTable.h"
void main(void)
{
? ? PrnGen PrnGen;
? ? int i,j,prn;
? ? int error = 0;
? ? int CodeOutI[1023];
? ? unsigned int SRegs[24];
? ? unsigned int SBuffer[6];
? ? // set 0 for GPS , G1 and G2 parallel, code length = 1023
? ? SRegs[0] = (0x3a6 << 14) | 0x204;
? ? SRegs[1] = 1023 << 14;
? ? SRegs[2] = (0x3a6 << 14) | 0x204;
? ? SRegs[3] = 1023 << 14;
? ? // check GPS L1 C/A in CodeI
? ? PrnGen.SetPoly(&(SettingRegs[0]));
? ? for (prn=1; prn<=32; prn++)
? ? {
? ? ? ? SBuffer[0] = SBuffer[2] = CAPrnInit[prn];
? ? ? ? SBuffer[4] = 0;
? ? ? ? for(i=0;i<10;i++)
? ? ? ? {
? ? ? ? ? ? PrnGen.Reset();
? ? ? ? ? ? PrnGen.LoadState(SBuffer);
? ? ? ? ? ? for(j=0; j<1023; j++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? CodeOutI[j] = PrnGen.GetCodeI();
? ? ? ? ? ? ? ? PrnGen.ShiftCodeI();
? ? ? ? ? ? ? ? if (CodeOutI[j] != CAcode[prn-1][j])
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? error = 1;
? ? ? ? ? ? ? ? ? ? printf("error on prn%d bit%d! ", prn, j);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? PrnGen.DumpState(SBuffer);
? ? ? ? }
? ? }
? ? if (error == 0)
? ? ? ? printf("C/A code test passed! ");
? ? system("PAUSE");
}
上面是模擬verilog實(shí)現(xiàn)的功能,其實(shí)雖然C和MATLAB是順序執(zhí)行的,但也是可以模擬verilog并行執(zhí)行的,如下面就是模擬verilog的并行執(zhí)行功能
while (1)
{
clkcnt = clkcnt +1;
delay_d3 =delay_d2;
delay_d2 = delay_d1;
delay_d1 = delay_in;
}
這個(gè)等效于verilog的下面語(yǔ)句
always @(POSedge clk)
begin
delay_d1 <= delay_in;
delay_d2 <=delay_d1;
delay_d3 <= delay_d2;
end
以上只是冰上一腳,以前接觸過(guò)的大型工程,甚至要做芯片去流片的C算法模型非常的龐大
總結(jié)
如果以武功來(lái)描述這兩個(gè)方向的關(guān)系,接口就是劍,算法是氣。
劍是紛繁復(fù)雜的招數(shù),華山劍法(JESD)、嵩山劍法(PCIE)、辟邪劍法(SATA),每一個(gè)都招式繁多,但每個(gè)招式都記錄于劍譜(協(xié)議)只上,因?yàn)檎惺绞撬赖?,理論上只要有人手把手的教,基本都能學(xué)會(huì)。但事實(shí)上不會(huì)有人手把手的教,一般只有門派(公司)有什么才能學(xué)到什么,而且也不會(huì)有人手把手去交,老員工一般只是會(huì)稍加提點(diǎn),大部分情況下要去自己勤加苦練。想學(xué)更多只能改投其他門派了,但投靠門派多了,可能各門武功都學(xué)藝不精了。
氣是深厚內(nèi)力的修為,紫霞神功(數(shù)字信號(hào)處理)、吸星大法(高等數(shù)學(xué)),這些東西只有口訣,完全根據(jù)自己的悟性才能練到多少重。想想當(dāng)年高等數(shù)學(xué)都理解了不,數(shù)字信號(hào)處理、信號(hào)與系統(tǒng)都想得明白么,想不明白,有人教也沒(méi)用,因?yàn)槔斫獠涣?。第一家公司有一個(gè)清華的同事,人家理解LDCP編解碼,人家理解的那一個(gè)快呀。我是半天都看不懂,因?yàn)槲腋叩葦?shù)學(xué)差呀。。。這真的跟智商有關(guān)系呀。
以上是一些粗鄙的認(rèn)識(shí),兩個(gè)方向都不容易,接口需要對(duì)架構(gòu)、協(xié)議做非常深的理解才能游刃有余,而且調(diào)接口是非常需要經(jīng)驗(yàn)的,高手都是踩過(guò)無(wú)數(shù)的坑而來(lái)。算法實(shí)現(xiàn)首先需要一些理論功底,首先必須完全理解這個(gè)算法,然后算法實(shí)現(xiàn)的好壞優(yōu)劣也跟你實(shí)現(xiàn)的方式有關(guān)。所以無(wú)論是練劍還是練氣,練到極致那都是非常優(yōu)秀的了?! ?/p>
評(píng)論
查看更多