超过飞飞系列-ZYNQ之FPGA学习3.2按键控制LED灯(基于正点原子ZYNQ)

一、基础知识
管脚分配
程序设计

  1. 按键按下为低电平,未按为高
  2. 两按键未按灯都亮;KEY0按同时亮灭;KEY1按交替闪烁
  3. 第一个always产生计数器;第二个always每500ms给出LED闪烁信号;第三个always用case表示按键值控制LED闪烁

二、程序

module key_led(
    input           clk,
    input           rst_n,
    
    input      [1:0]    key,
    output reg [1:0]    led                 //默认为wire类型 要调整成reg
    );
    
    reg [24:0] cnt;
    reg     led_ctrl;               
//计数器    
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        cnt <= 25'd0;
    else if(cnt < 25'd2500_0000)                   //计数500ms
        cnt <= cnt + 1'b1;
    else
        cnt <= 25'd0;
end     

//每隔500ms就更改LED的闪烁状态
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        led_ctrl <= 1'b0;
    else if(cnt == 25'd2500_0000)             
        led_ctrl <= ~led_ctrl;
end   
//根据按键的状态以及LED的闪烁状态来赋值LED
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        led <= 2'b11;                           //该上面  +reg   就不会报错
    else case(key)
        2'b10:                                  //如果按键0按下,则两个LED交替闪烁
            if(led_ctrl == 1'b0)
                led <= 2'b01;
            else
                led <= 2'b10;
        2'b01:                                  //如果按键1按下,则两个LED同时闪烁
            if(led_ctrl == 1'b0)
                led <= 2'b11; 
            else
                led <= 2'b00;  
        2'b11:                                  //如果两个按键都未按下,则两个LED都保持点亮
                led <= 2'b11; 
        default:;
    endcase
end       
   
endmodule

三、总结

  1. 关于wire改reg 问题不懂,可能前面讲过忘了
    2020.4.24答:这个应该是说wire是直连,上程序中LED需要用LED控制处理,所以说这控制是reg
原创文章 26 获赞 4 访问量 803

猜你喜欢

转载自blog.csdn.net/qq_42280105/article/details/105719670