【小眼睛科技紫光盘古50K开发板试用体验】按键控制LED循环点亮 - FPGA开发者技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

[文章]

【小眼睛科技紫光盘古50K开发板试用体验】按键控制LED循环点亮

开发板使用第一步点亮LED。首先是对系统的框架设计
image.png
通过按键来控制LED移位,计数器来记录按键按下次数,进而对led进行控制。
通过查阅开发板硬件使用手册,可以看到led采用的直驱的方式,使用一个10K电阻进行限流。当输出高电平时,led点亮,低电平时熄灭
image.png
根据框架,为了更方便查看RTL视图,将使用层次化设计,分为顶层和按键模块、计数器模块、LED输出控制模块。
(1)按键模块:
程序代码:
`

module key_filter
#(
    parameter   CNT_MAX = 20'd999_999
)
(
    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'b0;
    else if(key_in == 1'b1)
        cnt_20ms <= 20'b0;
    else if(key_in == 1'b0 && cnt_20ms == CNT_MAX)
        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'b0;
    else if(cnt_20ms == CNT_MAX - 1)
        key_flag <= 1'b1;
    else 
        key_flag <= 1'b0;
    
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'b0000_0001;
    else if(cy == 1'b1)
        led <= 8'b0000_0001;
    else if(key_flag == 1'b1)
        led <= led << 1'b1;
    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视图
image.png

与设计框架一致,进行下载验证
image.png
经过验证,实现了按键控制LED循环点亮

更多回帖

×
发帖