使用vivado2016.4编写一个流水灯项目(上)

实验室新进了一块板子,正好我也需要学习硬件开发,于是先做了个小项目练练手,顺便纪念一下。

目录

  • 1.项目要求
  • 2.工作环境
  • 3.项目流程
    • 1.打开Vivado,建立项目
    • 2.源文件的添加
    • 3.编写源文件
    • 4.进行模拟仿真.
  • 项目前半部分总结

1.项目要求

1.流水灯有八个状态,使用开发板上的三个LED灯来完成相应状态的闪烁;
2.闪烁间隔为每秒闪烁一次;
3.有使能按键,即按下按键时灯开始闪烁,松开即灭;

2.工作环境

1.编辑器:Vivado 2016.4,使用Verilog进行编写
2.开发板:DIGILENT Genesys2

3.项目流程

1.打开Vivado,建立项目

1.首先,单击桌面上的图标,进入Vivado开发环境
Alt
2.点击creat new project,出现create a new vivado project对话框,点击next来创建一个新的工程
使用vivado2016.4编写一个流水灯项目(上)_第1张图片
使用vivado2016.4编写一个流水灯项目(上)_第2张图片
3.在 new project对话框中输入自定义的项目名,以及项目路径,我们的项目为流水灯,项目名定义为led_s使用vivado2016.4编写一个流水灯项目(上)_第3张图片
点击next,进入project type界面,此处我们选择RTL项目,即RTL级设计,可以自己添加源程序,仿真程序,约束程序。之后点击next
使用vivado2016.4编写一个流水灯项目(上)_第4张图片
4.因为我们的开发板的芯片型号为XC7K325T-FFG900-2,在输入框中搜索此芯片,出现两个符合的,此处我选用了第二种(应该没什么区别)。点击next
使用vivado2016.4编写一个流水灯项目(上)_第5张图片
5.最后出现确认框,点击finish,即可完成项目的创建。
使用vivado2016.4编写一个流水灯项目(上)_第6张图片

2.源文件的添加

1.点击界面左侧Project Manager下的Add Sources,即可添加源文件
使用vivado2016.4编写一个流水灯项目(上)_第7张图片
之后会让用户选择添加哪种文件的对话框:
使用vivado2016.4编写一个流水灯项目(上)_第8张图片
constrains:添加约束文件;design sources:添加设计文件;simulation sources:添加仿真文件;
(后面的暂时没用到,以后了解了再说说吧。)
2.此时出现添加文件的界面,点击creat file创建文件,并将主程序文件名命名成与项目名相同的led_s,点击OK
使用vivado2016.4编写一个流水灯项目(上)_第9张图片
3.出现文件列表界面,确认无误之后点击finish
使用vivado2016.4编写一个流水灯项目(上)_第10张图片
之后点击OK,再点击YES完成默认设置,即可创建完毕
使用vivado2016.4编写一个流水灯项目(上)_第11张图片

3.编写源文件

1.点击design source中的源文件led_s.v,即可进行源文件的编写,界面如下
使用vivado2016.4编写一个流水灯项目(上)_第12张图片
2.语法什么的就不细说了,直接贴代码吧。
首先是主程序led_s.v:用的二段状态机,写的略微冗长一点,但是比较容易看懂。

// An 8-states flow led
//led_s.v
`timescale 1ns / 1ps
module led_shine(
    input clk_in1_n,clk_in1_p,
    input rst_n,
    (* DONT_TOUCH= "{TRUE}" *) output reg [2:0] led
    );
    
parameter S0=3'b000,S1=3'b001,S2=3'b010,S3=3'b011,S4=3'b100,S5=3'b101,S6=3'b110,S7=3'b111;
parameter T = 99999999;

(* DONT_TOUCH= "{TRUE}" *) reg [2:0] state;
(* DONT_TOUCH= "{TRUE}" *) reg [31:0] count;

//差分时钟信号的实例化
clk_wiz_0 clk_wiz_0 
 (
  // Clock out ports
  .clk(clk),
 // Clock in ports
  .clk_in1_p(clk_in1_p),
  .clk_in1_n(clk_in1_n)
 );
 
always@(posedge clk or negedge rst_n)
    begin
          if(!rst_n)
            begin
                state <= S0;
                count <= 0;
            end
          else
              begin
              
            case(state)
            S0:if(count < T)
                begin
                state <= S0;
                count <= count + 1;
                end
                else
                begin
                state <= S1;
                count <= 0;
                end
            S1:if(count < T)
                begin
                state <= S1;
                count <= count + 1;
                end
                else
                begin
                state <= S2;
                count <= 0;
                end
            S2:if(count < T)
                begin
                state <= S2;
                count <= count + 1;
                end
                else
                begin
                state <= S3;
                count <= 0;
                end
            S3:if(count < T)
                begin
                state <= S3;
                count <= count + 1;
                end
                else
                begin
                state <= S4;
                count <= 0;
                end
            S4:if(count < T)
                begin
                state <= S4;
                count <= count + 1;
                end
                else
                begin
                state <= S5;
                count <= 0;
                end
            S5:if(count < T)
                begin
                state <= S5;
                count <= count + 1;
                end
                else
                begin
                state <= S6;
                count <= 0;
                end
            S6:if(count < T)
                begin
                state <= S6;
                count <= count + 1;
                end
                else
                begin
                state <= S7;
                count <= 0;
                end
            S7:if(count < T)
                begin
                state <= S7;
                count <= count + 1;
                end
                else
                begin
                state <= S0;
                count <= 0;
                end
            default:state <= S0;
        endcase
    end
end

always@(*)
    begin
        case(state)
            S0:led = 3'b000;
            S1:led = 3'b001;
            S2:led = 3'b010;
            S3:led = 3'b011;
            S4:led = 3'b100;
            S5:led = 3'b101;
            S6:led = 3'b110;
            S7:led = 3'b111;
            default:led = 3'b000;
        endcase
    end 
endmodule

然后添加一个测试文件,即simulation sources,过程与上面相同,命名为led_s_test。代码如下:

// led_s_test.v
`timescale 1ns / 1ps
module led_s_test;

reg clk_in1_p,clk_in1_n;
reg rst_n;
wire [2:0] led;

led_shine led_shine(
             .clk_in1_p(clk_in1_p),
             .clk_in1_n(clk_in1_n),
             .rst_n(rst_n),
             .led(led)
             );
             
initial
    begin
        clk_in1_p = 0;
        clk_in1_n = 1;
        rst_n = 0;
        #50 rst_n = 1;
    end

//差分时钟信号的两个输入互为反    
always #5 clk_in1_p = ~clk_in1_p;
always #5 clk_in1_n = ~clk_in1_n;

endmodule

4.进行模拟仿真.

主程序和测试文件都编写完毕之后,并没有报错,下面开始进行模拟仿真。
点击主界面左边Simulation中的Run Simulation,之后再点击出现的Run Behavioral Simulation,即可进入仿真波形界面。
Alt
仿真出来的波形如图所示,经过验证,仿真波形正确,可以进行下一步的操作了。
使用vivado2016.4编写一个流水灯项目(上)_第13张图片

项目前半部分总结

经过以上的这些步骤,使用vivado 2016.4开发环境来建立一个完整的项目的过程就已经进行了一半了。从创建文件到编写代码,最后到模拟仿真,每一步骤都是必不可少的。使用vivado2016.4编写一个流水灯项目(下) 将会介绍这个完成项目的下半部分内容。
我也是一名初学者,如有不足欢迎大家指教~~

你可能感兴趣的:(Vivado使用技巧)