开发板使用第一步点亮LED。首先是对系统的框架设计
通过按键来控制LED移位,计数器来记录按键按下次数,进而对led进行控制。
通过查阅开发板硬件使用手册,可以看到led采用的直驱的方式,使用一个10K电阻进行限流。当输出高电平时,led点亮,低电平时熄灭
根据框架,为了更方便查看RTL视图,将使用层次化设计,分为顶层和按键模块、计数器模块、LED输出控制模块。
(1)按键模块:
程序代码:
`
module key_filter
#(
parameter CNT_MAX = 20
)
(
input wire sys_clk,
input wire sys_rst_n,
input wire key_in,
output reg key_flag
);
reg [19:0] cnt_20ms;
always @(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
cnt_20ms <= 20
else if(key_in == 1
cnt_20ms <= 20
else if(key_in == 1
cnt_20ms <= cnt_20ms;
else
cnt_20ms <= cnt_20ms + 1;
always @(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
key_flag <= 1
else if(cnt_20ms == CNT_MAX - 1)
key_flag <= 1
else
key_flag <= 1
endmodule
(2)计数器:
`
module counter
#(
parameter CNT_MAX = 8'd255
)
(
input wire clk,
input wire rst_n,
input wire en,
output reg [7:0] cnt,
output reg cy
);
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt <= 8'b0;
else if(en)
cnt <= cnt + 1;
else if(cnt == CNT_MAX)
cnt <= 8'b0;
always @(posedge clk or negedge rst_n)
if(!rst_n)
cy <= 1'b0;
else if(cnt == CNT_MAX)
cy <= 1'b1;
else
cy <= 1'b0;
endmodule
(3)LED控制模块
`
module led_ctrl
(
input wire sys_clk,
input wire sys_rst_n,
input wire key_flag,
input wire cy,
output reg [7:0] led
);
always @(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
led <= 8
else if(cy == 1
led <= 8
else if(key_flag == 1
led <= led << 1
else
led <= led;
endmodule
(4)顶层
`
module led
(
input wire sys_clk,
input wire sys_rst_n,
input wire key_in,
output wire [7:0] led
);
wire key_flag;
wire [7:0] cnt;
wire cy;
led_ctrl led_ctrl_inst
(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.key_flag (key_flag ),
.cy (cy ),
.led (led )
);
key_filter key_filter_inst
(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.key_in (key_in ),
.key_flag (key_flag )
);
counter
#(
.CNT_MAX (8'd8 )
)
counter_inst
(
.clk (sys_clk ),
.rst_n (sys_rst_n ),
.en (key_flag ),
.cnt (cnt ),
.cy (cy )
);
endmodule
建立工程,进行编译综合,查看RTL视图
与设计框架一致,进行下载验证
经过验证,实现了按键控制LED循环点亮