FPGA按一下按键,对应端口输出单个脉冲

简介: 对于FPGA的verilog语言,,,规定一个变量不能在多个always中被赋值.但是可以在多个alway块中做判断--结合状态机思想 module state(key,led,clk); input key;//输入按键 input clk;//输入时钟48M output reg...

对于FPGA的verilog语言,,,规定一个变量不能在多个always中被赋值.但是可以在多个alway块中做判断--结合状态机思想

module state(key,led,clk);
input key;//输入按键
input clk;//输入时钟48M

output reg led;//输出led

reg state=0;//记录按钮状态
reg[27:0] cnt=0;//计数器

always@(*)
begin
    if(key == 0)//按下了
    state = 1;  //状态置一
    else if(cnt==48000000)//到了计数值
    state = 0;//状态复位
end

always@(posedge clk)
begin
    if(state == 1)//如果状态置一
    cnt<=cnt+1'b1;//开始计数
    else
    cnt<=0;//松开或没有按下,清零
end

always@(posedge clk)
begin
  if(state == 1)//如果状态置一
  led <=1;//灯亮
  else
  led <=0;
end

endmodule

按下按键灯就会亮,如果一直按着灯就会一直亮(

if(key == 0)//按下了
    state = 1;  //状态置一
    else if(cnt==48000000)//到了计数值
    state = 0;//状态复位

),可以改变一下代码,变成按下松开灯亮一秒后灭,就是加一个松手检测,或者做别的修改...

 

 一开始请教的群里的大神给的代码--状态机思想

module relay(input clk,//输入时钟
             input rst,//输入复位
                 input a,  //输入信号
                 output reg b//输出
                 );

reg[3:0] current_state=0,next_state=0;//现在的状态,下一个状态
reg[27:0] state_cnt=0;//状态计数

localparam sIdle_state=0;//空闲
localparam sInput_high=1;//输入高
localparam sInput_low=2;//输入低
localparam sOutput_pluse=3;//输出

always@(posedge clk or negedge rst)
begin
    if(~rst)
    current_state <= sIdle_state;//复位空闲
    else
    current_state <= next_state;//把下一个状态给它
end

always@(*)
begin
    case(current_state)
    sIdle_state://空闲态
    begin
        if(a==1)//输入为高
        next_state <= sInput_high;//赋为输入高
        else
        next_state <= current_state;//赋为空闲
    end
    
    sInput_high://输入高
    begin
        if(a==0)
        next_state = sInput_low;//赋为输入低
        else
        next_state = current_state;//赋为空
    end
    
    sInput_low://输入低
    begin
        next_state = sOutput_pluse;//赋为端口输出模式
    end
    
    sOutput_pluse:
    begin
        if(state_cnt == 48000000)
        next_state = sIdle_state;
        else
        next_state = current_state;//现在的状态
    end
    
    default: next_state = sIdle_state;
    
    endcase
end


always@(posedge clk or negedge rst)
begin
    if(~rst)
    begin
        b<=0;
    end
    else
    begin
        case(next_state)
        sIdle_state://如果是空闲状态
        begin
        
        end
        sOutput_pluse://如果是输出状态
            b<=1;//输出高
        default:
            b<=0;
        
        endcase
    end
end

always@(posedge clk or negedge rst)
begin
    if(~rst)
        state_cnt <= 0;
        else if(next_state != current_state)//如果上一个状态和现在的不一样
        state_cnt<=0;
    else
        state_cnt<=state_cnt+1'b1;
    
end

endmodule

 

目录
相关文章
|
4月前
|
异构计算
FPGA新起点V1开发板(十)——按键控制LED
FPGA新起点V1开发板(十)——按键控制LED
FPGA新起点V1开发板(十)——按键控制LED
|
异构计算
|
异构计算
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
1195 0
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
|
11月前
|
异构计算
FPGA-基于UART的QVGA显示(二)(实现PC端发送字母数字汉字的分别显示通过按键可以删除字符)
FPGA-基于UART的QVGA显示(二)(实现PC端发送字母数字汉字的分别显示通过按键可以删除字符)
114 0
FPGA-基于UART的QVGA显示(二)(实现PC端发送字母数字汉字的分别显示通过按键可以删除字符)
FPGA-状态机的实现实例(按键的消抖)
FPGA-状态机的实现实例(按键的消抖)
217 0
|
C语言 异构计算
FPGA-独立按键的消抖(软件消抖未用状态机)
FPGA-独立按键的消抖(软件消抖未用状态机)
365 0
|
存储 编解码 监控
案例分享:Qt+Arm+Fpga医疗肾镜(又名内窥镜)(实时影像、冻结、拍照、白平衡、九宫格、录像、背光调整、硬件光源调整、光源手动自动调整、物理按键)
案例分享:Qt+Arm+Fpga医疗肾镜(又名内窥镜)(实时影像、冻结、拍照、白平衡、九宫格、录像、背光调整、硬件光源调整、光源手动自动调整、物理按键)
案例分享:Qt+Arm+Fpga医疗肾镜(又名内窥镜)(实时影像、冻结、拍照、白平衡、九宫格、录像、背光调整、硬件光源调整、光源手动自动调整、物理按键)
|
异构计算
【黑金ZYNQ7000系列原创视频教程】06.ZYNQ来自FPGA的中断&mdash;&mdash;按键中断实验
黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36640&extra=page%3D1   爱奇艺地址: http://www.iqiyi.com/w_19rugglzn1.html?source=
1932 0

热门文章

最新文章