PLL原語例化使用時(shí)常見問題
一、前言
????在設(shè)計(jì)中經(jīng)常會(huì)使用PLL的原語進(jìn)行例化使用,PLL如果直接例化使用將會(huì)報(bào)錯(cuò),以PLLE2_ADV為例,vivado版本為2019.1,器件為xc7k480tffv1156,例化的模版如下,下面4個(gè)標(biāo)紅的系數(shù)需重點(diǎn)關(guān)注。
? PLLE2_ADV #(
? ? ? .BANDWIDTH("OPTIMIZED"),? // OPTIMIZED, HIGH, LOW
? ? ? .CLKFBOUT_MULT(5),? ? ? ? // Multiply value for all CLKOUT, (2-64)將輸出先進(jìn)行指定倍數(shù)的倍頻處理
? ? ? .CLKFBOUT_PHASE(0.0),? ? ?// Phase offset in degrees of CLKFB, (-360.000-360.000).
? ? ? // CLKIN_PERIOD: Input clock period in nS to ps resolution (i.e. 33.333 is 30 MHz).
? ? ? .CLKIN1_PERIOD(0.0),
? ? ? .CLKIN2_PERIOD(0.0),
? ? ? // CLKOUT0_DIVIDE - CLKOUT5_DIVIDE: Divide amount for CLKOUT (1-128)? 設(shè)置輸出時(shí)鐘的分頻系數(shù)
? ? ? .CLKOUT0_DIVIDE(1),
? ? ? .CLKOUT1_DIVIDE(1),
? ? ? .CLKOUT2_DIVIDE(1),
? ? ? .CLKOUT3_DIVIDE(1),
? ? ? .CLKOUT4_DIVIDE(1),
? ? ? .CLKOUT5_DIVIDE(1),
? ? ? // CLKOUT0_DUTY_CYCLE - CLKOUT5_DUTY_CYCLE: Duty cycle for CLKOUT outputs (0.001-0.999).設(shè)置輸出時(shí)鐘的占空比
? ? ? .CLKOUT0_DUTY_CYCLE(0.5),
? ? ? .CLKOUT1_DUTY_CYCLE(0.5),
? ? ? .CLKOUT2_DUTY_CYCLE(0.5),
? ? ? .CLKOUT3_DUTY_CYCLE(0.5),
? ? ? .CLKOUT4_DUTY_CYCLE(0.5),
? ? ? .CLKOUT5_DUTY_CYCLE(0.5),
? ? ? // CLKOUT0_PHASE - CLKOUT5_PHASE: Phase offset for CLKOUT outputs (-360.000-360.000).設(shè)置輸出時(shí)鐘的相移值
? ? ? .CLKOUT0_PHASE(0.0),
? ? ? .CLKOUT1_PHASE(0.0),
? ? ? .CLKOUT2_PHASE(0.0),
? ? ? .CLKOUT3_PHASE(0.0),
? ? ? .CLKOUT4_PHASE(0.0),
? ? ? .CLKOUT5_PHASE(0.0),
? ? ? .COMPENSATION("ZHOLD"),? ?// ZHOLD, BUF_IN, EXTERNAL, INTERNAL
? ? ? .DIVCLK_DIVIDE(1),? ? ? ? // Master division value (1-56)
? ? ? // REF_JITTER: Reference input jitter in UI (0.000-0.999).
? ? ? .REF_JITTER1(0.0),
? ? ? .REF_JITTER2(0.0),
? ? ? .STARTUP_WAIT("FALSE")? ? // Delay DONE until PLL Locks, ("TRUE"/"FALSE")
? ?)
? ?PLLE2_ADV_inst (
? ? ? // Clock Outputs: 1-bit (each) output: User configurable clock outputs
? ? ? .CLKOUT0(CLKOUT0),? ?// 1-bit output: CLKOUT0
? ? ? .CLKOUT1(CLKOUT1),? ?// 1-bit output: CLKOUT1
? ? ? .CLKOUT2(CLKOUT2),? ?// 1-bit output: CLKOUT2
? ? ? .CLKOUT3(CLKOUT3),? ?// 1-bit output: CLKOUT3
? ? ? .CLKOUT4(CLKOUT4),? ?// 1-bit output: CLKOUT4
? ? ? .CLKOUT5(CLKOUT5),? ?// 1-bit output: CLKOUT5
? ? ? // DRP Ports: 16-bit (each) output: Dynamic reconfiguration ports
? ? ? .DO(DO),? ? ? ? ? ? ?// 16-bit output: DRP data
? ? ? .DRDY(DRDY),? ? ? ? ?// 1-bit output: DRP ready
? ? ? // Feedback Clocks: 1-bit (each) output: Clock feedback ports
? ? ? .CLKFBOUT(CLKFBOUT), // 1-bit output: Feedback clock
? ? ? .LOCKED(LOCKED),? ? ?// 1-bit output: LOCK
? ? ? // Clock Inputs: 1-bit (each) input: Clock inputs
? ? ? .CLKIN1(CLKIN1),? ? ?// 1-bit input: Primary clock
? ? ? .CLKIN2(CLKIN2),? ? ?// 1-bit input: Secondary clock
? ? ? // Control Ports: 1-bit (each) input: PLL control ports
? ? ? .CLKINSEL(CLKINSEL), // 1-bit input: Clock select, High=CLKIN1 Low=CLKIN2
? ? ? .PWRDWN(PWRDWN),? ? ?// 1-bit input: Power-down
? ? ? .RST(RST),? ? ? ? ? ?// 1-bit input: Reset
? ? ? // DRP Ports: 7-bit (each) input: Dynamic reconfiguration ports
? ? ? .DADDR(DADDR),? ? ? ?// 7-bit input: DRP address
? ? ? .DCLK(DCLK),? ? ? ? ?// 1-bit input: DRP clock
? ? ? .DEN(DEN),? ? ? ? ? ?// 1-bit input: DRP enable
? ? ? .DI(DI),? ? ? ? ? ? ?// 16-bit input: DRP data
? ? ? .DWE(DWE),? ? ? ? ? ?// 1-bit input: DRP write enable
? ? ? // Feedback Clocks: 1-bit (each) input: Clock feedback ports
? ? ? .CLKFBIN(CLKFBIN)? ? // 1-bit input: Feedback clock
? ?);
二、常見問題
工程設(shè)計(jì)代碼,主要關(guān)注前面?PLLE2_ADV例化使用的參數(shù)配置。
問題一、綜合階段報(bào)錯(cuò)[Synth 8-439]
現(xiàn)象:具體報(bào)錯(cuò)內(nèi)容如下
[Synth 8-439] module 'PLLE2_BASE1' not found ["C:/Users/Administrator/Desktop/verilog_test/project_4/experiment15/sdram_demo3/sdram_demo3.v":52]

