解决方案ID: rd10152009_939
最后修改: 2011 年12 月07 日
产品类别: IP
产品领域: 通讯,接口及外设
产品子领域: 内核实现
软件: Quartus II PC
器件系列: STRATIX IV GX
IP产品: POSPHY Level 4 (SPI 4.2)
标题
在使用Stratix IV GX ES器件时,SPI4.2的TX和RX可以共享PLL吗?
说明
是的,SPI4.2 是可以在Stratix® IV GX 器件中共享PLL. SPI4.2 在Stratix® IV GX ES 器件中共享发送和接收的PLL比其它器件会复杂点。
Stratix IV GX ES 器件中的SPI 4.2 core ALTLVDS并不支持内部的发送和接收PLL共享。在选择合适相位时的DPA misallignment会比预期的明显花更多的时间。即使DPA锁定后,这也将会导致不理想的相位和引起数据bit错误。复位DPA电路也会引起这个问题。
为了使能PLL共享,请按照下面的步骤设置:
1. 选择ALTLVDS的“Use External PLL”参数设置
2. 在Frequency/PLL 设置中,去掉"Use shared PLL(s) for receivers and transmitters"设置
3. 在ALTLVDS 的第三个DPA设置中选择"Enable PLL calibration" 设置
4. 执行Megawizard™ plug 并创建一个ALTPLL Megafunction。根据系统设置,应用正确的器件速度等级和时钟输入频率。选择Left_Right PLL。
4-1. 在PLL Reconfiguration 的Dynamic phase configuration下面,选择Create optional inputs for dynamic phase reconfiguration"。
4-2. 在Output Clocks 栏- clk c0,输入输出时钟频率(the fast clock running at LVDS data rate)。这个时钟将驱动rx_inclock 和tx_inclock。设置phase shift = -180 degrees with respect to VCO clock。设置Duty Cycle to 50%。选择"use these clock settings for the DPA clock"。
4-3. Set Duty Cycle to (100 / deserialization factor)在输出栏- clk c1,输入时钟频率(fast clock / deserialization factor)。输入时钟输出驱动tx_enable 和 rx_enable。设置phase shift 到 [(deserialization factor - 2) / deserialization factor] * 360 度。
4-4. 在时钟输出栏- clk c2, 输入输出时钟频率(fast clock / deserialization factor)。驱动这个时钟输出到rx_syncclock。 选择phase shift to (-180 degress / deserialization factor). 设置Duty cycle to 50%
Figure 1 PLL 到 LVDS 时钟图
5. 修改the SPI4.2 Rx core
5-1. 在 <SPI4 variation name>_rx_core.v, 使用下面的方法替换实例 <SPI4 variation name>_rx_data_phy_altlvds :
<SPI4 variation name>_rx_data_phy_altlvds rx_data_phy_altlvds (
.pll_areset(pll_areset),
.pll_phasedone(phasedone),
.rx_cda_reset({lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset}),
.rx_channel_data_align(bitslip),
.rx_enable(rx_enable),
.rx_fifo_reset({lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset}),
.rx_in(rx_in),
.rx_inclock(rx_inclock),
.rx_reset({lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset, lvds_reset}), // input [16:0],
.rx_syncclock(rx_syncclock),
.dpa_pll_cal_busy(dpa_pll_cal_busy),
.pll_phasecounterselect(phasecounterselect),
.pll_phasestep(phasestep),
.pll_phaseupdown(phaseupdown),
.pll_scanclk(scanclk),
.rx_dpa_locked(stat_rd_dpa_lvds_locked),
.rx_out(rx_out_serdes) );
5-2. In <SPI4 variation name >.v ( SPI4.2 Rx core wrapper), include the following instantiation:
<SPI4 variation name>_pl4_rx_core <SPI4 variation name>_pl4_rx_core_inst (
...
.rx_inclock(rx_inclock),
.rx_enable(rx_enable),
.rx_syncclock(rx_syncclock),
.dpa_pll_cal_busy(dpa_pll_cal_busy),
.phasecounterselect(phasecounterselect),
.phasestep(phasestep),
.phaseupdown(phaseupdown),
.scanclk(scanclk),
.phasedone(phasedone),
...);
6. 修改SPI4.2 Tx core :
6-1. 在 <SPI4 variation name>_tx_core.v, 按照下面的方法替换实例化 <SPI4 variation name>_tx_data_phy_altlvds :
<SPI4.2 variation name>_tx_data_phy_altlvds tx_data_phy_altlvds (
.tx_enable(tx_enable), //input
.tx_in(tx_in_i), //input
.tx_inclock(tx_inclock),//input
.tx_coreclk(tx_coreclk),
.tx_out(tx_out), //output
.tx_outclock(tx_outclock) //output );
6-2. 在 <SPI4 variation name >.v ( SPI4.2 Tx core wrapper), 包含下面的实例化 :
<SPI4.2 variation name>_pl4_tx_core <SPI4.2 variation name>_pl4_tx_core_inst (
...
.trefclk(trefclk),
.tx_enable(tx_enable),
.tx_coreclk(tx_coreclk),
... );
7. SPI4.2 接收 ALTLVDS rx_out 总线输出需要被 rx_outclock寄存一下
8. SPI4.2 发送ALTLVDS tx_in 总线需要被tx_coreclock寄存一下
9. 将shared PLL lock 输出 转接到ALTLVDS Megafunction的pll_areset 端口
反馈
Altera并不保证此解决方案能够达到客户的预期目的,并不承担所有的解决方案的使用和信赖的责任。
