为了点亮及闪烁ZYNQ开发板上的两个LED,废掉了国庆节第一天的整个上午。
开发板为ZCU102,初次使用,搞不清楚FPGA部分的时钟,查资料
暂且就用一下125M的吧
开始写代码
一想,这是差分时钟,是不是得做点啥,差分转单端:
IBUFGDS i_ibufgds_adc_0
(.I (adc_0_dclk_p_in),
.IB (adc_0_dclk_n_in),
.O (sys_clk) //单端信号时钟
);
1秒闪一次吧,好算:
assign led = (cnt<28'd62_500_000) ? 2'b10 : 2'b01;
第一次使用集成的逻辑分析仪ILA,需要先配置IP核,很简单,然后例化:
ila_0 ila_instance ( .clk(sys_clk), // input wire clk .probe0(sys_ret_p), // input wire [0:0] probe0 .probe1(cnt), // input wire [0:0] probe1 .probe2(led) // input wire [0:0] probe2 );
完整的代码如下,有些注释可能不对,因为是从别的地方粘过来的
module test_adc_clk(
input sys_ret_p, //ZCU板子上的独立按键,按下是高电平
input adc_0_dclk_p_in,//adc的差分时钟P端口
input adc_0_dclk_n_in,//adc的差分时钟N端口
output [1:0] led
);
reg [28:0] cnt;
//wire adc_0_clk_bufg;//adc的差分输出时钟,经过IBUFGDS后的单端信号时钟
wire sys_clk;
assign led = (cnt<28'd62_500_000) ? 2'b10 : 2'b01;
always@(posedge sys_clk or posedge sys_ret_p)begin
if(sys_ret_p)
cnt <= 28'd0;
else if(cnt < 28'd125_000_000)
cnt <= cnt + 1'b1;
else
cnt <= 28'd0;
end
//IBUFGDS是时钟信号专用的输入缓冲器,它是IBUFG的差分形式,当信号从一对差分全局时钟管脚输入时
//必须使用IBUFGDS作为全局输入缓冲,它支持LVDS的IO标准
IBUFGDS i_ibufgds_adc_0
(.I (adc_0_dclk_p_in),
.IB (adc_0_dclk_n_in),
.O (sys_clk) //adc的差分输出时钟,经过IBUFGDS后的单端信号时钟
);
ila_0 ila_instance (
.clk(sys_clk), // input wire clk
.probe0(sys_ret_p), // input wire [0:0] probe0
.probe1(cnt), // input wire [0:0] probe1
.probe2(led) // input wire [0:0] probe2
);
endmodule
最后终于闪了