Zynq PL端调用PS端的时钟
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zynq PL端调用PS端的时钟相关的知识,希望对你有一定的参考价值。
ZYNQ PS端最多可以分配4个时钟供给PL端使用,见下图。
本文的目的:在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引出,得到下图。
执行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 PL端调用PS端的时钟的主要内容,如果未能解决你的问题,请参考以下文章
zynq7020开发记录(持续更新)--PS和PL间的数据交互
ZYNQ从入门到头秃02 ZYNQ硬件介绍和Vivado开发流程
zynq7020开发记录(持续更新)--PS和PL间的数据交互
zynq7020开发记录(持续更新)--PS和PL间的数据交互