ZYNQ_project:key_led

news2024/12/26 22:32:39

条件里是十进制可以不加进制说明,编译器默认是10进制,其他进制要说明。

实验目标:

 模块框图:

时序图:

代码:

`include "para.v"

module key_filter (
    input       wire                            sys_clk     ,
    input       wire                            sys_rst_n   ,
    input       wire    [`key_length -1 :0]     key_in      ,

    output      reg     [`key_length -1:0]      key_flag    
);

    reg     [`key_length -1 :0]     key_in_r1   ;
    reg     [`key_length -1 :0]     key_in_r2   ;
    reg     [3:0]                   state_c     ;
    reg     [3:0]                   state_n     ;
    reg     [19:0]                  cnt_core    ;

    wire    nege                  ;
    wire    pose                  ;
    wire    cnt_done_filter       ;
    wire    IDLEtoFILTER_UP       ;
    wire    FILTER_UPtoSAMPLING   ;
    wire    FILTER_UPtoIDLE       ;
    wire    SAMPLINGtoFILTER_BACK ;
    wire    FILTER_BACKtoIDLE     ;   

    localparam  IDLE        = 4'b0001 ,
                FILTER_UP   = 4'b0010 ,
                SAMPLING    = 4'b0100 ,
                FILTER_BACK = 4'b1000 ;

    /*********************************************************************/
    // reg     [`key_length -1 :0]     key_in_r1   ;
    // reg     [`key_length -1 :0]     key_in_r2   ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            key_in_r1 <= 2'b11 ;
            key_in_r2 <= 2'b11 ;
        end
        else begin
            key_in_r1 <= key_in ;
            key_in_r2 <= key_in_r1 ;
        end
    end
    // wire                            nege        ;
    assign  nege = |(~key_in_r1 & key_in_r2) ;
    // wire                            pose        ;
    assign  pose = |( key_in_r1 & ~key_in_r2 );

    // reg     [3:0]       state_c ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            state_c <= IDLE ;
        else
            state_c <= state_n ;
    end
    // reg     [3:0]       state_n ;
    always @(*) begin
        case(state_c)
        IDLE        :   if(IDLEtoFILTER_UP)
                            state_n = FILTER_UP ;
                        else 
                            state_n = IDLE ;
        FILTER_UP   :   if(FILTER_UPtoSAMPLING)
                            state_n = SAMPLING ;
                        else if(FILTER_UPtoIDLE)
                            state_n = IDLE ;
                        else 
                            state_n = FILTER_UP ;
        SAMPLING    :   if(SAMPLINGtoFILTER_BACK)
                            state_n = FILTER_BACK ;
                        else 
                            state_n = SAMPLING ;
        FILTER_BACK :   if(FILTER_BACKtoIDLE)
                            state_n = IDLE ;
                        else 
                            state_n = FILTER_BACK ;
        default     :       state_n = IDLE ;
        endcase
    end
    assign  IDLEtoFILTER_UP         = state_c == ( IDLE         ) && ( nege             ) ; 
    assign  FILTER_UPtoSAMPLING     = state_c == ( FILTER_UP    ) && ( cnt_done_filter  ) ; 
    assign  FILTER_UPtoIDLE         = state_c == ( FILTER_UP    ) && ( pose             ) ; 
    assign  SAMPLINGtoFILTER_BACK   = state_c == ( SAMPLING     ) && ( pose             ) ; 
    assign  FILTER_BACKtoIDLE       = state_c == ( FILTER_BACK  ) && ( cnt_done_filter  ) ; 
  
    // reg     [19:0]                  cnt_core    ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            cnt_core <= 20'd0 ;
        else
        case (state_c)
        IDLE        :   cnt_core <= 20'd0 ;
        FILTER_UP   :   if( cnt_core == `MAX_CNT_10MS - 1 )
                            cnt_core <= 20'd0 ;
                        else 
                            cnt_core <= cnt_core + 1'b1 ;
        SAMPLING    :   cnt_core <= 20'd0 ;
        FILTER_BACK :   if( cnt_core == `MAX_CNT_10MS - 1 )
                            cnt_core <= 20'd0 ;
                        else 
                            cnt_core <= cnt_core + 1'b1 ;
        default     :   cnt_core <= 20'd0 ;
        endcase
    end
    // cnt_done_filter   
    assign   cnt_done_filter = ( cnt_core == `MAX_CNT_10MS - 1 ) ;
    // reg     [`key_length -1:0]      key_flag  
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            key_flag <= 0 ;
        else if(FILTER_UPtoSAMPLING)
            key_flag <= ~key_in_r2 ;
        else 
            key_flag <= 0 ;
    end

