您的位置:首页 > 其它

FPGA学习之按键控制led

2015-12-06 21:39 696 查看
按键控制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

仿真波形图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: