«

zynq pl端调用PLL

学长 发布于 阅读:719 ZYNQ 7020


虽然-2 speed的zynqPS端在手册中写着速度能到1600MHz到2000MHz之间

但是PL端只能到800MHz

再高得上pluto之类的SDR了?


先建项目名字随意

直接去IP catalog

找到FPGA Features and Design - Clocking Wizard

只需要改clk_in1为50

output clocks中我只想要个400M,最高能给到800,最低4.687

频率越高占空比可调范围越小(越接近50%)

下面就写verilog把pll调用起来


//我的板子是默认高电平所以自定义的rst_n(用key做,不是板子上的rst,因为板子的整个就重置了)

//sys_clk是pl端50MHz的输入这个根据你的开发版资料

//输出的 clk_out就是需要的400MHz时钟输出

//led_400是用PLL的400MHz输出做计数器到1秒,led_50是用pl的输入时钟来计数到1秒,对通过肉眼看锁定效果。。。

//locked显示pll是否锁定因为我的是默认高电平亮的时候才是没锁住,一般只有rst的时候才会亮

//锁定用时模拟出来时半个us左右肉眼根本看不出来

module clk_tb(
    input sys_clk,rst_n,
    output clk_out,led_400,led_50,locked
    );

    wire clkbuf;


//BUFG for UltraScale

//具体为什么加。。。因为别人加了。。。或许为了时钟输入波形更完美?
    BUFG BUFG_inst(
    .O(clkbuf),
    .I(sys_clk)
    );
//调用生成的PLL
    clk_wiz_0 pll(
    .clk_out1(clk_out),
    .reset(~rst_n),
    .locked(locked),
    .clk_in1(clkbuf)
    );
//sys_clk led_50MHz 1s cnt
    reg [27:0] cnt_50;
    reg led_50;
    always@(posedge sys_clk,negedge locked)
    begin
        if(!locked) begin
            cnt_50<=28'd0;
            led_50<=1'b0;
        end
        else begin
            cnt_50<=cnt_50+1'b1;
            if(cnt_50==28'd49_999_999)begin//for sim just run 125-1, 49_999_999
                cnt_50<=28'd0;
                led_50<=~led_50;
            end
        end
    end
//400MHz Led 1s cnt
    reg [28:0] cnt_400;
    reg led_400;
    always@(posedge clk_out,negedge locked)
    begin
        if(!locked) begin
            cnt_400<=29'd0;
            led_400<=1'b0;
        end
        else begin
            cnt_400<=cnt_400+1'b1;
            if(cnt_400==29'd399_999_999)begin//for sim just run 1000-1, 399_999_999
                cnt_400<=29'd0;
                led_400<=~led_400;
            end
        end
    end
endmodule


参考:

https://xilinx.eetrend.com/content/2020/100060097.html


扫描二维码,在手机上阅读