按键控制led
设计要求:通过8个按键分别控制一个led的亮灭。
该实验有两个模块:按键缓存模块和由按键值控制led模块
按键缓存模块:通过二级缓存,将按键值存入key_r1,防止按键时产生的尖峰脉冲影响按键值。
由按键值控制led模块:采用case语句,一一对应控制led的亮灭。
顶层代码:
module keyled(clk,rst_n,key,led);
input clk;
input rst_n;
input [7:0]key;
output [7:0]led;
//二级缓存按键数据
reg [7:0]key_r0,key_r1;
always @(posedge clk or negedge rst_n)
if(!rst_n)begin
key_r0 <= 8'd0;
key_r1 <= 8'd0;
end
else begin
key_r0 <= key;
key_r1 <= key_r0;
end
reg [7:0]led_r;
always @(key_r1)begin
case(key_r1)
8'b1111_1110:led_r = 8'b1111_1110;
8'b1111_1101:led_r = 8'b1111_1100;
8'b1111_1011:led_r = 8'b1111_1000;
8'b1111_0111:led_r = 8'b1111_0000;
8'b1110_1111:led_r = 8'b1110_0000;
8'b1101_1111:led_r = 8'b1100_0000;
8'b1011_1111:led_r = 8'b1000_0000;
8'b0111_1111:led_r = 8'b0000_0000;
default:led_r = 8'b1111_1111;
endcase
end
assign led = led_r;
endmodule
测试文件:除了clk,rst_n信号外,还设置了8+1种不同的key值(最后一种是乱序的按键),以便观察led。
代码:
`timescale 1ns/1ns
`define clk_period 20
module keyled_tb;
reg clk;
reg rst_n;
reg [7:0]key;
wire [7:0]led;
keyled keyled(
.clk(clk),
.rst_n(rst_n),
.key(key),
.led(led)
);
initial clk=1;
always#(`clk_period/2)clk=~clk;
initial begin
rst_n=0;
key=0;
#(`clk_period*20+1);
rst_n=1;
#`clk_period;
key=8'b1111_1110;
#(`clk_period*10);
key=8'b1111_1101;
#(`clk_period*10);
key=8'b1111_1011;
#(`clk_period*10);
key=8'b1111_0111;
#(`clk_period*10);
key=8'b1110_1111;
#(`clk_period*10);
key=8'b1101_1111;
#(`clk_period*10);
key=8'b1011_1111;
#(`clk_period*10);
key=8'b0111_1111;
#(`clk_period*10);
key=8'b1101_1110;
#(`clk_period*10);
end
endmodule
仿真波形图: