• fpga pll重配置实验总结


    今天做了pll重配置的实验,输入时钟50m初始配置输出75m经重配置后输出100m,带宽为low,使用的ip:rom,altpll_reconfig ,altpll,将altpll配置为可重配置模式,altpll_reconfig配置为从rom读取,rom配置为1位宽,深度256,千万要注意,用rom的话一定要对q输出锁存,原因如下:

    因为rom_data_in要求的是在write_rom_ena信号有效后的两个时钟周期后有效,那就是说中间需要两个周期才会有数据输出,如果把q输出锁存去掉的话那么中间就有一个时钟周期了,所以会有问题,导致pll无法正常工作,我就是因为习惯了rom的输出不锁存,因为这样可以减少一个时钟周期等待时间,但是这个情况下就错了,必须要锁存一个周期。

    rom的初始化mif文件如下:


    WIDTH=1;

    DEPTH=144;

    ADDRESS_RADIX=UNS;

    DATA_RADIX=UNS;

    CONTENT BEGIN

    0 : 0; -- Reserved Bits = 0 (1 bit(s))

    1 : 0; -- Reserved Bits = 0 (1 bit(s))

    2 : 0; -- Loop Filter Capacitance = 0 (2 bit(s)) (Setting 0)

    3 : 0;

    4 : 0; -- Loop Filter Resistance = 8 (5 bit(s)) (Setting 8)

    5 : 1;

    6 : 0;

    7 : 0;

    8 : 0;

    9 : 0; -- VCO Post Scale = 0 (1 bit(s)) (VCO post-scale divider counter value = 2)

    10 : 0; -- Reserved Bits = 0 (5 bit(s))

    11 : 0;

    12 : 0;

    13 : 0;

    14 : 0;

    15 : 0; -- Charge Pump Current = 1 (3 bit(s)) (Setting 1)

    16 : 0;

    17 : 1;

    18 : 0; -- N counter: Bypass = 0 (1 bit(s))

    19 : 0; -- N counter: High Count = 0 (8 bit(s))

    20 : 0;

    21 : 0;

    22 : 0;

    23 : 0;

    24 : 1;

    25 : 0;

    26 : 1;

    27 : 1; -- N counter: Odd Division = 1 (1 bit(s))

    28 : 0; -- N counter: Low Count = 0 (8 bit(s))

    29 : 0;

    30 : 0;

    31 : 0;

    32 : 0;

    33 : 1;

    34 : 0;

    35 : 0;

    36 : 0; -- M counter: Bypass = 0 (1 bit(s))

    37 : 0; -- M counter: High Count = 54 (8 bit(s))

    38 : 0;

    39 : 1;

    40 : 1;

    41 : 0;

    42 : 1;

    43 : 1;

    44 : 0;

    45 : 0; -- M counter: Odd Division = 0 (1 bit(s))

    46 : 0; -- M counter: Low Count = 54 (8 bit(s))

    47 : 0;

    48 : 1;

    49 : 1;

    50 : 0;

    51 : 1;

    52 : 1;

    53 : 0;

    54 : 0; -- clk0 counter: Bypass = 1 (1 bit(s))

    55 : 0; -- clk0 counter: High Count = 3 (8 bit(s))

    56 : 0;

    57 : 0;

    58 : 0;

    59 : 0;

    60 : 0;

    61 : 1;

    62 : 1;

    63 : 0; -- clk0 counter: Odd Division = 0 (1 bit(s))

    64 : 0; -- clk0 counter: Low Count = 3 (8 bit(s))

    65 : 0;

    66 : 0;

    67 : 0;

    68 : 0;

    69 : 0;

    70 : 1;

    71 : 1;

    72 : 1; -- clk1 counter: Bypass = 0 (1 bit(s))

    73 : 0; -- clk1 counter: High Count = 0 (8 bit(s))

    74 : 0;

    75 : 0;

    76 : 0;

    77 : 0;

    78 : 0;

    79 : 0;

    80 : 0;

    81 : 0; -- clk1 counter: Odd Division = 0 (1 bit(s))

    82 : 0; -- clk1 counter: Low Count = 0 (8 bit(s))

    83 : 0;

    84 : 0;

    85 : 0;

    86 : 0;

    87 : 0;

    88 : 0;

    89 : 0;

    90 : 1; -- clk2 counter: Bypass = 1 (1 bit(s))

    91 : 0; -- clk2 counter: High Count = 0 (8 bit(s))

    92 : 0;

    93 : 0;

    94 : 0;

    95 : 0;

    96 : 0;

    97 : 0;

    98 : 0;

    99 : 0; -- clk2 counter: Odd Division = 0 (1 bit(s))

    100 : 0; -- clk2 counter: Low Count = 0 (8 bit(s))

    101 : 0;

    102 : 0;

    103 : 0;

    104 : 0;

    105 : 0;

    106 : 0;

    107 : 0;

    108 : 1; -- clk3 counter: Bypass = 1 (1 bit(s))

    109 : 0; -- clk3 counter: High Count = 0 (8 bit(s))

    110 : 0;

    111 : 0;

    112 : 0;

    113 : 0;

    114 : 0;

    115 : 0;

    116 : 0;

    117 : 0; -- clk3 counter: Odd Division = 0 (1 bit(s))

    118 : 0; -- clk3 counter: Low Count = 0 (8 bit(s))

    119 : 0;

    120 : 0;

    121 : 0;

    122 : 0;

    123 : 0;

    124 : 0;

    125 : 0;

    126 : 1; -- clk4 counter: Bypass = 1 (1 bit(s))

    127 : 0; -- clk4 counter: High Count = 0 (8 bit(s))

    128 : 0;

    129 : 0;

    130 : 0;

    131 : 0;

    132 : 0;

    133 : 0;

    134 : 0;

    135 : 0; -- clk4 counter: Odd Division = 0 (1 bit(s))

    136 : 0; -- clk4 counter: Low Count = 0 (8 bit(s))

    137 : 0;

    138 : 0;

    139 : 0;

    140 : 0;

    141 : 0;

    142 : 0;

    143 : 0;

    END;

    前面是关于电荷泵和环路滤波器的参数的,我用的fpga只支持低中高三个默认的选项,其他配置不支持,我选择的是低带宽对应的值,低带宽时钟锁定时间长,但是相位抖动小,高带宽时钟锁定时间短,但是相位抖动大,中带宽是二者的平衡。之后是 n,m,c0c1,c2,c3,c4的配置,这几个计数器的配置中有几个注意点:1,rbypass位,决定了此计数器是否有效,设为1的时候将旁路此计数器,0则使用此计数器的值,2,rseodd位,如果为1,那么需要从高脉冲减去0.5个周期,相应的,低脉冲加上0.5个周期。3,计数器除rbypass外的高8位决定了高电平的周期,除rseodd外的低8位决定了低电平的周期,二者之和决定了分频数,如高8位为3,低8位为3,那么代表的意思是6分频,高电平三个周期,低电平三个周期。

    附图:pll原理图

    整个系统的结构如下图所示,这样看更直观(只是为了看起来更直观,我不是这样做的,写的verilog代码)

    在整个配置过程中,其他连线按所示连接好,只需要对write_from_rom和reconfig两个信号操作就可以了,write_from_rom一个高电平后拉低,检测到busy为0后reconfig拉高一个高电平之后拉低,配置完成后 scandone为高电平。

  • 相关阅读:
    阿里云安装Mono 发生错误解决方法
    在Entity Framework 中执行Tsql语句
    WinRT app guide
    开源稳定的消息队列 RabbitMQ
    Catpic: OpenSocial Container on .NET
    MSDTC 故障排除
    HTML5 canvas图形库RGraph
    《我的WCF之旅》博文系列汇总
    TSQL Enhancement in SQL Server 2005[下篇]
    谈谈基于SQL Server 的Exception Handling[上篇]
  • 原文地址:https://www.cnblogs.com/lianjiehere/p/4234153.html
Copyright © 2020-2023  润新知