流水灯工程的Vivado实现

这是西安电子科技大学2019级数字电路课程实践项目之一,在此将自己的实践过程和实验报告整理发布,以供日后回顾。

一组发光LED,在控制系统的控制下按照设定的顺序和时间来发亮和熄灭,这样就能形成一定的视觉效果。如果通过设计,实现LED灯依次点亮,那么就形成流水灯。
本实验的内容就是设计这样的控制系统,实现12位流水灯,并进行仿真及下载到电路板验证。

流水灯的关键设计

  1. 状态及其变化

    1. 状态
      需要存储当前的状态,12个灯中有一个是亮的,定义12个触发器构成的12位寄存器ledtemp保存当前的状态。

    2. 时钟
      流水灯的流转时间设置为半秒钟(500ms/2Hz)比较合适,系统的唯一时钟来源是由电路板上的有源晶振所产生的时钟连接到FPGA,是50MHz的时钟clk,因此需做25,000,000分频。

    3. 状态变化
      将寄存器ledtemp的初始值设置为12'b0000_0000_0001,divclk的每个上升边沿,对ledtemp进行向左移位,当移到12'b1000_0000_0000之后,再次移位应移为12'b0000_0000_0001。

  2. 分频设计
    要进行25,000,000分频,采用计数器的方式。当计数值达到12,500,000时令divclk翻转,这样divclk的一个周期就是25,000,000个clk时钟周期。
    需要一个寄存器变量存储计数值,12,500,000的十六进制是BEBC20为24位,因此需要设计24位以上的寄存器保存计数值。
    0-> 12,500,000->0-> 12,500,000->0-> 12,500,000

  3. 约束文件设计
    需要定义一个时钟输入,12个数码管输出。

实践过程

创建vivado项目

  1. 创建新项目
    Create a New Vivado Project
  2. 选择项目类型
    Project Type
  3. 选择开发板,我们的开发板芯片型号是xc7a35tftg256
    Choose board for your project
  • 最后选择Finish,完成工程的创建。

工程文件的创建与编写

  1. 创建Verilog文件
  • 通过Add Sources添加新Verilog文件;
    Add Sources
  • 选择文件类型为Design Sources;
    Select Source Type
  • 点击Create File;
    Create Design Sources
  • 选择文件类型并命名;
    image.png
  • 点击Finish即可(没有显示的步骤均点击OK/YES即可),在建立好的Verilog文件中添加如下代码:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2020/12/15 17:16:49
// Design Name: 
// Module Name: LED_Test_1
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module LED_Test_1(
    input SysCLK,
    output [11:0] LED
);
    reg [11:0] LEDReg = 12'b000000000001;
    reg [31:0] ClkDiv = 0;
    reg LEDPos;
    initial LEDPos = 1;
    assign LED = LEDReg;
//定义分频参数值    
    parameter Div = 12500000;
    always @(posedge SysCLK) begin
        if (ClkDiv == Div) begin
            ClkDiv <= 0;
//时序电路通过有限状态机来实现
            if(LEDPos) begin
                case (LEDReg)
                    12'b000000000001: LEDReg <= 12'b000000000010;
                    12'b000000000010: LEDReg <= 12'b000000000100;
                    12'b000000000100: LEDReg <= 12'b000000001000;
                    12'b000000001000: LEDReg <= 12'b000000010000;
                    12'b000000010000: LEDReg <= 12'b000000100000;
                    12'b000000100000: LEDReg <= 12'b000001000000;
                    12'b000001000000: LEDReg <= 12'b000010000000;
                    12'b000010000000: LEDReg <= 12'b000100000000;
                    12'b000100000000: LEDReg <= 12'b001000000000;
                    12'b001000000000: LEDReg <= 12'b010000000000;
                    12'b010000000000: LEDReg <= 12'b100000000000;
                    12'b100000000000: LEDPos <= 1'b0;
                endcase
            end else begin
                case (LEDReg)
                    12'b100000000000: LEDReg <= 12'b010000000000;
                    12'b010000000000: LEDReg <= 12'b001000000000;
                    12'b001000000000: LEDReg <= 12'b000100000000;
                    12'b000100000000: LEDReg <= 12'b000010000000;
                    12'b000010000000: LEDReg <= 12'b000001000000;
                    12'b000001000000: LEDReg <= 12'b000000100000;
                    12'b000000100000: LEDReg <= 12'b000000010000;
                    12'b000000010000: LEDReg <= 12'b000000001000;
                    12'b000000001000: LEDReg <= 12'b000000000100;
                    12'b000000000100: LEDReg <= 12'b000000000010;
                    12'b000000000010: LEDReg <= 12'b000000000001;
                    12'b000000000001: LEDPos <= 1'b1;
                endcase
            end
        end else begin
            ClkDiv <= ClkDiv + 1'b1;
        end
    end
