Zynq PL端调用PS端的时钟

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zynq PL端调用PS端的时钟相关的知识,希望对你有一定的参考价值。

ZYNQ PS端最多可以分配4个时钟供给PL端使用,见下图。

Zynq

本文的目的:在XCZU21DR环境下,PS给PL提供一个100MHz的时钟,PL端根据此时钟产生1S信号,点亮LED。

添加&配置Zynq UltraScale+ MPSoc IP

双击该IP,在Clock Configuration -> Output Clocks -> Low Power Domain Clocks -> PL Fabric Clocks中设置见上图。

这个PL Fabric Clocks就是PS提供给PL的100MHz时钟。
最终将pl_clk0引出,得到下图。

Zynq

执行Generate Output Products和Create HDL Wrapper,最后修改顶层文件如下:

module design_1_wrapper(
output led
);

wire pl_clk0_0;

design_1 design_1_i(
.pl_clk0_0(pl_clk0_0));

clk_div_N #(
//.FREQ_WORD(32d43) //1S闪烁1次
// .FREQ_WORD(32d20) //2S闪烁1次
.FREQ_WORD(32d86) //0.5S闪烁1次
) clk_div_N_inst(
.clk_in(pl_clk0_0),
.rst_n(1b1),
.clk_out(led)
);

endmodule

clk_div_N内容如下:

//clk_in = 50MHz, 可任选
//clk_out = clk_inK/(2^32),32表示计数器位数
//频率控制字FREQ_WORD = clk_out(2^32)/clk_in, 32表示计数器位数
module clk_div_N #(
parameter FREQ_WORD = 32d1431655765 //3分频
) (
input clk_in,
input rst_n,
output reg clk_out);

//--------------------------------------
reg [31:0] max_value;

always@(posedge clk_in or negedge rst_n)
begin
if(!rst_n)
max_value <= 1b0;
else
max_value <= max_value + FREQ_WORD;
end

//--------------------------------------
always@(posedge clk_in or negedge rst_n)
begin
if(!rst_n)
clk_out <= 1b0;
else
begin
if(max_value < 32h7FFF_FFFF)
clk_out <= 1b0;
else
clk_out <= 1b1;
end
end

endmodule

执行综合、实现后,完成led的引脚约束即可,见下图。

Zynq

代码经过上板测试通过。

Zynq

以上是关于Zynq PL端调用PS端的时钟的主要内容,如果未能解决你的问题,请参考以下文章

zynq7020开发记录(持续更新)--PS和PL间的数据交互

ZYNQ从入门到头秃02 ZYNQ硬件介绍和Vivado开发流程

zynq7020开发记录(持续更新)--PS和PL间的数据交互

zynq7020开发记录(持续更新)--PS和PL间的数据交互

zynq7020开发记录(持续更新)--PS和PL间的数据交互

77.PS接收来自PL的按键中断