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