备注:本文大部分内容参考网络,原文链接如下,修改和补充一些内容:
https://blog.csdn.net/qq_37843999/article/details/79455247
该软件以前没有使用过。
先跑一个流水灯看看再说。
1.创建工程
2.next
3.名字和目录
4.
在这里作者讲一下这几个选项的区别。
(1)RTL project
做FPGA的肯定都知道RTL级,简单的就说verilog代码, 行为级就是不一定可以综合的,什么都可以写。RTL级就是行为级里面可以用综合器综合的,综合之后就是门级。这里的RTL project就是可以用来综合的工程,咱们一般就用这个就可以了。
(2)Post-Synthesis Projects
翻译过来是 综合后的工程。这种工程,就是直接添加综合后的网表,然后和前面的RTL工程没什么区别,也是实现布局布线。例如 .ngc, .edif, .edn, .ncd, .dcp这样的文件。可能是本人电脑不够强大,用vivado跑综合实在是有点慢,之后可能会考虑用其他综合工具。
(3)I/O Planning Projects
设置I/O口等等,感觉这个选项没有太大的作用,就看一下I/O布局之类的。
(4)Imported Project
导入其他工具写好的工程。
(5)Example Project
按照预定义的模板建立一个工程。
我们选择第一个,VC707的型号如下
创建之后, add sourse
第一个是约束 第二个是普通的文件 第三个是 仿真文件 先选第二个。创建之后开始写代码。
由于板子上只有差分时钟,所以我们需要用上差分转单端的原语。
对于差分时钟信号 ,我们使用IBUFGDS来替代IBUFDS,这个模块非必须,也可以直接使用clock IP来完成转换。
注意:vc707的reset按钮 按下去的时候 电平是1 ;
选择 IP Catalog,然后搜索Clock 模块,选择Wizard,然后一步一步设置如下:
这里使用了一个clock ip 把200MHZ转换为5MHZ了。
-
module top_led(
-
input sys_clk_p, // 开发板上差分输入时钟 200Mhz
-
input sys_clk_n,
-
input rst,
-
output reg [ 7: 0] led
-
);
-
wire sys_clk_ibufg;
-
wire clk;
-
IBUFGDS #
-
(
-
. DIFF_TERM ( "FALSE"),
-
. IBUF_LOW_PWR ( "FALSE")
-
)
-
u_ibufg_sys_clk
-
(
-
. I (sys_clk_p), //差分时钟正端输入
-
. IB (sys_clk_n), // 差分时钟负端输入
-
. O (sys_clk_ibufg) //时钟缓冲输出
-
);
-
reg [ 26: 0] count;
-
clk_wiz_0 instance_name
-
(
-
// Clock out ports
-
.clk_out1(clk), // output clk_out1 5MHZ
-
// Status and control signals
-
.reset(rst), // input reset
-
.locked(), // output locked
-
// Clock in ports
-
.clk_in1(sys_clk_ibufg));
-
always@(posedge clk or posedge rst)begin
-
if(rst)begin
-
count <= 0;
-
led <= 8'b10101010;
-
end
-
else begin
-
if( count == 26'd2499999)begin
-
count <= 0;
-
led <={led[ 6: 0],led[ 7]};
-
end
-
else count <= count+ 1;
-
end
-
end
-
-
-
-
endmodule
再添加约束文件
-
set_property PACKAGE_PIN E19 [get_ports sys_clk_p]
-
set_property IOSTANDARD LVDS [get_ports sys_clk_p]
-
set_property PACKAGE_PIN E18 [get_ports sys_clk_n]
-
set_property IOSTANDARD LVDS [get_ports sys_clk_n]
-
set_property PACKAGE_PIN AV40 [get_ports rst]
-
set_property IOSTANDARD LVCMOS18 [get_ports rst]
-
set_property PACKAGE_PIN AM39 [get_ports {led[0]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[0]}]
-
set_property PACKAGE_PIN AN39 [get_ports {led[1]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[1]}]
-
set_property PACKAGE_PIN AR37 [get_ports {led[2]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[2]}]
-
set_property PACKAGE_PIN AT37 [get_ports {led[3]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[3]}]
-
set_property PACKAGE_PIN AR35 [get_ports {led[4]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[4]}]
-
set_property PACKAGE_PIN AP41 [get_ports {led[5]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[5]}]
-
set_property PACKAGE_PIN AP42 [get_ports {led[6]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[6]}]
-
set_property PACKAGE_PIN AU39 [get_ports {led[7]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[7]}]
然后就跑一个bit文件出来 。打开hardware mannager,给板子上电,
这里自动寻找一下。如果找不到,看看是不是没上电 ,JTAG线是不是插错位置了,驱动是不是下好了。
点 program Device,编程完成之后就可以看到现象了。
该软件以前没有使用过。
先跑一个流水灯看看再说。
1.创建工程
2.next
3.名字和目录
4.
在这里作者讲一下这几个选项的区别。
(1)RTL project
做FPGA的肯定都知道RTL级,简单的就说verilog代码, 行为级就是不一定可以综合的,什么都可以写。RTL级就是行为级里面可以用综合器综合的,综合之后就是门级。这里的RTL project就是可以用来综合的工程,咱们一般就用这个就可以了。
(2)Post-Synthesis Projects
翻译过来是 综合后的工程。这种工程,就是直接添加综合后的网表,然后和前面的RTL工程没什么区别,也是实现布局布线。例如 .ngc, .edif, .edn, .ncd, .dcp这样的文件。可能是本人电脑不够强大,用vivado跑综合实在是有点慢,之后可能会考虑用其他综合工具。
(3)I/O Planning Projects
设置I/O口等等,感觉这个选项没有太大的作用,就看一下I/O布局之类的。
(4)Imported Project
导入其他工具写好的工程。
(5)Example Project
按照预定义的模板建立一个工程。
我们选择第一个,VC707的型号如下
创建之后, add sourse
第一个是约束 第二个是普通的文件 第三个是 仿真文件 先选第二个。创建之后开始写代码。
由于板子上只有差分时钟,所以我们需要用上差分转单端的原语。
对于差分时钟信号 ,我们使用IBUFGDS来替代IBUFDS,这个模块非必须,也可以直接使用clock IP来完成转换。
注意:vc707的reset按钮 按下去的时候 电平是1 ;
选择 IP Catalog,然后搜索Clock 模块,选择Wizard,然后一步一步设置如下:
这里使用了一个clock ip 把200MHZ转换为5MHZ了。
-
module top_led(
-
input sys_clk_p, // 开发板上差分输入时钟 200Mhz
-
input sys_clk_n,
-
input rst,
-
output reg [ 7: 0] led
-
);
-
wire sys_clk_ibufg;
-
wire clk;
-
IBUFGDS #
-
(
-
. DIFF_TERM ( "FALSE"),
-
. IBUF_LOW_PWR ( "FALSE")
-
)
-
u_ibufg_sys_clk
-
(
-
. I (sys_clk_p), //差分时钟正端输入
-
. IB (sys_clk_n), // 差分时钟负端输入
-
. O (sys_clk_ibufg) //时钟缓冲输出
-
);
-
reg [ 26: 0] count;
-
clk_wiz_0 instance_name
-
(
-
// Clock out ports
-
.clk_out1(clk), // output clk_out1 5MHZ
-
// Status and control signals
-
.reset(rst), // input reset
-
.locked(), // output locked
-
// Clock in ports
-
.clk_in1(sys_clk_ibufg));
-
always@(posedge clk or posedge rst)begin
-
if(rst)begin
-
count <= 0;
-
led <= 8'b10101010;
-
end
-
else begin
-
if( count == 26'd2499999)begin
-
count <= 0;
-
led <={led[ 6: 0],led[ 7]};
-
end
-
else count <= count+ 1;
-
end
-
end
-
-
-
-
endmodule
再添加约束文件
-
set_property PACKAGE_PIN E19 [get_ports sys_clk_p]
-
set_property IOSTANDARD LVDS [get_ports sys_clk_p]
-
set_property PACKAGE_PIN E18 [get_ports sys_clk_n]
-
set_property IOSTANDARD LVDS [get_ports sys_clk_n]
-
set_property PACKAGE_PIN AV40 [get_ports rst]
-
set_property IOSTANDARD LVCMOS18 [get_ports rst]
-
set_property PACKAGE_PIN AM39 [get_ports {led[0]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[0]}]
-
set_property PACKAGE_PIN AN39 [get_ports {led[1]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[1]}]
-
set_property PACKAGE_PIN AR37 [get_ports {led[2]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[2]}]
-
set_property PACKAGE_PIN AT37 [get_ports {led[3]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[3]}]
-
set_property PACKAGE_PIN AR35 [get_ports {led[4]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[4]}]
-
set_property PACKAGE_PIN AP41 [get_ports {led[5]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[5]}]
-
set_property PACKAGE_PIN AP42 [get_ports {led[6]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[6]}]
-
set_property PACKAGE_PIN AU39 [get_ports {led[7]}]
-
set_property IOSTANDARD LVCMOS18 [get_ports {led[7]}]
然后就跑一个bit文件出来 。打开hardware mannager,给板子上电,
这里自动寻找一下。如果找不到,看看是不是没上电 ,JTAG线是不是插错位置了,驱动是不是下好了。
点 program Device,编程完成之后就可以看到现象了。