原因:報(bào)錯(cuò)信息中提示很明顯,即使用了不存在的原語PLLE2_BASE1
解決:使用器件支持的原語進(jìn)行例化
問題二、綜合階段報(bào)錯(cuò)[Synth 8-448]?
現(xiàn)象:具體報(bào)錯(cuò)內(nèi)容如下
[Synth 8-448] named port connection 'CLKIN1' does not exist for instance 'U1' of module 'PLLE3_ADV' ["C:/Users/Administrator/Desktop/verilog_test/project_4/experiment15/sdram_demo3/sdram_demo3.v":55]

原因:第一條報(bào)錯(cuò)已經(jīng)很明了,即使用的PLLE3_ADV中CLKIN1端口在該原語中不存在,即例化使用的原語為其他器件支持的,當(dāng)前器件不支持
第二條報(bào)錯(cuò)[Synth 8-6156] failed synthesizing module 'sdc_constraint' ["C:/Users/Administrator/Desktop/verilog_test/project_4/experiment15/sdram_demo3/sdram_demo3.v":1]是因?yàn)樵诩s束文件sdc_constraint中對(duì)CLKIN1對(duì)應(yīng)的端口進(jìn)行了約束
約束內(nèi)容如下
create_clock -period 10.000 -name clkin_pll -waveform {1.000 5.000} [get_ports CLK]
解決:首先在language templates中對(duì)應(yīng)系列器件下是否支持PLLE3_ADV,如果不支持,將PLLE3_ADV修改為器件支持的原語,二是確認(rèn)PLLE3_ADV的端口是否存在CLKIN1端口。經(jīng)過確認(rèn),此處為PLLE3_ADV在當(dāng)前xc7k480tffv中不支持,支持的為PLLE2_ADV,將PLLE3_ADV修改為PLLE2_ADV,使用對(duì)應(yīng)的端口即可
問題三、在實(shí)現(xiàn)階段DRC報(bào)錯(cuò)DRC PDRC-38
現(xiàn)象:具體報(bào)錯(cuò)內(nèi)容如下:
[DRC PDRC-38] PLL_adv_ClkFrequency_clkin1: The calculated frequency value, 0.000 MHz, of the CLKIN1_PERIOD attribute on the PLLE2_ADV site PLLE2_ADV_X0Y0 (cell U1) is outside the allowed range (19.000 - 800.000 MHz). Please change the CLKIN1_PERIOD attribute value in order to be within the allowed range for this device.

原因:未對(duì)輸入端口clkin1設(shè)置時(shí)鐘約束,因此默認(rèn)為0MHZ
解決:對(duì)設(shè)計(jì)的輸入端口CLK設(shè)置時(shí)鐘約束
問題四、在實(shí)現(xiàn)階段DRC報(bào)錯(cuò)DRC PDRC-43
具體報(bào)錯(cuò)內(nèi)容如下
[DRC PDRC-43] PLL_adv_ClkFrequency_div_no_dclk: The computed value 500.000 MHz (CLKIN1_PERIOD, net CLK_IBUF) for the VCO operating frequency of the PLLE2_ADV site PLLE2_ADV_X0Y0 (cell U1) falls outside the operating range of the PLL VCO frequency for this device (800.000 - 1600.000 MHz). The computed value is (CLKFBOUT_MULT_F * 1000 / (CLKINx_PERIOD * DIVCLK_DIVIDE)). Please adjust either the input period CLKINx_PERIOD (10.000000), multiplication factor CLKFBOUT_MULT_F (5) or the division factor DIVCLK_DIVIDE (1), in order to achieve a VCO frequency within the rated operating range for this device.

原因:約束中設(shè)置的PLL的輸入時(shí)鐘頻率與倍頻系數(shù)的乘積【Hclk*CLKFBOUT_MULT】不在【800MHZ-1600MHZ】間,約束文件中CLK周期為10ns,則頻率為100MHZ,PLL例化的原語中系數(shù)CLKFBOUT_MULT(5)默認(rèn)為5,因此計(jì)算出的值為500MHZ,不在要求的范圍內(nèi),因此報(bào)錯(cuò)。
約束內(nèi)容:create_clock -period 10.000 -name clkin_pll -waveform {1.000 5.000} [get_ports CLK]
解決:
方法1:修改約束中CLK的周期,使其與系數(shù)CLKFBOUT_MULT的值5相乘后在【800-1600MHZ】間
方法2:修改系數(shù)CLKFBOUT_MULT的值,可將其設(shè)置為【5-16】之間的值,此處改為10,也即CLKOUT為1000MHZ