5种花样模式流水灯设计Verilog代码VIVADO仿真

名称:5种花样模式流水灯设计Verilog代码VIVADO仿真(文末获取)

软件:VIVADO

语言:Verilog

代码功能:

5种花样模式流水灯

本设计使用的流水灯为16个灯,分为5种变化花样,每种自动切换,切换到第5种模式后返回第一种。实验原理为使用状态机控制led的模式切换,一个设计了6种状态,分别是空闲状态、模式1、模式2、模式3、模式4、模式5,每个模式持续16个时钟周期。系统初始状态为空闲状态,然后切换到模式1状态,当模式1状态时钟周期到16时,切换到模式2状态,当模式2状态时钟周期到16时切换到模式3状态,如此循环往复。

当处于模式1状态时,将led灯依次向右点亮,16个周期刚好全部点亮一遍,当处于模式2时,将led灯依次向左点亮,16个周期刚好全部点亮一遍,当处于模式3时,将led等依次向由点亮,最后全亮,当处于模式4时,将led等依次向由左亮,最后全亮,当处于模式5时,将led两端相向移动,交叉后继续移动直到最后。

实验报告.doc

1. 工程文件

2. 程序文件

3. 程序编译

4. Testbench

5. 仿真图

部分代码展示:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2019/12/22 22:13:41
// Design Name: 
// Module Name: waterfall
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
//流水灯控制
module waterfall(clk_in, key_reset, led);
   input            clk_in;//时钟
   input            key_reset;//复位
   output [15:0]    led;//16个led
   
   //定义状态
   parameter [2:0]  FSM_ST_s_idle = 0,//空闲状态
                    FSM_ST_s_mode1 = 1,//模式1
                    FSM_ST_s_mode2 = 2,//模式2
                    FSM_ST_s_mode3 = 3,//模式3
                    FSM_ST_s_mode4 = 4,//模式4
                    FSM_ST_s_mode5 = 5;//模式5
   
   reg [2:0]        state;  //定义状态 
   reg [4:0]        time_cnt;  //计数器 
   reg [15:0]       led_1;//定义16位led
   
   //状态机控制,模式1~5自动切换
   always @(posedge clk_in or posedge key_reset)
      if (key_reset == 1'b1)
         state <= FSM_ST_s_idle;//复位到空闲状态
      else 
         case (state)
            FSM_ST_s_idle :
               state <= FSM_ST_s_mode1;
            FSM_ST_s_mode1 ://模式1
               if (time_cnt >= 5'b01111)
                  state <= FSM_ST_s_mode2;
               else
                  state <= FSM_ST_s_mode1;
            FSM_ST_s_mode2 ://模式2
               if (time_cnt >= 5'b01111)
                  state <= FSM_ST_s_mode3;
               else
                  state <= FSM_ST_s_mode2;
            FSM_ST_s_mode3 ://模式3
               if (time_cnt >= 5'b01111)
                  state <= FSM_ST_s_mode4;
               else
                  state <= FSM_ST_s_mode3;
            FSM_ST_s_mode4 ://模式4
               if (time_cnt >= 5'b01111)
                  state <= FSM_ST_s_mode5;
               else
                  state <= FSM_ST_s_mode4;
            FSM_ST_s_mode5 ://模式5
               if (time_cnt >= 5'b01111)
                  state <= FSM_ST_s_mode1;
               else
                  state <= FSM_ST_s_mode5;
            default :
               ;
         endcase
   
   
   always @(posedge clk_in or posedge key_reset)
      if (key_reset == 1'b1)
         time_cnt <= 5'b01111;
      else 
      begin
         if (state != FSM_ST_s_idle)
         begin
            if (time_cnt == 5'b01111)//16个led等,计数0~15
               time_cnt <= 5'b00000;
            else
               time_cnt <= time_cnt + 5'b00001;
         end
         else
            time_cnt <= 5'b01111;
      end
   
   //分别控制5种模式的16个led灯
   always @(posedge clk_in or posedge key_reset)
      if (key_reset == 1'b1)
         led_1 <= 16'b0000000000000000;
      else 
         case (state)
            FSM_ST_s_mode1 ://模式1,led等依次右移
               case (time_cnt)
                  5'b00000 :
                     led_1 <= 16'b1000000000000000;
                  5'b00001 :
                     led_1 <= 16'b0100000000000000;
                  5'b00010 :
                     led_1 <= 16'b0010000000000000;
                  5'b00011 :
                     led_1 <= 16'b0001000000000000;
                  5'b00100 :
                     led_1 <= 16'b0000100000000000;
                  5'b00101 :
                     led_1 <= 16'b0000010000000000;
                  5'b00110 :
                     led_1 <= 16'b0000001000000000;
                  5'b00111 :
                     led_1 <= 16'b0000000100000000;
                  5'b01000 :
                     led_1 <= 16'b0000000010000000;
                  5'b01001 :
                     led_1 <= 16'b0000000001000000;
                  5'b01010 :
                     led_1 <= 16'b0000000000100000;
                  5'b01011 :
                     led_1 <= 16'b0000000000010000;
                  5'b01100 :
                     led_1 <= 16'b0000000000001000;
                  5'b01101 :
                     led_1 <= 16'b0000000000000100;
                  5'b01110 :
                     led_1 <= 16'b0000000000000010;
                  5'b01111 :
                     led_1 <= 16'b0000000000000001;
                  default :
                     ;
               endcase
            FSM_ST_s_mode2 ://模式2,led等依次左移
               case (time_cnt)
                  5'b00000 :
                     led_1 <= 16'b0000000000000001;
                  5'b00001 :
                     led_1 <= 16'b0000000000000010;
                  5'b00010 :
                     led_1 <= 16'b0000000000000100;
                  5'b00011 :
                     led_1 <= 16'b0000000000001000;
                  5'b00100 :
                     led_1 <= 16'b0000000000010000;
                  5'b00101 :
                     led_1 <= 16'b0000000000100000;
                  5'b00110 :
                     led_1 <= 16'b0000000001000000;
                  5'b00111 :
                     led_1 <= 16'b0000000010000000;
                  5'b01000 :
                     led_1 <= 16'b0000000100000000;
                  5'b01001 :
                     led_1 <= 16'b0000001000000000;
                  5'b01010 :
                     led_1 <= 16'b0000010000000000;
                  5'b01011 :
                     led_1 <= 16'b0000100000000000;
                  5'b01100 :
                     led_1 <= 16'b0001000000000000;
                  5'b01101 :
                     led_1 <= 16'b0010000000000000;
                  5'b01110 :
                     led_1 <= 16'b0100000000000000;
                  5'b01111 :
                     led_1 <= 16'b1000000000000000;
                  default :
                     ;
               endcase
            FSM_ST_s_mode3 ://模式3,led等依次向由点亮,最后全亮
               case (time_cnt)
                  5'b00000 :
                     led_1 <= 16'b1000000000000000;
                  5'b00001 :
                     led_1 <= 16'b1100000000000000;
                  5'b00010 :
                     led_1 <= 16'b1110000000000000;
                  5'b00011 :
                     led_1 <= 16'b1111000000000000;
                  5'b00100 :

                 

源代码

 扫描文章末尾的公众号二维码

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值