写作时间:2020-03-08
开发环境:vivado2019.1
readme:
最近在学习FPGA,第一个实例当然是流水灯了,我已经将之整理为博客。
FPGA实现led流水灯 (工程+代码)
这个工程,使用的开发板,给FPGA的主时钟是单端时钟,然而我想把这个工程套用在xilinx KC705上,发现不是那么顺利。
我自己的开发板,主时钟是单端时钟,如下图:
因为KC705上的主时钟是差分时钟,如下图:
对于差分时钟,我们需要在==.v文件和约束文件xdc==中修改下,才可以生成bit正常。
1).v文件 修改如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
module run_led(
input sys_clk_p,
input sys_clk_n,
input RSTn_i,
output reg [3:0]LED_o
);
//*********差分时钟这么处理***********
wire CLK_i;
//对差分时钟采用IBUFGDS IP核去转换
IBUFGDS CLK_U(
.I(sys_clk_p),
.IB(sys_clk_n),
.O(CLK_i)
);
//**********************************
reg [31:0] Cnt;
always @(posedge CLK_i )
if (RSTn_i==1)//复位
begin
LED_o<=4'b0001;
end
else
begin
if (Cnt==32'd200_000_000)
begin
Cnt<=32'd0;
if(LED_o==4'b1000)
begin
LED_o<=4'b0001;
end
else
begin
LED_o<=LED_o<<1'b1;
end
end
else
begin
Cnt<=Cnt+1'b1;
LED_o<=LED_o;
end
end
endmodule
2)约束文件xdc 修改如下:
#vivado管脚约束XDC文件
#*********差分时钟这么处理***********
set_property PACKAGE_PIN AD12 [get_ports {sys_clk_p}]
#//只需要约束p端
set_property IOSTANDARD DIFF_SSTL15 [get_ports {sys_clk_p}]
#//注意这里的电平标准
set_property IOSTANDARD DIFF_TERM true [get_ports {sys_clk_p}]
#//只需要约束p端
set_property SEVERITY {Warning} [get_drc_checks UCIO-1]
#//可以忽略掉drc error
#**********************************
#rst_n
set_property PACKAGE_PIN AG5 [get_ports RSTn_i]
set_property IOSTANDARD LVCMOS15 [get_ports RSTn_i]
#LED_o
set_property PACKAGE_PIN AB9 [get_ports {LED_o[3]}]
set_property IOSTANDARD LVCMOS15 [get_ports {LED_o[3]}]
set_property PACKAGE_PIN AC9 [get_ports {LED_o[2]}]
set_property IOSTANDARD LVCMOS15 [get_ports {LED_o[2]}]
set_property PACKAGE_PIN AA8 [get_ports {LED_o[1]}]
set_property IOSTANDARD LVCMOS15 [get_ports {LED_o[1]}]
set_property PACKAGE_PIN AB8 [get_ports {LED_o[0]}]
set_property IOSTANDARD LVCMOS15 [get_ports {LED_o[0]}]
#set_property CONFIG_MODE <configuration_mode> [current_design]
#set_property BITSTREAM.CENERAL.COMPRESS TRUE [current_design]
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
这样修改后,bit 生成正确,流水灯跑起来了哈~~
其他项目中,FPGA的时钟为差分时钟的时候,完全可以套用本文方法。
补充:
关于复位,说明如下:
GPIO_SW_E是直接连接到FPGA管脚上,下拉到地,按键断开时,常为低电平。按键按下闭合,为高电平。
我们想要实现的就是,按键按下,为高电平时候,进行复位。
THE END~