qq_52388265 2022-10-11 16:11 采纳率: 100%
浏览 49
已结题

vhdl入门问题提问

vhdl fpga入门问题 使用一号按键控制4个LED灯,每按动一次,灯从左到右依次亮起,且每次只有一个灯亮。

  • 写回答

1条回答 默认 最新

  • 斜阳日落 2022-10-11 17:40
    关注
    
    module    key_new(
        input        wire            sclk,
        input        wire            rst_n,
        input        wire            key_in,
        
        output        reg    [3:0]        LED_out
        );
        
        //==========================//
        parameter    T_10ms=19'd499_999;
        //==========================//
        reg    [18:0]    cnt_10ms;
        reg            flag_10ms;
        reg            key_value;
        //==========cnt_10ms==========//
        always@(posedge    sclk    or    negedge    rst_n)
            if(!rst_n)
                cnt_10ms    <=19'd0;
            else    if(key_in==1'b1)      
                cnt_10ms    <=19'd0;    //key_in=1时,清零,遇到0时就累积加,所以,必须要添加此句        
            else    if(cnt_10ms==T_10ms)    //为的是cnt_10ms>T_10ms,如此就不会执行    cnt_10ms    <=cnt_10ms+1'b1;
                cnt_10ms    <=19'd500_000;
    //        else    if(key_in==1'b0)    //
            else    if(key_in==1'b0&&cnt_10ms<=T_10ms)    //目的 是:计数T_10ms+1'b1之后,就不加1
                cnt_10ms    <=cnt_10ms+1'b1;
                
        //==========flag_10ms========//        
        always@(posedge    sclk    or    negedge    rst_n)
            if(!rst_n)
                flag_10ms    <=1'b0;        //因为key_value要取反,所以光有flag_10ms=0是不行的,还需要key_in==1'b0;按下了才有效果
            else    if(cnt_10ms==T_10ms-1'b1)
                flag_10ms    <=1'b1;
            else
                flag_10ms    <=1'b0;
    
        //==================//
        always@(posedge    sclk    or    negedge    rst_n)
            if(!rst_n)
                key_value    <=1'b0;        
    
            else    if(flag_10ms==1'b1&&key_in==1'b0)
                key_value    <=1'b1;
            else
                key_value    <=1'b0;    
            
        always@(posedge    sclk    or negedge    rst_n)
            if(!rst_n)
                LED_out    <=4'b0001;
            else    if(key_value==1'b1)
                LED_out    <=    {LED_out[2:0],LED_out[3]};
                
                
    endmodule
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月19日
  • 已采纳回答 10月11日
  • 赞助了问题酬金15元 10月11日
  • 赞助了问题酬金1元 10月11日
  • 展开全部

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd