数字系统设计练习(二)—— 跑马灯

一、实验硬软件环境:

  1. EDA软件:Vivado2019
  2. 实验开发板:Basys3 FPGA套件

二、实验内容:

  实现如下电路功能:当开关开启,灯泡轮流闪烁,间隔1s,类似跑马灯;开关关闭,则灯泡关闭。使用实验板上的按键模拟开关,led模拟灯泡,时钟使用实验板提供的clk。草靠实验板的管脚文件编写约束文

  注意,LED部分的电路图如左图所示,当FPGA输出为高电平时,相应的LED点亮;否则,LED熄灭。拨码开关的电路如右图所示,当开关打到下档时,表示FPGA的输入为低电平。

                                                 

三、具体实现

  1. 思路分析:开发板的晶振为100Mhz,则其周期为10ns,初值为0的计数器自加1到100,000,000时为1s,每隔1s时间,led灯转换一次。
  2. 设计源码:
     1 `timescale 1ns / 1ps
     2 //////////////////////////////////////////////////////////////////////////////////
     3 // Company: 
     4 // Engineer: 
     5 // 
     6 // Create Date: 2020/09/08 14:18:09
     7 // Design Name: 
     8 // Module Name: Marquee
     9 // Project Name: 
    10 // Target Devices: 
    11 // Tool Versions: 
    12 // Description: 
    13 // 
    14 // Dependencies: 
    15 // 
    16 // Revision:
    17 // Revision 0.01 - File Created
    18 // Additional Comments:
    19 // 
    20 //////////////////////////////////////////////////////////////////////////////////
    21 
    22 module Marquee(switch, clk, led);
    23     input switch, clk;
    24     output reg [3:0] led;
    25     
    26     reg [28:0] count;
    27     
    28     always @(posedge clk)
    29     begin
    30         if(!switch)
    31             begin
    32                 led <= 4'b0001;
    33                 count <= 29'b0;
    34             end
    35         else
    36             begin
    37                 if(count == 29'd100_000_000)
    38                     begin
    39                         count <= 29'b0;
    40                         if(led == 4'b1000)
    41                             led <= 4'b0001;
    42                         else
    43                             led <= (led << 1);
    44                     end
    45                 else
    46                     begin
    47                         count <= count + 1;
    48                         led <= led;
    49                     end
    50             end
    51     end
    52 endmodule
    View Code
  3. 仿真代码:(需要注意的是,为了便于仿真,设计源码中的count设置为自加到100,而非100,000,000。)
     1 `timescale 1ns / 1ps
     2 //////////////////////////////////////////////////////////////////////////////////
     3 // Company: 
     4 // Engineer: 
     5 // 
     6 // Create Date: 2020/09/08 15:42:36
     7 // Design Name: 
     8 // Module Name: Marquee_tb
     9 // Project Name: 
    10 // Target Devices: 
    11 // Tool Versions: 
    12 // Description: 
    13 // 
    14 // Dependencies: 
    15 // 
    16 // Revision:
    17 // Revision 0.01 - File Created
    18 // Additional Comments:
    19 // 
    20 //////////////////////////////////////////////////////////////////////////////////
    21 
    22 
    23 module Marquee_tb;
    24     reg switch, clk;
    25     wire [3:0] led;
    26     
    27     Marquee U_Marquee(.switch(switch), .clk(clk), .led(led));
    28     
    29     initial
    30     begin
    31         clk = 0; switch = 0;
    32         
    33         #100 switch = 1;
    34         
    35         #100;
    36     end
    37     
    38     always #10 clk = ~clk;
    39     
    40 endmodule
    View Code
  4. 波形图:
  5. 约束文件:
     1 set_property PACKAGE_PIN V17 [get_ports switch]
     2 set_property IOSTANDARD LVCMOS33 [get_ports switch]
     3 set_property PACKAGE_PIN W5 [get_ports clk]
     4 set_property IOSTANDARD LVCMOS33 [get_ports clk]
     5 set_property PACKAGE_PIN U16 [get_ports led[0]]
     6 set_property IOSTANDARD LVCMOS33 [get_ports led[0]]
     7 set_property PACKAGE_PIN E19 [get_ports led[1]]
     8 set_property IOSTANDARD LVCMOS33 [get_ports led[1]]
     9 set_property PACKAGE_PIN U19 [get_ports led[2]]
    10 set_property IOSTANDARD LVCMOS33 [get_ports led[2]]
    11 set_property PACKAGE_PIN V19 [get_ports led[3]]
    12 set_property IOSTANDARD LVCMOS33 [get_ports led[3]]
    View Code
原文地址:https://www.cnblogs.com/mantha/p/13633100.html