博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FPGA按一下按键,对应端口输出单个脉冲
阅读量:6504 次
发布时间:2019-06-24

本文共 2335 字,大约阅读时间需要 7 分钟。

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

module state(key,led,clk);input key;//输入按键input clk;//输入时钟48Moutput reg led;//输出ledreg state=0;//记录按钮状态reg[27:0] cnt=0;//计数器always@(*)begin    if(key == 0)//按下了    state = 1;  //状态置一    else if(cnt==48000000)//到了计数值    state = 0;//状态复位endalways@(posedge clk)begin    if(state == 1)//如果状态置一    cnt<=cnt+1'b1;//开始计数    else    cnt<=0;//松开或没有按下,清零endalways@(posedge clk)begin  if(state == 1)//如果状态置一  led <=1;//灯亮  else  led <=0;endendmodule

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

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;//把下一个状态给它endalways@(*)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;        endcaseendalways@(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    endendalways@(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;    endendmodule

 

转载地址:http://ktqyo.baihongyu.com/

你可能感兴趣的文章
【Project Euler】530 GCD of Divisors 莫比乌斯反演
查看>>
luogu P1280 尼克的任务 序列DP
查看>>
iphone UIView的一些基本方法理解
查看>>
sys.check_constraints
查看>>
vue问题
查看>>
ThinkPHP 框架学习
查看>>
css3箭头效果
查看>>
MathType在手,公式不求人!
查看>>
测试用例设计
查看>>
三层架构
查看>>
Python变量类型(l整型,长整形,浮点型,复数,列表,元组,字典)学习
查看>>
解决方案(.sln)文件
查看>>
【Treap】bzoj1588-HNOI2002营业额统计
查看>>
第六周作业
查看>>
利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator
查看>>
指针和引用的区别
查看>>
运行PHP出现No input file specified错误解决办法
查看>>
【重建】从FJOI2016一试谈起
查看>>
selenium之frame操作
查看>>
php 引入其他文件中的变量
查看>>