zynq学习01 zynq 单独使用PL模块点亮led

对于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”;

你可能感兴趣的:(Zynq开发)