endmodule
// led闪烁实验,间隔0.25s
`include "para.v"
module led(
    input       wire            sys_clk     ,
    input       wire            sys_rst_n   ,
    input       wire    [1:0]   key_in      ,

    output      reg     [1:0]   led_out     
);
    reg     [1:0]   led_mod  ;
    reg     [23:0]  cnt_25ms ;
    wire            cnt_25ms_flag ;

    // led_mod
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            led_mod <= 2'b00 ;
        else if((led_mod == 2'b01 && key_in == 2'b01) || (led_mod == 2'b10 && key_in == 2'b10))
            led_mod <= 2'b00 ;
        else if(key_in == 2'b01)
            led_mod <= 2'b01 ;
        else if(key_in == 2'b10)
            led_mod <= 2'b10 ;
        else 
            led_mod <= led_mod ;
    end
    // cnt_25ms
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            cnt_25ms <= 24'd0 ;
        else if(led_mod == 2'b01 || led_mod == 2'b10) begin
                if(cnt_25ms == `MAX_CNT_250MS - 1)
                    cnt_25ms <= 24'd0 ;
                else 
                    cnt_25ms <= cnt_25ms + 1'b1 ;
            end
        else 
            cnt_25ms <= 24'd0 ;
    end
    assign  cnt_25ms_flag = (cnt_25ms == `MAX_CNT_250MS - 1) ;

    // led_out
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            led_out <= 2'b11 ;
        else 
        case (led_mod)
        2'b00:  led_out <= 2'b11 ;
        2'b01:  if(led_out[1] == led_out[0])
                    led_out <= 2'b10 ;
                else if(cnt_25ms_flag)
                    led_out <= ~led_out ;
                else 
                    led_out <= led_out ;
        2'b10:  if(led_out[1] != led_out[0])
                    led_out <= 2'b11 ;
                else if(cnt_25ms_flag)
                    led_out <= ~led_out ;
                else 
                    led_out <= led_out ;
        default: led_out <= led_out ;
        endcase
    end

endmodule

`define key_length 2
`define MAX_CNT_10MS  500_000
`define MAX_CNT_500MS 25_000_000
`define MAX_CNT_250MS 12_500_000

`include "para.v"
module top(
    input       wire            sys_clk    ,
    input       wire            sys_rst_n  ,
    input       wire    [1:0]   key_in     ,

    output      wire    [1:0]   led_out       
);

    // 例化间连�?
    wire    [`key_length -1:0]      key_flag    ;
key_filter key_filter_inst(
    .sys_clk                ( sys_clk    ) ,
    .sys_rst_n              ( sys_rst_n  ) ,
    .key_in                 ( key_in     ) ,

    .key_flag               ( key_flag   )  
);

led led_inst(
    .sys_clk                ( sys_clk   ) ,
    .sys_rst_n              ( sys_rst_n ) ,
    .key_in                 ( key_flag  ) ,

    .led_out                ( led_out   )  
);

endmodule

仿真:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1185010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opengauss权限需求

创建角色 "u_rts" 并授予对数据库 "rts_opsdb" 的只读权限&#xff1a; CREATE ROLE u_rts LOGIN PASSWORD Cloud1234; GRANT CONNECT ON DATABASE rts_opsdb TO u_rts; GRANT USAGE ON SCHEMA public TO u_rts; GRANT SELECT ON ALL TABLES IN SCHEMA pub…

二维码智慧门牌管理系统升级解决方案:轻松实现辖区范围门址统计

文章目录 前言一、系统功能与优势 前言 在这个数字化时代&#xff0c;传统的门牌管理系统已经无法满足现代管理的需求。为了满足辖区内门址的统计需求&#xff0c;我们引入了全新的二维码智慧门牌管理系统升级解决方案。这一升级将让您轻松实现辖区范围门址的统计&#xff0c;…

虹科分享 | 一文带你了解增强现实(AR)技术的前世今生

引言&#xff1a;增强现实&#xff08;Augmented Reality, AR&#xff09;技术在近几年大放光彩&#xff0c;您可能在《头号玩家》或《黑镜》等影视作品中看到过人们对AR技术的其奇思妙想&#xff0c;也可能从科普文章中了解过“元宇宙”、“数字孪生”等概念&#xff0c;您还可…

如何安装 StoneDB 2.0 企业版? | StoneDB 使用教程 #2

通过二进制TAR包安装&#xff08;CentOS 7.X&#xff09; 下载安装包 stonedb-ee-8.0-v2.1.0.el7.x86_64.tar.gz 下载地址&#xff1a;https://www.stoneatom.com/download 解压安装包 tar -zxvf stonedb-ee-8.0-v2.1.0.el7.x86_64.tar.gz -C /opt 依赖检查 ldd -r /opt/st…

Cordova插件开发三:通过广播实现应用间跨进程通信

文章目录 1.最终效果预览2.数据发送3.插件接受数据4.JS页面中点击获取数据返回1.最终效果预览 场景说明:我们给自来水公司开发了一个h5应用,需要对接第三方厂家支持硬件设备以便于获取到高精度定位数据,之前几篇文件写过,我已经集成过南方测绘RTK和高精度定位模块的设备,厂…

传感器数据采集:采样定理(奈奎斯特定理)

采样定理是连续时间信号&#xff08;通常称为“模拟信号”&#xff09;和离散时间信号&#xff08;通常称为“数字信号”&#xff09;之间的基本桥梁。该定理说明采样频率与信号频谱之间的关系&#xff0c;是连续信号离散化的基本依据。 它为采样率建立了一个足够的条件&#x…

Redis 线程、持久化和监控

Redis 线程、持久化和监控 Redis线程模型 Redis主线程模型 图1 Redis 6.0之前的主线程模型 IO多路复用程序指的是单个线程监听多个套接字连接&#xff08;Socket&#xff09;&#xff0c;当IO多路复用程序将多个Socket上的就绪事件放置于队列中&#xff0c; Redis主线程一次处…

Codeforces Round 908 (Div. 2)题解

目录 A. Secret Sport 题目分析: B. Two Out of Three 题目分析: C. Anonymous Informant 题目分析: A. Secret Sport 题目分析: A,B一共打n场比赛&#xff0c;输入一个字符串由A和‘B’组成代表A赢或者B赢&#xff08;无平局&#xff09;&#xff0c;因为题目说明这个人…

玩一玩MySQL8.0.35

文章目录 1 下载MySQL2 安装MySQL2.1 选择安装类型2.2 安装组件2.3 产品配置3 启动MySQL Shell4 使用MySQL Workbench4.1 创建数据库连接4.2 查看数据库列表4.3 创建数据库vue4.4 将csv导入数据库4.5 查看导入的表1 下载MySQL 网址:https://dev.mysql.com/downloads/installer…

Ansible优化大全

文章目录 一、关闭系统信息收集二、开启加速 Ansible 执行速度修改配置文件/etc/ansible/ansible.cfg由于该功能与sudo冲突&#xff0c;必须关闭 requiretty 选项方法一方法二 参考文章&#xff1a; https://blog.csdn.net/o0o0o0D/article/details/110998873 一、关闭系统信息…

【C#枚举 Enum】

C#枚举 Enum 一、枚举 1、枚举是将变量的值罗列出来,变量的值只限于列举出来的值的范围。 2、枚举使用enum关键字来声明&#xff0c;与类同级。枚举本身可以有修饰符&#xff0c;但枚举的成员始终是公共的&#xff0c;不能有访问修饰符。枚举本身的修饰符仅能使用public和int…

java项目之个人健康信息管理(ssm+jsp)

项目简介 个人健康信息管理实现了以下功能&#xff1a; 管理员&#xff1a;首页、个人中心、用户管理、医师管理、饮食记录管理、运动记录管理、健康信息管理、健康评估管理、健康知识管理、系统管理。用户&#xff1a;首页、个人中心、饮食记录管理、运动记录管理、健康信息…

3D全景技术,为我们打开全新宣传领域

随着科技的发展&#xff0c;3D全景技术正在融入我们的生活&#xff0c;这种全新视觉体验方式为我们打开了一扇全新的宣传领域&#xff0c;可以让我们多方位、多视角地探索各个行业&#xff0c;无论是对教育、商业、还是其他领域&#xff0c;都产生了深远的影响。 3D全景技术结合…

QTabBar实验

目的&#xff1a; 研究QTabBar::currentChanged与QTabBar::tabBarClicked这两个信号的触发条件。 现象&#xff1a; 最开始时&#xff0c;信号都未被触发。 当点击标签时&#xff0c;两个信号都被触发&#xff0c;如下图&#xff1a; 而使用 tab_bar->setCurrentIndex(…

领导说,效率越高的人,越擅长数据可视化

领导说效率越高的人&#xff0c;就越擅长数据可视化&#xff0c;因为他们总能找到操作简单、指标计算又快又准、分析效率极高的数据可视化工具&#xff0c;比如说奥威BI数据可视化工具。 奥威BI数据可视化工具&#xff0c;集齐一个高效BI数据可视化工具的五大使用优点&#xf…

Unix环境高级编程-学习-02-进程环境之进程终止、命令行参数、环境表、C程序的存储空间布局

目录 一、环境信息 二、声明 三、进程终止 1、情况分类 2、退出函数 3、退出实验 &#xff08;1&#xff09;main声明int和调用return值 &#xff08;2&#xff09;main声明int和不调用return &#xff08;3&#xff09;main声明不int和不调用return 4、atexit 5、at…

chrome安装vue devtools

不能访问应用商店 如果可以访问应用商店可以往下看 插件源代码 选择shell-chrome&#xff0c;这是官方的插件源码 下载源代码打包 参考教程 点击扩展按钮->管理扩展程序->打开开发者模式->把crx文件拖拽进去即可 可以访问chrome应用商店 插件地址 官方文档地址 选…

浅谈开源策略的实例:CGAL计算几何库

免责声明&#xff1a;本博客旨在分享我对开源策略的理解和体会&#xff0c;不代表任何组织或机构的立场或观点&#xff0c;也不构成任何商业或投资的建议或担保。本博客的内容可能存在错误或遗漏&#xff0c;也可能随着时间的推移而变得过时或不适用。请在使用或依赖本博客的内…

十四、W5100S/W5500+RP2040树莓派Pico<NetBIOS>

文章目录 1 前言2 简介2 .1 什么是NetBIOS&#xff1f;2.2 NetBIOS的优点2.3 NetBIOS工作原理2.4 NetBIOS应用场景 3 WIZnet以太网芯片4 NetBIOS网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 随着…

Android14前台服务适配指南

Android14前台服务适配指南 Android 10引入了android:foregroundServiceType属性&#xff0c;用于帮助开发者更有目的地定义前台服务。这个属性在Android 14中被强制要求&#xff0c;必须指定适当的前台服务类型。以下是可选择的前台服务类型&#xff1a; camera: 相机应用。…