?
9.3??FPGA系統(tǒng)設(shè)計的3種常用IP模塊
FPGA的開發(fā)工具軟件,如Quartus?II、ISE等,一般都會提供一些經(jīng)過驗證的IP模塊。這些IP模塊是芯片廠家提供的,所以只能用于該廠家的FPGA芯片設(shè)計中。這些IP主要包括以下幾類。
·??算術(shù)類,如乘法器、加法器、除法器等。
·??邏輯門類,如與門、或門、非門等。
·??I/O類,如雙向IO、PLL、LVDS等。
·??接口類,如以太網(wǎng)MAC、PCI接口控制器、高速串行收發(fā)器(SERDES)等。
·??商業(yè)IP核,需要付費(fèi)購買的。
以上的IP中,最常用的3個IP分別是片上存儲器(RAM/ROM/FIFO),鎖相環(huán)(PLL/DLL)和高速串行收發(fā)器(SERDES)。靈活使用這些IP,可以提升設(shè)計的性能,同時降低設(shè)計的復(fù)雜度。
IP模塊的實現(xiàn)方式主要有3種:使用HDL代碼描述、使用綜合約束屬性例化或類推、使用器件商的IP?core生成器。
典型功能的IP?core都可以通過這3種途徑實現(xiàn)。其中前兩種方法需要學(xué)習(xí)綜合RAM、ROM、CAM等存儲單元的Coding?Style或約束屬性,后一種方法非常方便、直接,建議初學(xué)者首先要掌握使用器件商IP?core生成器設(shè)計RAM、ROM、CAM等存儲單元的方法。
下面通過Quartus?II工具分別介紹Altera的3種IP模塊的使用方法。
9.3.1??片上存儲器的使用方法
片上存儲器由內(nèi)嵌于FPGA內(nèi)部的邏輯資源(分布RAM和塊RAM)搭建而成。搭建出來的這些片上存儲器的調(diào)用方法與分立器件基本一致,但卻為開發(fā)者省去了大量的PCB布線資源。在小容量的存儲器設(shè)計中有著非常廣泛的應(yīng)用,同時這些片上存儲器還常常用作數(shù)據(jù)緩沖及時鐘域轉(zhuǎn)換等工作。
首先來介紹片上FIFO?的使用方法。
1.FIFO
(1)打開宏模塊向?qū)Ч芾砥鳌?/p>
在Quartus?II中,IP模塊的生成都是通過“MegaWizard?Plug-In?Manager”(宏模塊向?qū)Ч芾砥鳎崿F(xiàn)的,它可以通過如圖9.9的“Tools”菜單打開。
(2)選擇新建宏模塊。
在宏模塊向?qū)Ч芾砥鞯牡?頁,選擇新建一個自定義的宏模塊,如圖9.10所示。
圖9.9??宏模塊向?qū)Ч芾砥髡{(diào)用?????? 圖9.10??新建宏模塊
(3)選擇宏模塊。
在宏模塊向?qū)Ч芾砥鞯牡?頁,管理器為我們提供了支持的宏模塊樹形目錄。通過在該目錄中選擇相應(yīng)的宏模塊實現(xiàn)調(diào)用。同時在這一頁中還可以選擇應(yīng)用的FPGA器件系列和宏模塊的描述語言,并使用用戶自定義的模塊名,如圖9.11所示。
圖9.11??選擇宏模塊
在本例中,我們選擇“LPM_FIFO+模塊”進(jìn)行實現(xiàn)。
(4)設(shè)置FIFO寬度和深度。
在宏模塊向?qū)Ч芾砥鳎‵IFO)的第3頁,可以設(shè)置FIFO的深度和寬度,同時在本頁的左下角會計算出實現(xiàn)這樣一個深度和寬度的FIFO所消耗的FPGA資源,如圖9.12所示。
圖9.12??設(shè)置FIFO深度和寬度
?
(5)設(shè)置FIFO的控制信號。
在宏模塊向?qū)Ч芾砥鳎‵IFO)的第4頁,可以設(shè)置FIFO的控制信號,包括滿信號full、空信號empty、使用字節(jié)信號組usedw[?]、幾乎滿信號almost?full(可編程)、幾乎空信號almost?empty(可編程)、異步清零信號和同步清零信號。
通過選擇是否打開這些信號來構(gòu)造一個用戶自定義的FIFO,如圖9.13所示。
圖9.13??設(shè)置FIFO的控制信號
(6)設(shè)置FIFO的模式。
在宏模塊向?qū)Ч芾砥鳎‵IFO)的第6頁,可以設(shè)置FIFO的模式。分為Lagacy同步模式和Show-ahead同步模式。區(qū)別在于輸出數(shù)據(jù)是在FIFO的讀請求信號rdreq發(fā)出之前還是之后有效,用戶可以根據(jù)需要進(jìn)行選擇,如圖9.14所示。
(7)設(shè)置FIFO的外部屬性。
在宏模塊向?qū)Ч芾砥鳎‵IFO)的第7頁,可以設(shè)置FIFO的外部屬性,包括輸出寄存器使用最佳速度策略還是最小面積策略,數(shù)據(jù)溢出及讀空狀態(tài)下的保護(hù)機(jī)制,還可以強(qiáng)制只利用邏輯單元來構(gòu)造FIFO,如圖9.15所示。
圖9.14??設(shè)置FIFO的模式
圖9.15??設(shè)置FIFO的外部屬性
(8)選擇生成的FIFO模塊文件。
在宏模塊向?qū)Ч芾砥鳎‵IFO)的第8頁,也就是最后一頁,可以選擇生成的FIFO模塊文件。在Quartus?II軟件中,宏模塊向?qū)Ч芾砥骺蔀镕IFO生成7個文件,如圖9.16所示。
圖9.16??選擇生成的FIFO模塊文件????????圖9.17??打開工程添加/刪除文件對話框
(9)向工程添加FIFO模塊文件。
生成FIFO模塊的文件后,在工程的目錄下生成了選擇的文件。要在工程中調(diào)用這些模塊,首先要將這些文件添加到工程中來。
打開“Project”菜單,選擇其中的“Add/Remove?Files?in?Project…”選項,如圖9.17所示,打開工程添加/刪除文件對話框。
在打開的對話框中,選擇向工程添加3個文件,如圖9.18所示。
圖9.18??添加FIFO模塊文件圖?????????????? 9.19??工程瀏覽器
添加成功后,在工程瀏覽器中,可以看到器件設(shè)計文件中已經(jīng)包含了這3個文件,如圖9.19所示。
(10)FIFO模塊實例化。
將模塊文件加入工程后,設(shè)計者就可以調(diào)用這個片上FIFO,并實例化了。
首先我們看一下Quartus?II是如何構(gòu)建這個FIFO的。打開fifo_test.v文件,這是FIFO模塊的構(gòu)造設(shè)計文件。該構(gòu)造設(shè)計文件主要可以分為下面4個部分。
第一部分是端口聲明和說明,這部分是根據(jù)用戶自定義選擇的控制信號及深度、寬度等參數(shù)決定的,代碼如下:
module?fifo_test?(?
?????data, //數(shù)據(jù)輸入
?????wrreq, //寫請求
?????rdreq, //讀請求
?????clock, //時鐘
?????aclr, //異步清零
?????q, //數(shù)據(jù)輸出
?????full, //滿信號
?????empty, //空信號
?????usedw); //字節(jié)使用信號
?????input [31:0]??data; //輸入數(shù)據(jù)寬度
?????input wrreq;
?????input rdreq;
?????input clock;
?????input aclr;
?????output [31:0]??q; //輸出數(shù)據(jù)寬度
?????output full;
?????output empty;
?????output [10:0]??usedw; //自動計算出的字節(jié)使用控制信號寬度
?
第二部分是FIFO端口信號與Altera宏模塊之間的連線聲明,其中只有輸出信號需要聲明,而輸入信號可以直接調(diào)用,代碼如下:
wire?[10:0]?sub_wire0; //usedw輸出類型聲明
wire??sub_wire1; //空信號輸出類型聲明
wire?[31:0]?sub_wire2; //數(shù)據(jù)輸出類型聲明
wire??sub_wire3; ? //滿信號輸出類型聲明
wire?[10:0]?usedw?=?sub_wire0[10:0]; //usedw連線
wire??empty?=?sub_wire1; //空信號連線
wire?[31:0]?q?=?sub_wire2[31:0];? //數(shù)據(jù)輸出連線
wire??full?=?sub_wire3;? ???? //滿信號連線
第三部分是實例化FIFO所調(diào)用的宏模塊,這里調(diào)用的是scfifo模塊,代碼如下:
scfifo???scfifo_component?( //scfifo模塊實例化?
???????????????.rdreq?(rdreq), //讀請求
???????????????.aclr?(aclr), //異步清零
???????????????.clock?(clock), //時鐘
???????????????.wrreq?(wrreq), //寫請求
???????????????.data?(data), //輸入數(shù)據(jù)
???????????????.usedw?(sub_wire0), //字節(jié)使用信號
???????????????.empty?(sub_wire1), //空信號
???????????????.q?(sub_wire2), //數(shù)據(jù)輸出
???????????????.full?(sub_wire3) //滿信號
???????????????.almost_empty?(), //幾乎空信號
???????????????.almost_full?(), //幾乎滿信號
???????????????.sclr?() //清零信號
???????????????.);
第四部分是參數(shù)設(shè)置,這里設(shè)置的是scfifo模塊的參數(shù),包括寬度、深度以及之前生成步驟中設(shè)置的那些參數(shù),代碼如下:
defparam?
??????scfifo_component.lpm_width?=?32, ????//寬度為32位
??????scfifo_component.lpm_numwords?=?2048, ???//深度為2048字節(jié)
??????scfifo_component.intended_device_family?=?"Cyclone",//器件族為Cyclone
??????scfifo_component.lpm_type?=?"scfifo", //調(diào)用lpm為scfifo
??????scfifo_component.lpm_showahead?=?"OFF", //關(guān)閉showahead模式
??????scfifo_component.overflow_checking?=?"ON", //打開溢出校驗
??????scfifo_component.underflow_checking?=?"ON", //打開讀空校驗
??????scfifo_component.add_ram_output_register?=?"ON"; //使用輸出寄存器
在生成的3個FIFO模塊文件中,還包含一個fifo_test_bb.v文件,這個文件包含的是fifo_test.v文件的第一部分內(nèi)容,也就是說這個文件是FIFO模塊的端口聲明模塊。
剩下的一個文件是fifo_test_inst.v,inst是實例化的簡稱。在這個文件里面提供了FIFO模塊實例化的模板,代碼如下:
fifo_test fifo_test_inst?( //fifo_test模塊實例化?
?????.data?(?data_sig?), //輸入數(shù)據(jù)
?????.wrreq?(?wrreq_sig?), //寫請求
?????.rdreq?(?rdreq_sig?), //讀請求
?????.clock?(?clock_sig?), //時鐘
?????.aclr?(?aclr_sig?), //異步清零
?????.q?(?q_sig?), //輸出數(shù)據(jù)
?????.full?(?full_sig?), //滿信號
?????.empty?(?empty_sig?), //空信號
?????.usedw?(?usedw_sig?) //字節(jié)使用信號
);
通過復(fù)制這個模板至工程設(shè)計文件中,即可實現(xiàn)FIFO模塊的實例化。在進(jìn)行實例化時,可以修改實例化的名稱以及FIFO模塊端口信號線的連線資源名稱。
下面是將FIFO實例化在IP_Generate_Test工程中的代碼。
module?IP_Generate_Test(...); //調(diào)用FIFO模塊的設(shè)計文件模塊
?????... //連線資源聲明
?????fifo_test fifo_test_inst1?( //實例化為fifo_test_inst1
??????????.data?(?fifo_data?), //FIFO數(shù)據(jù)輸入為fifo_data
??????????.wrreq?(fifo_wrreq),
??????????.rdreq?(fifo_rdreq),
??????????.clock?(fifo_?clock),
??????????.aclr?(fifo_aclr),
??????????.q?(fifo_?q?),
??????????.full?(fifo_?full?),
??????????.empty?(fifo_empty?),
??????????.usedw?(?) //未實例化的端口保留空白表示不使用該端口
??????????);
?????...
endmodule
至此,已經(jīng)在一個工程中實現(xiàn)了片上FIFO的調(diào)用。
?
2.RAM
這里主要介紹雙口RAM模塊的生成方法,模塊的構(gòu)造方法及調(diào)用方法與FIFO模塊類似,不詳細(xì)介紹。
(1)打開宏模塊向?qū)Ч芾砥鞑⑿陆ê昴K。
具體方法參見FIFO的方法。
(2)選擇宏模塊。
在本例中,我們選擇LPM_RAM_DP模塊進(jìn)行實現(xiàn),如圖9.20所示。
圖9.20??選擇宏模塊
(3)設(shè)置DPRAM端口數(shù)及容量單位。
在宏模塊向?qū)Ч芾砥鳎―PRAM)的第3頁,可以設(shè)置DPRAM的端口數(shù)及容量單位。支持兩種DPRAM:1個讀端口和1個寫端口的DPRAM,2個讀端口和2個寫端口的DPRAM??梢栽O(shè)置DPRAM的容量單位為位或者是字節(jié)。同時在本頁的左下角會計算出實現(xiàn)這樣一個DPRAM所消耗的FPGA資源,如圖9.21所示。
圖9.21??選擇宏模塊
?
(4)設(shè)置DPRAM數(shù)據(jù)寬度及容量。
在宏模塊向?qū)Ч芾砥鳎―PRAM)的第4頁,可以設(shè)置DPRAM的數(shù)據(jù)寬度及容量,同時可以設(shè)置輸入輸出端口為不同的寬度實現(xiàn)串并或并串轉(zhuǎn)換,如圖9.22所示。
(5)設(shè)置DPRAM時鐘及使能。
在宏模塊向?qū)Ч芾砥鳎―PRAM)的第5頁,可以設(shè)置DPRAM的時鐘及使能信號,可以將DPRAM設(shè)置為單時鐘(輸入輸出使用同一個時鐘),也可以使用獨(dú)立的時鐘。另外還可以為DPRAM增加讀使能信號rden,如圖9.23所示。
圖9.22??設(shè)置DPRAM數(shù)據(jù)寬度及容量
圖9.23??設(shè)置DPRAM時鐘及使能
(6)設(shè)置DPRAM端口寄存器及清零信號。
在宏模塊向?qū)Ч芾砥鳎―PRAM)的第7頁,可以設(shè)置DPRAM的端口寄存器及清零信號,可以選擇是否增加端口的寄存器,如圖9.24所示。
圖9.24??設(shè)置DPRAM端口寄存器及清零信號
(7)設(shè)置DPRAM初始化值。
在宏模塊向?qū)Ч芾砥鳎―PRAM)的第9頁,可以設(shè)置DPRAM的初始化值。通過選擇MIF文件或者HEX文件可以使用文件中的值對DPRAM進(jìn)行初始化,如圖9.25所示。
圖9.25??設(shè)置DPRAM初始化值
?
(8)生成DPRAM模塊文件。
設(shè)置完成所有的參數(shù),來到宏模塊向?qū)Ч芾砥鳎―PRAM)的最后一頁??梢赃x擇生成的DPRAM模塊文件,共有6個文件可以生成,如圖9.26所示。
圖9.26??生成DPRAM模塊文件
DPRAM的調(diào)用方式與FIFO的類似,其構(gòu)建方式及模塊的聲明結(jié)構(gòu)可以參看DPRAM模塊的dpram_test.v和dpram_test_bb.v文件。
?
3.ROM
這里主要介紹ROM模塊的生成方法,模塊的構(gòu)造方法及調(diào)用方法與FIFO模塊類似,就不詳細(xì)介紹了。
(1)打開宏模塊向?qū)Ч芾砥鞑⑿陆ê昴K。
具體方法參見FIFO的方法。
(2)選擇宏模塊。
在本例中,我們選擇LPM_ROM模塊進(jìn)行實現(xiàn),如圖9.27所示。
(3)設(shè)置ROM寬度、深度及時鐘控制方式。
在宏模塊向?qū)Ч芾砥鳎―PRAM)的第3頁,可以設(shè)置DPRAM的寬度、深度及時鐘控制方式。ROM寬度指的是存儲器數(shù)據(jù)位寬,深度指的是具有該寬度的存儲單元個數(shù)。宏模塊向?qū)Ч芾砥鲿鶕?jù)設(shè)計者的選擇自動生成ROM的地址總線,同時也會在左下角顯示消耗的FPGA邏輯資源情況。
圖9.27??選擇宏模塊
ROM的時鐘控制方式分為兩種,一種為單時鐘,另一種將輸入時鐘和輸出時鐘分離。ROM的輸入輸出使用的是同一個數(shù)據(jù)端口,時鐘的分離實際上也是對同一個數(shù)據(jù)端口作控制,如圖9.28所示。
圖9.28??設(shè)置ROM寬度、深度及時鐘控制方式
(4)設(shè)置端口寄存器及清零信號。
這個步驟與RAM中的第(6)步類似,不再詳述,如圖9.29所示。
(5)設(shè)置ROM初始化值。
同樣可以參看RAM使用方法的第(7)步,如圖9.30所示。
圖9.29??設(shè)置端口寄存器及清零信號
圖9.30??設(shè)置ROM初始化值
(6)選擇生成ROM模塊文件。
設(shè)置完成所有的參數(shù),來到宏模塊向?qū)Ч芾砥鳎≧OM)的最后一頁??梢赃x擇生成的ROM模塊文件,同樣有6個文件可以生成,如圖9.31所示。
圖9.31??生成ROM模塊文件
ROM的調(diào)用方式與FIFO的類似,其構(gòu)建方式及模塊的聲明結(jié)構(gòu)可以參看ROM模塊的ROM_test.v和ROM_test_bb.v文件。
?
9.3.2??鎖相環(huán)的使用方法
鎖相環(huán)在數(shù)字系統(tǒng)中的應(yīng)用非常廣泛,在Altera的FPGA產(chǎn)品中集成的鎖相環(huán)是PLL模塊,在Xilinx的FPGA產(chǎn)品中集成的鎖相環(huán)是DLL模塊。兩者采用的技術(shù)不同,但是實現(xiàn)的基本功能大致相同,但也各有特點(diǎn)。
鎖相環(huán)的原理及在FPGA內(nèi)部的構(gòu)造這里將不做介紹,只以Altera的Cyclone?FPGA的PLL為例講解其使用方法。
Cyclone?PLL具有時鐘倍頻和分頻、相位偏移、可編程占空比和外部時鐘輸出,進(jìn)行系統(tǒng)級的時鐘管理和偏移控制。PLL常用于同步內(nèi)部器件時鐘和外部時鐘,使內(nèi)部工作的時鐘頻率比外部時鐘更高,時鐘延遲和時鐘偏移最小,減小或調(diào)整時鐘到輸出(TCO)和建立(TSU)時間。
(1)打開宏模塊向?qū)Ч芾砥鞑⑿陆ê昴K。
具體方法參見FIFO的方法。
(2)選擇宏模塊。
在本例中,我們選擇ALTPLL模塊進(jìn)行實現(xiàn),如圖9.32所示。
圖9.32??選擇宏模塊
?
(3)設(shè)置時鐘源,PLL類型及工作模式。
在宏模塊向?qū)Ч芾砥鳎≒LL)的第3頁,設(shè)計者可以設(shè)置一些PLL基本屬性,如器件族、速度級別及基準(zhǔn)頻率,還可以設(shè)置PLL的類型及工作模式。
值得注意的是,這里的基準(zhǔn)頻率并不一定是最終設(shè)計者向PLL輸入的時鐘。最終的PLL是通過比例值來對輸入頻率進(jìn)行綜合,所以PLL的關(guān)鍵參數(shù)是比例值,即圖9.33中PLL_test框圖中的Ratio值。
例如Ratio值為5/2(通過后面幾個步驟實現(xiàn)),而基準(zhǔn)頻率為40MHz,則PLL的c0輸出為100MHz。在調(diào)用這個PLL時,若設(shè)計者使用20MHz的頻率輸入,則輸出的頻率為50MHz,而不是100MHz。
另外,在這頁中,設(shè)計者還可以設(shè)置PLL的工作模式,如圖9.33所示。
圖9.33??設(shè)置時鐘源、PLL類型及工作模式
Cyclone?PLL支持3種(反饋)模式:標(biāo)準(zhǔn)、零延遲緩沖和無補(bǔ)償。和其他Altera器件系列不同,Cyclone?PLL不支持外部反饋模式。所有支持的3種時鐘反饋模式允許倍頻/分頻、相位偏移和可編程占空比。下面對每種模式進(jìn)行講解。
·??標(biāo)準(zhǔn)模式。
在標(biāo)準(zhǔn)模式下,PLL把參考時鐘和邏輯陣列或I/O單元的端口緩存器處的時鐘信號相位對齊,補(bǔ)償內(nèi)部全局時鐘網(wǎng)絡(luò)延遲。在ALTPLL宏模塊向?qū)Ч芾砥髦?,可以定義PLL的哪個內(nèi)部時鐘輸出(c0或c1)應(yīng)該補(bǔ)償。
如果在該模式中使用外部時鐘輸出(PLL[2..1]_OUT),則相對于時鐘輸入管腳有相位偏移。如果用內(nèi)部PLL時鐘輸出驅(qū)動通用I/O管腳,則相對應(yīng)的時鐘輸入管腳也有相位偏移。
·??零延遲緩沖模式。
PLL外部時鐘輸出管腳(PLL[2..1]_OUT)的時鐘信號和PLL輸入時鐘是相位對齊的,沒有延遲。如果用c[1..0]端口驅(qū)動內(nèi)部時鐘管腳,那么相對于輸入時鐘管腳有相位偏移。
·??無補(bǔ)償模式。
在該模式下,PLL不補(bǔ)償任何時鐘網(wǎng)絡(luò)。這樣會有更佳的抖動性能,因為反饋到PFD的時鐘不經(jīng)過某些電路。相對PLL時鐘輸入,PLL內(nèi)部和外部時鐘輸出都有相位偏移。
(4)設(shè)置可選輸入輸出。
在宏模塊向?qū)Ч芾砥鳎≒LL)的第4頁,可以選擇PLL模塊的可選輸出信號,如圖9.34所示。
Cyclone?PLL有4個控制信號pllena、areset、prdena和locked,進(jìn)行PLL管理。
?
·??pllena。
PLL啟動信號pllena用于啟動PLL。當(dāng)pllena為低時,PLL時鐘輸出端口為低,PLL失鎖。當(dāng)pllena再次變高時,PLL重新鎖定并重新同步輸入時鐘。因此,pllena是高有效信號。
因為在Cyclone?FPGA中沒有專用的pllena管腳,內(nèi)部邏輯或任意通用I/O管腳都可以驅(qū)動pllena端口。因為每個PLL都有自己的pllena控制電路或共享通用的pllena電路,這樣就很靈活。pllena信號是可選的,如果軟件中沒有啟動它,端口內(nèi)部就連接到VCC。
圖9.34??設(shè)置可選輸入
·??areset。
PLL?areset信號是每個PLL的復(fù)位或重新同步輸入。但驅(qū)動為高時,PLL計數(shù)器重置,清除PLL輸出,造成PLL失鎖,VCO復(fù)位后回到初始設(shè)置。當(dāng)areset再次變低,PLL重新開始鎖定,PLL重新和輸入時鐘同步。如果目標(biāo)VCO的頻率低于標(biāo)準(zhǔn)頻率,在鎖定過程中PLL時鐘輸出起始頻率值比所需值要高。areset是高有效信號。
Cyclone?FPGA可以從內(nèi)部邏輯或任意通用I/O管腳驅(qū)動這個PLL輸入信號。areset信號是可選的,如果在軟件中沒有使用它,該端口內(nèi)部連接到GND。
·??pfdena。
pfdena信號用可編程開關(guān)控制著PLL中PFD輸出。如果把a(bǔ)reset置低禁止PFD,那么VCO將以最后設(shè)置的控制電壓和頻率值工作,長時間會漂移到更低的頻率。即使每個輸入時鐘PLL時鐘輸出也會繼續(xù)觸發(fā),但是PLL可能會失鎖。
當(dāng)PLL失鎖或輸入時鐘禁止時,系統(tǒng)會繼續(xù)運(yùn)行。因為在一段時間內(nèi)最后鎖定輸出頻率不會改變,所以可以用pfdena端口作為關(guān)機(jī)或清除功能。為了維持這一頻率,系統(tǒng)在關(guān)機(jī)之前有時間儲存當(dāng)前的設(shè)置。如果pfdena信號再次變高,PLL重新鎖定和輸入時鐘重新同步。因此pfdena管腳是高有效信號。
可以用任意通用I/O管腳或內(nèi)部邏輯驅(qū)動pfdena輸入信號。該信號是可選的,如果在軟件沒有使用它,該端口內(nèi)部連接到VCC。
·??locked。
當(dāng)locked輸出是邏輯高電平,表明PLL時鐘輸出和PLL參考輸入時鐘穩(wěn)定同相。當(dāng)PLL開始跟蹤參考時鐘時,locked端口可能會觸發(fā),無需額外電路。
PLL的locked端口可以使用任意通用I/O管腳和內(nèi)部邏輯。這個locked信號是可選的,在監(jiān)視PLL鎖定過程中是非常有用的。
(5)設(shè)置c0輸出參數(shù)。
在宏模塊向?qū)Ч芾砥鳎≒LL)的第5頁,可以選擇PLL模塊c0輸出參數(shù),包括Ratio比值、相移量、占空比等,如圖9.35所示。
圖9.35??設(shè)置c0輸出參數(shù)
?
(6)設(shè)置c1輸出參數(shù)。
在宏模塊向?qū)Ч芾砥鳎≒LL)的第6頁,同樣可以選擇PLL模塊c1輸出參數(shù),包括Ratio比值、相移量、占空比等,如圖9.36所示。
圖9.36??設(shè)置c1輸出參數(shù)
?
(7)設(shè)置e0輸出參數(shù)。
在宏模塊向?qū)Ч芾砥鳎≒LL)的第7頁,可以選擇PLL模塊e0輸出參數(shù),包括Ratio比值、相移量、占空比等,如圖9.37所示。
圖9.37??設(shè)置e0輸出參數(shù)
(8)選擇生成PLL模塊文件。
在宏模塊向?qū)Ч芾砥鳎≒LL)的第8頁,完成PLL參數(shù)設(shè)置后,可以選擇生成的PLL模塊文件,共包含6個文件可以生成,如圖9.38所示。
圖9.38??選擇生成PLL模塊文件
PLL的調(diào)用方式與FIFO的類似,其構(gòu)建方式及模塊的聲明結(jié)構(gòu)可以參看PLL模塊的PLL_test.v和PLL_test_bb.v文件。
?
9.3.3??高速串行收發(fā)器的使用方法
1.SERDES簡介
隨著對信息流量需求的不斷增長,傳統(tǒng)并行接口技術(shù)成為進(jìn)一步提高數(shù)據(jù)傳輸速率的瓶頸。過去主要用于光纖通信的串行通信技術(shù)——SERDES正在取代傳統(tǒng)并行總線而成為高速接口技術(shù)的主流。
SERDES是英文SERializer(串行器)/DESerializer(解串器)的簡稱。它是一種時分多路復(fù)用(TDM)、點(diǎn)對點(diǎn)的通信技術(shù),即在發(fā)送端,多路低速并行信號被轉(zhuǎn)換成高速串行信號,經(jīng)過傳輸媒體(光纜或銅線),最后在接收端高速串行信號重新轉(zhuǎn)換成低速并行信號。這種點(diǎn)對點(diǎn)的串行通信技術(shù)充分利用傳輸媒體的信道容量,減少所需的傳輸信道和器件引腳數(shù)目,從而大大降低通信成本。
隨著半導(dǎo)體技術(shù)的迅速發(fā)展,計算機(jī)的性能和應(yīng)用取得了長足進(jìn)步??墒牵瑐鹘y(tǒng)并行總線技術(shù)PCI卻跟不上處理器和存儲器的進(jìn)步,而成為提高數(shù)據(jù)傳輸速率的瓶頸。新一代PCI標(biāo)準(zhǔn)PCI?Express正是為解決計算機(jī)I/O瓶頸而提出的。
PCI?Express是一種基于SERDES的串行雙向通信技術(shù),每個通道的數(shù)據(jù)傳輸速率為2.5Gbit/s,可多達(dá)32通道,支持芯片與芯片和背板與背板之間的通信。國際互聯(lián)網(wǎng)絡(luò)和信息技術(shù)的興起促成了計算機(jī)和通信技術(shù)的交匯,而SERDES串行通信技術(shù)逐步取代傳統(tǒng)并行總線正是這一交匯的具體體現(xiàn)。
2.SERDES系統(tǒng)結(jié)構(gòu)
基于SERDES的高速串行接口采用以下措施突破了傳統(tǒng)并行I/O接口的數(shù)據(jù)傳輸瓶頸:一是采用差分信號傳輸代替單端信號傳輸,從而增強(qiáng)了抗噪聲、抗干擾能力;二是采用時鐘和數(shù)據(jù)恢復(fù)技術(shù)代替同時傳輸數(shù)據(jù)和時鐘,從而解決了限制數(shù)據(jù)傳輸速率的信號時鐘偏移問題。
一個典型SERDES收發(fā)機(jī)由發(fā)送通道和接收通道組成,如圖9.39所示。編碼器、串行器、發(fā)送器以及時鐘產(chǎn)生電路組成發(fā)送通道,解碼器、解串器、接收器以及時鐘恢復(fù)電路組成接收通道。顧名思義,編碼器和解碼器完成編碼和解碼功能,其中8B/10B、64B/66B和不規(guī)則編碼(scrambling)是最常用的編碼方案。
圖9.39??典型SERDES收發(fā)機(jī)結(jié)構(gòu)圖
串行器和解串器負(fù)責(zé)從并行到串行和從串行到并行的轉(zhuǎn)換。串行器需要時鐘產(chǎn)生電路,時鐘發(fā)生電路通常由鎖相環(huán)(PLL)來實現(xiàn)。解串器需要時鐘和數(shù)據(jù)恢復(fù)電路(CDR),時鐘恢復(fù)電路通常也由鎖相環(huán)來實現(xiàn),但有多種實現(xiàn)形式如相位插值、過剩抽樣等。
發(fā)送器和接收器完成差分信號的發(fā)送和接收,其中LVDS和CML是最常用的兩種差分信號標(biāo)準(zhǔn)。另外還有一些輔助電路也是必不可少的,例如環(huán)路(loopback)測試、內(nèi)置誤碼率測試等。
3.SERDES實現(xiàn)方式
SERDES在系統(tǒng)中的實現(xiàn)雖然概念上比較簡單,但是硬件實現(xiàn)要求很多細(xì)節(jié)正確無誤,如信號端接、參考時鐘的生成、鎖相環(huán)(PLL)的使用、背板信號完整性和位錯誤率的評估等。
下面以Altera的Stratix?GX?FPGA為例介紹其中的內(nèi)嵌的數(shù)千兆位收發(fā)器功能塊。
Stratix?GX器件將高速3.125Gbit/s收發(fā)器串行/解串行(SERDES)技術(shù)和業(yè)界最先進(jìn)的FPGA架構(gòu)相結(jié)合。在FPGA中嵌入的數(shù)千兆位收發(fā)器功能塊,能夠在需要靈活性、高性能和最先進(jìn)功能的許多新系統(tǒng)中使用收發(fā)器。
?
下面是這個數(shù)千兆位收發(fā)器功能塊的主要特點(diǎn)。
·??支持從622MHz~3.125GHz的所有頻率。
·??每個塊有4個獨(dú)立的3.125Gbit/s全雙工通道,每個器件多達(dá)20個通道(5個塊)。
·??支持3.1875Gbit/s的10Gbit光纖通道。
·??集成時鐘數(shù)據(jù)恢復(fù)(CDR)、模式檢測、字對齊、8b/10b編解碼器和同步功能。
·??功耗很低,每4通道只有450mW(包括數(shù)千兆收發(fā)器功能塊的功耗)。
·??支持動態(tài)可編程:預(yù)加重、均衡和I/O緩沖上的差分輸出電壓。
·??支持SerialLite協(xié)議,這是一個精簡的點(diǎn)對點(diǎn)協(xié)議。
·??對中等性能信號的差分片內(nèi)匹配。
·??完全實現(xiàn)10Gbit以太網(wǎng)物理介質(zhì)接入層(PMA)和物理編碼子層(PCS)功能。
·??支持靈活的時鐘拓?fù)?,每個收發(fā)器模塊中有一個發(fā)送器PLL和四個接收器PLL。
·??采用1.5V、0.13mm全銅CMOS工藝技術(shù)制造,支持1.5V?PCML?I/O標(biāo)準(zhǔn)。
·??包括獨(dú)立的發(fā)送器和接收器節(jié)電功能,在不工作過程中減小功耗。
·??內(nèi)嵌自檢(BIST)功能,包括嵌入偽隨機(jī)二進(jìn)制序列(PRBS)圖案生成和驗證。
·??有4個獨(dú)立的環(huán)回路徑用于系統(tǒng)驗證。
可以看到,Stratix?GX的這個收發(fā)器功能非常強(qiáng)大,遠(yuǎn)遠(yuǎn)超出了圖9.39所示的SERDES基本結(jié)構(gòu)圖的功能。圖9.40是它的原理框圖,需要說明的是,設(shè)計者在使用這個模塊時并不一定完全實現(xiàn)其中的每一個模塊,可以根據(jù)需要只實現(xiàn)其中的部分內(nèi)容。
圖9.40??Stratix?GX收發(fā)機(jī)
?
下面介紹其中的一些模塊。
(1)差分緩沖。
數(shù)千兆位收發(fā)器功能塊差分I/O緩沖支持1.5V?PCML?I/O標(biāo)準(zhǔn),有許多改善系統(tǒng)信號完整性的特性。例如,動態(tài)可重配置預(yù)加重和均衡功能,調(diào)整信號以補(bǔ)償信號經(jīng)過傳送介質(zhì)的衰減。不同的可編程VOD設(shè)置確保了驅(qū)動強(qiáng)度匹配傳輸線電阻和線長。另外,差分片內(nèi)匹配為中等性能信號提供了合適的接收器和發(fā)送器緩沖匹配。
(2)可編程發(fā)送預(yù)加重模塊。
發(fā)送預(yù)加重塊使收發(fā)器(SERDES)可以驅(qū)動更長的背板或超過1GHz頻率下的電纜。在這些頻率下,通道損耗是很高的,衰減是很明顯的,因為眼圖的關(guān)閉無法讓發(fā)送的信號繼續(xù)傳送。預(yù)加重信號提升信號的高頻部分,補(bǔ)償傳輸線的衰減。使用可編程的預(yù)加重設(shè)置,能夠為給定的傳輸線選擇最優(yōu)的水平(或者在軟件設(shè)定,或者通過內(nèi)部或外部信號動態(tài)選擇),讓信號眼圖在遠(yuǎn)端張得最開。
(3)可編程接收均衡器模塊。
接收均衡器塊使得收發(fā)器(SERDES)驅(qū)動更長的背板或超過1GHz的電纜。當(dāng)信號經(jīng)過接收器均衡器塊時,同樣可以提升信號的高頻部分能量,補(bǔ)償傳輸線的高頻衰減指標(biāo)??删幊叹馑娇梢愿鶕?jù)傳輸線進(jìn)行優(yōu)化(或者在軟件設(shè)定或者通過內(nèi)部或外部信號動態(tài)選擇),讓信號眼圖在CDR單元輸入端張得最開。
(4)發(fā)送器和接收器PLL。
每個數(shù)千兆位收發(fā)器功能塊有一個專用發(fā)送器PLL和四個專用接收器PLL,提供靈活的時鐘拓?fù)洌С忠幌盗械妮斎霐?shù)據(jù)流。對于輸出傳送和接收,這些PLL根據(jù)更低速的輸入?yún)⒖紩r鐘生成所需的時鐘頻率。每個PLL支持4、8、10、16或20的倍增因子。每個外部參考時鐘或Stratix?GX內(nèi)的各種時鐘源都可以驅(qū)動PLL。
(5)時鐘恢復(fù)單元。
CDR從輸入串行數(shù)據(jù)流中提取時鐘?;謴?fù)的時鐘用于采樣串行數(shù)據(jù)流、同步控制解串行器。
(6)串行/解串模塊。
SERDES模塊將輸入的高速串行數(shù)據(jù)轉(zhuǎn)換為更低速度的并行接口,反之亦然。SERDES模塊可以配置為8、10、16或20位并行接口。
(7)模式檢測器模塊。
模式檢測器模塊識別輸入數(shù)據(jù)流中的特殊模式。模式檢測器包括一個內(nèi)建的8b/10b的K28間隔符號檢測和SONET的A1A2模式檢測。在定制模式下,設(shè)計者可以創(chuàng)建專用模式。
(8)字對齊模塊。
字對齊模塊和模式檢測器共同識別和調(diào)整正確的字節(jié)邊界。此外,字對齊有一個定制模式,能夠從FPGA內(nèi)核邏輯人工地控制字節(jié)對齊。
(9)速率匹配器模塊。
在串行數(shù)據(jù)傳輸中,發(fā)送和接收器件的時鐘頻率通常是不匹配的。這種不匹配會引起數(shù)據(jù)以略快或慢于接收器件能解釋的速度傳送。Stratix?GX速率匹配器從數(shù)據(jù)流中插入或刪除如傳送協(xié)議中定義的可移除的符號,解決了恢復(fù)時鐘和PLD邏輯陣列時鐘的頻差,而不會丟失傳送的數(shù)據(jù)。Stratix?GX數(shù)據(jù)匹配器為使用8b/10b編碼數(shù)據(jù)的系統(tǒng)進(jìn)行了優(yōu)化。
(10)信道對齊器。
信道對齊器消除了實現(xiàn)4個收發(fā)器XAUI協(xié)議相關(guān)的信道至信道的偏移。信道對齊器消除4信道的偏移,為內(nèi)核邏輯建立了可靠的以太網(wǎng)XGMII接口。
(11)8b/10b編解碼器。
8b/10b編解碼器模塊將8比特的數(shù)據(jù)轉(zhuǎn)換為10比特的數(shù)據(jù),反之亦然。該算法平衡了串行數(shù)據(jù)流中“0”和“1”的數(shù)量,增加了變換密度,因此更易于接收器恢復(fù)串行數(shù)據(jù)。
(12)同步器。
同步器補(bǔ)償了并行收發(fā)器接口和FPGA內(nèi)核邏輯之間的相位差。
(13)內(nèi)建自測。
BIST為收發(fā)器提供了一組強(qiáng)大的診斷能力。它包括偽隨機(jī)二進(jìn)制序列(PRBS)和其他圖案的生成器和檢查器。BIST也提供了4個環(huán)回配置用于系統(tǒng)診斷。