4个按键控制4种四个花样流水灯程序verilog_和测试程序及整个工程
时间: 2023-06-19 16:06:50 浏览: 168
以下一个基于Verilog的四个按键控制四种四个花样流水灯程序的例子,同时包括测试程序和整个工程。
```
//四个按键控制四种四个花样流水灯程序
module led_ctrl(
input clk, //时钟信号
input [3:0] key, //四个按键输入
output reg [3:0] led //四个LED输出
);
reg [1:0] state; //状态寄存器
always @ (posedge clk) begin
case (state)
2'b00: begin //第一种流水灯程序
led <= 4'b0001;
state <= key[0] ? 2'b01 : 2'b00; //按下第一个按键进入下一个状态
end
2'b01: begin
led <= 4'b0010;
state <= key[0] ? 2'b10 : 2'b01; //按下第一个按键进入下一个状态
end
2'b10: begin
led <= 4'b0100;
state <= key[0] ? 2'b11 : 2'b10; //按下第一个按键进入下一个状态
end
2'b11: begin
led <= 4'b1000;
state <= key[0] ? 2'b00 : 2'b11; //按下第一个按键回到第一个状态
end
2'b12: begin //第二种流水灯程序
led <= 4'b0001;
state <= key[1] ? 2'b13 : 2'b12; //按下第二个按键进入下一个状态
end
2'b13: begin
led <= 4'b1000;
state <= key[1] ? 2'b12 : 2'b13; //按下第二个按键回到第一个状态
end
2'b14: begin //第三种流水灯程序
led <= 4'b1111;
state <= key[2] ? 2'b00 : 2'b14; //按下第三个按键回到第一个状态
end
2'b15: begin //第四种流水灯程序
led <= 4'b1010;
state <= key[3] ? 2'b00 : 2'b15; //按下第四个按键回到第一个状态
end
endcase
end
endmodule
```
对应的测试程序:
```
module tb_led_ctrl;
reg clk;
reg [3:0] key;
wire [3:0] led;
led_ctrl dut(
.clk(clk),
.key(key),
.led(led)
);
initial begin
clk = 0;
key = 4'b1111;
#10;
key = 4'b0111;
#10;
key = 4'b0011;
#10;
key = 4'b0001;
#10;
key = 4'b0000;
#10;
key = 4'b0001;
#10;
key = 4'b0011;
#10;
key = 4'b0111;
#10;
key = 4'b1111;
#10;
$finish;
end
always #5 clk = ~clk;
endmodule
```
整个工程包括了顶层实例化和约束文件,可以参考以下代码:
```
`timescale 1ns / 1ps
module top;
//引脚定义
wire clk;
wire [3:0] key;
wire [3:0] led;
//实例化led_ctrl模块
led_ctrl dut(
.clk(clk),
.key(key),
.led(led)
);
//时钟信号
reg clk_50mhz;
initial clk_50mhz = 1'b0;
always #10 clk_50mhz = ~clk_50mhz;
//按键信号
reg [3:0] key_1;
assign key = key_1;
//LED信号
wire [3:0] led_1;
assign led_1 = led;
//顶层约束文件
(* top = "50mhz" *)
(* pin_map = "input_clk:W5 input_key[0]:G1 input_key[1]:G2 input_key[2]:G3 input_key[3]:G4 output_led[0]:E3 output_led[1]:E4 output_led[2]:E5 output_led[3]:E6" *)
module top_pin;
endmodule
endmodule
```
阅读全文
相关推荐


















