名称: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两端相向移动,交叉后继续移动直到最后。
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 :
源代码
扫描文章末尾的公众号二维码