FPGA_学习_06_按键控制LED

本文的实验主要用于按键驱动LED灯的亮灭,重心主要是对于按键亚稳态的处理上,什么是亚稳态?

亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。

若不对异步信号进行处理的话,直接将异步数据扇出到其他寄存器中,可能会导致其他寄存器对同一个信号的采样值不一样,这在数字电路中是很可怕的一件事情。

对于单bit位宽的数据,消除亚稳态的方法一般采用寄存器对其打两拍的操作,以此来消除亚稳这样处理后的数据,再扇出到其他寄存器,就能保证系统稳定。

FPGA_学习_06_按键控制LED_第1张图片

1 硬件原理

FPGA_学习_06_按键控制LED_第2张图片

2 时序设计

FPGA_学习_06_按键控制LED_第3张图片

{signal: [
  {name: 'clk',      wave: 'p.......................'},
  {},
  {name: 'rst_n',    wave: '0.1.....................'},
  {},
  {name: 'key',      wave: '1....0..................'},
  {},
  {name: 'key_d',    wave: '2.....2.................', data: ['1','0','2b\'01']},
  {},
  {name: 'key_dd',   wave: '2......2................', data: ['1','0','2b\'10']},
  {},
  {name: 'led',      wave: '2......2................', data: ['1b\'1','1b\'0']}
]}

// key那里自己画图处理一下

 3 源代码

`timescale 1ns / 1ps


module key_led(
        input   wire    clk,
        input   wire    rst_n,
        input   wire    key,
        output  reg     led
);


//==================================================================
//                        Internal Signals
//==================================================================

reg key_d;
reg key_dd;

//----------------------------- key_d -----------------------------
always @(posedge clk or negedge rst_n) begin
        if (rst_n == 1'b0) begin
            key_d <=  1'b1;       
        end
        else begin
            key_d <= key;    
        end
end

//----------------------------- key_dd -----------------------------
always @(posedge clk or negedge rst_n) begin
        if (rst_n == 1'b0) begin
            key_dd <=  1'b1;       
        end
        else begin
            key_dd <= key_d;    
        end
end

//----------------------------- led -----------------------------
always @(posedge clk or negedge rst_n) begin
        if (rst_n == 1'b0) begin
            led <=  1'b1;       
        end
        else begin
            led <= key_dd;    
        end
end
endmodule

5 约束文件

create_clock    -period            20.000       [      get_ports clk   ]


set_property    PACKAGE_PIN        N18          [      get_ports clk   ]
set_property    PACKAGE_PIN        P15          [      get_ports led   ]
set_property    PACKAGE_PIN        P16          [      get_ports key   ]
set_property    PACKAGE_PIN        T12          [      get_ports rst_n ]


set_property    IOSTANDARD        LVCMOS33      [      get_ports clk   ] 
set_property    IOSTANDARD        LVCMOS33      [      get_ports led   ] 
set_property    IOSTANDARD        LVCMOS33      [      get_ports key   ] 
set_property    IOSTANDARD        LVCMOS33      [      get_ports rst_n ] 

6 运行结果

Lab3_key_led_RUN

愿我们共同进步! 感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。

你可能感兴趣的:(FPGA,fpga开发,学习)