1. 打开vivado,打开已有工程或者新建工程。
当工程存在时选择Open Project打开.xpr文件。
当新建工程时,选择Create New Project(以下为新建工程及文件的操作步骤)。
2. Vivado工程的建立
(1)新建工程,对工程命名及选择保存路径。
Next,选择RTL Project。
Next,已有文件可以添加。
Next,选择器件型号。
Next,Finish。
(2)在Project Manager栏下为工程添加源文件。
点击Design Source,右键选择add source,选择add or create design sources。
添加/新建.v文件(新建时对文件命名),选择OK,Finish。弹出模块名称后,点击OK,然后选择Yes。
(2)编写Verilog程序。
程序编写完成后保存,软件会自动检测语法错误,若有,会在工程及文件处出现红色波浪线,如下图所示,错误信息可在Message中查看。
(3)为工程添加仿真文件。
点击Design Source,右键选择add source(同上),选择add or create simulation sources,对文件命名,选择OK,Finish。
编写仿真测试程序后保存。
(4)Run Simulation进行波形仿真。
在左侧Simulation下选择Run Simulation,点击Run Behavioral Simulation(行为级仿真,也即功能仿真)。或者在主菜单下Flow→Run Simulation→Run Behavioral Simulation。
(5)点击左侧Run Synthesis进行综合。
(6)为工程添加管脚约束文件。
方法一:add sources→选择add or create constraints,文件保存名称为.xdc。
方法二:图形界面进行配置。左侧选择Open Implemented Design,在上方菜单栏中选择I/O pinning,然后在下方I/O port窗口展开引脚,编辑管脚信息。
配置完管脚信息后需要重新进行综合(Synthesis)与实现(Implement)。
(7)生成下载文件(.bit文件)。
选择左侧Program and Debug下的Generate Bitstream。
(8)选中设备,烧写文件。
选择左侧Program and Debug下的Open Hardware Manager,再打开Open Target(确保驱动已安装),下载.bit文件,右键设备,点击Program。
3.案例-流水灯程序代码及仿真结果
`timescale 1ns / 1ps
//
//流水灯,四个灯依次点亮
// Module Name: led_test
//
module led_test(
clk, //时钟
reset, //复位
led //输出状态灯
);
input clk;
input reset;
output [3:0] led;
reg [3:0] led;
reg [11:0] counter; //计数器
reg [2:0] state; //状态控制
//计数器
always @(posedge clk or negedge reset)
begin
if(!reset) begin
counter <= 12’d0;
end
else if ( counter == 12’d100) begin
counter <= 12’d0;
end
else begin
counter <= counter + 12’d1;
end
end
//状态跳转,通过计数器的计数值决定
always @(posedge clk or negedge reset)
begin
if(!reset) begin
state <= 3’d0;
end
else if( counter < 12’d20 )
state <= 3’d0;
else if( counter >= 12’d20 && counter < 12’d40 )
state <= 3’d1;
else if( counter >= 12’d40 && counter < 12’d60 )
state <= 3’d2;
else if( counter >= 12’d60 && counter < 12’d80 )
state <= 3’d3;
else if( counter >= 12’d80 && counter < 12’d100 )
state <= 3’d4;
end
//led状态控制
always @(posedge clk or negedge reset)
begin
if(!reset) begin
led <= 4’b1111;
end
else begin
case(state)
3’d0:led <= 4’b1110; //led低电平时点亮,默认状态为灭
3’d1:led <= 4’b1101; //以下为依次点亮各灯
3’d2:led <= 4’b1011;
3’d3:led <= 4’b0111;
3’d4:led <= 4’b1111;
default:led <= 4’b1111;
endcase
end
end
endmodule
顶层测试文件
`timescale 1ns / 1ps
module test_led;
reg clk;
reg reset;
wire [3:0] led;
initial begin
clk = 1’b0;
reset = 1’b0;
repeat(10) @(posedge clk);
reset = 1’b1;
repeat(1000) @(posedge clk);
$finish;
end
always #10 clk = ~clk;
led_test u0 (
.clk(clk),
.reset(reset),
.led(led)
);
endmodule