endmodule
  1. 创建并编写Constraints(约束)文件
    约束文件是定义管脚功能及其电平等属性的文件,可以将Verilog文件中的输入输出映射到开发板的不同管脚上。
    创建约束文件有两种方法,这里仅展示其中一种,即通过编写代码来获得约束文件。
    通过编写代码创建约束文件的具体操作方式与创建Verilog的步骤类似,只需在选择文件类型时选择创建约束文件即可,这里不再写出其全部过程。
  • 通过Add Sources添加新Verilog文件;
    Create Cinstraints
  • 打开约束文件,在其中添加如下代码:
//设置输入输出对应管脚
set_property PACKAGE_PIN D4 [get_ports SysCLK]
set_property PACKAGE_PIN P9 [get_ports {LED[0]}]
set_property PACKAGE_PIN R8 [get_ports {LED[1]}]
set_property PACKAGE_PIN R7 [get_ports {LED[2]}]
set_property PACKAGE_PIN T5 [get_ports {LED[3]}]
set_property PACKAGE_PIN N6 [get_ports {LED[4]}]
set_property PACKAGE_PIN T4 [get_ports {LED[5]}]
set_property PACKAGE_PIN T3 [get_ports {LED[6]}]
set_property PACKAGE_PIN T2 [get_ports {LED[7]}]
set_property PACKAGE_PIN R1 [get_ports {LED[8]}]
set_property PACKAGE_PIN G5 [get_ports {LED[9]}]
set_property PACKAGE_PIN H3 [get_ports {LED[10]}]
set_property PACKAGE_PIN E3 [get_ports {LED[11]}]
//设置管脚电平
set_property IOSTANDARD LVCMOS33 [get_ports SysCLK]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[10]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[11]}]

至此,工程所需代码全部编写完成。

综合工程的源文件

编写完全部文件后我们需要对工程文件进行综合,步骤如下:

  • 点击Run Synthsis综合工程的源文件;
    Run Synthsis
  • 按照默认设置运行即可,开始运行后软件界面右上角会显示运行状态,等待综合结束即可;
    Launch Runs
  • 完成综合。
    Synthesis Completed

实现综合设计网表

  • 完成综合后,选择Run Implementation,点击OK,实现综合设计网表;
  • 按照默认设置运行即可,开始运行后软件界面右上角会显示运行状态,等待运行结束即可;
    Launch Runs
  • Implementation完成。
    Implementation Completed

生成比特流文件

  • Implementation完成后,选择Generate Bitstream生成比特流文件,按照默认设置运行即可,开始运行后软件界面右上角会显示运行状态,等待运行结束即可;
  • 比特流文件生成完成,这里点击Open Hardware Manager来准备硬件的连接与烧录。
    Bitstream Generation Completed

硬件的连接与烧录

生成比特流文件结束后,我们需要将其烧录到开发板上,具体步骤如下:

  • 用USB连接线将开发板连接到电脑上,在Hardware窗口中点击Auto Connect;
    Hardware Manager - 1
  • 此时Hardware窗口应显示如下:
    Hardware Manager - 2

    如果localhost中无项目(如下图),请将开发板端的Micro-USB线换至开发板上另一个接口。
    Hardware Manager - 3
  • 右击开发板,将其打开;
    Open Target
  • 点击Program Device进行烧录,烧录完成后流水灯即可正常运行。
    Program Device
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容