对于xilinx的ZC706开发板单独使用PL做流水等试验的网上例程几乎是空白,大多数是PS+PL实验。如果是刚开始接触ZC706板,想写一个单独的PL程序时,你肯定以为很快就可以上手。但是如果你开始详细了解ZC706的核心芯片XC7Z045会发现一个关键性问题,就是时钟的使用。XC7Z045所使用PL时钟输入是以差分对的形式输入的,那在程序当中怎么搞嘞???疑惑???不解了吧?下面请看实例:
对于正常是时钟输入来说程序应该是这样的:
module led(
input sys_rst_n,
input sys_clk,
output [3:0] LD
);
reg [3:0] LD_reg;
reg [31:0] cnt;
assign LD = LD_reg;
always@(posedge sys_clk or negedge sys_rst_n)
begin
if(sys_reset_n == 1'b1)begin
LD_reg <= 4 'b1000;
cnt <= 32'b0;
end
else begin
if (cnt == 32'd25000000)begin
cnt <= 32'b0;
LD_reg <=(LD_reg>>1)|(LD_reg<<3);
end
else begin
cnt <= cnt + 32'b1;
end
end
end
endmodule
按照上面的程序去编译,如果是单信号时钟的芯片没有任何问题。但是这里我们的XC7Z045用的是差分对时钟输入,编译肯定是通不过的,一堆error是跑不了的。那问题来了,我们程序中的时钟是sys_clk但信号呀!?总不用两根时钟吧!况且又是差分对。那在想一想,将差分对时钟变成单信号时钟。如果你能这样想,那就是赞了。我们要做的就是这个。在讲这个之前我们得先要了解一下,xilinx对于差分信号所使用的相关原语。(所谓原语就是xilinx给你做的例化)。我这里提及主要两个例化:IBUFGDS,IBUFDS(关于他们的使用,请自行百度)。IBUFGDS是我们例程中所需要用到的原语,具体形式
IBUFGDSrefclk_ibuf ( .I(sys_clk_p), .IB(sys_clk_n),.O(sys_clk));
sys_clk_p,sys_clk_p是差分对输入,sys_clk为程序中定义的wire通过这个例化后我们就可以将差分对时钟转变成但信号时钟使用。具体范例如下:
moduleled(
input sys_rst_n,
input sys_clk_p,
input sys_clk_n,
output [3:0] LD
);
wiresys_clk;
wiresys_reset_n;
reg[3:0] LD_reg;
reg[31:0] cnt;
IBUFGDSrefclk_ibuf ( .I(sys_clk_p), .IB(sys_clk_n),.O(sys_clk));
IBUF sys_reset_n_ibuf (.O(sys_reset_n), .I(sys_rst_n));
assignLD = LD_reg;
always@(posedgesys_clk or negedge sys_reset_n)
begin
if(sys_reset_n == 1'b1)begin
LD_reg <= 4 'b1000;
cnt <= 32'b0;
end
else begin
if (cnt == 32'd25000000)begin
cnt <= 32'b0;
LD_reg<=(LD_reg>>1)|(LD_reg<<3);
end
else begin
cnt <= cnt + 32'b1;
end
end
end
endmodule
写到这里当然还没有完,我们还要做I/O的constraint,对于led管脚的分配不多说跟以前一样。差分对时钟的例化,我们要稍加注意要加上这句原语:
create_clock-period 10.000 -name sys_clk [get_ports sys_clk_p] (周期为10ns)
set_propertyPACKAGE_PIN H9 [get_ports sys_clk_p] 差分时钟只要写一个clk_P就行clk_n软件会自动链接。
到此各项工作就算大体完成,编译吧!!!
看完请点赞! 也是对本人的支持!!需要工程文件的到CSDN网站,搜素“xilinx PL单独模块流水灯实验”,上传者为本人账号名:“xunaiqun”;