ZYNQ_project:key_led

条件里是十进制可以不加进制说明,编译器默认是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.mfbz.cn/a/124158.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2020 ICPC 澳门(G,J,I)详解

链接&#xff1a;The 2020 ICPC Asia Macau Regional Contest G Game on Sequence 题意 给定长度为 n n n 数组 a i a_i ai​&#xff0c;A与G博弈&#xff0c;G先手&#xff0c;给定初始位置 k k k&#xff0c;若当前在 i i i 点转移到 j j j&#xff0c;满足 i <…

在虚拟机中新安装的Linux无法联网解决办法

1、我们在虚拟机中新安装了linux&#xff0c;默认是无法连接网络的&#xff0c;这个时候&#xff0c;需要配置自动获取ip的网设置。 2、我们在VMware Workstatio需要配置net网络&#xff0c;如下图 3、进入linux系统&#xff0c;找到 /etc/sysconfig/network-scripts/ [rootn…

软件测试|MySQL WHERE条件查询详解:筛选出需要的数据

简介 在数据库中&#xff0c;我们常常需要从表中筛选出符合特定条件的数据&#xff0c;以便满足业务需求或获取有用的信息。MySQL提供了WHERE条件查询&#xff0c;使我们能够轻松地筛选数据。本文将详细介绍MySQL WHERE条件查询的用法和示例&#xff0c;帮助大家更好地理解和应…

Go uuid库介绍

简介&#xff1a; 在现代软件开发中&#xff0c;全球唯一标识符&#xff08;UUID&#xff09;在许多场景中发挥着重要的作用。UUID是一种128位的唯一标识符&#xff0c;它能够保证在全球范围内不重复。在Go语言中&#xff0c;我们可以使用第三方库github.com/google/uuid来方便…

2023-11-09 node.js-有意思的项目-记录

摘要: 2023-11-09 node.js-有意思的项目-记录 记录: 1、 NodeBB Star: 13.3k 一个基于Node.js的现代化社区论坛软件&#xff0c;具有快速、可扩展、易于使用和灵活的特点。它支持多种数据库&#xff0c;包括MongoDB、Redis和PostgreSQL&#xff0c;并且可以轻松地进行自定义…

Java修仙传之神奇的ES2(巧妙的查询及结果处理篇)

SDL语句查询 查询的基本语法 GET /indexName/_search {"query": {"查询类型": {"查询条件": "条件值"}} } 根据文档id查询 #查询文档 GET hotel/_doc/36934 查询所有 会弹出该索引库下所有文档// 查询所有 GET /indexName/_searc…

Flutter StreamBuilder 实现局部刷新 Widget

Stream 就是事件流或者管道&#xff0c;是基于事件流驱动设计代码&#xff0c;然后监听订阅事件&#xff0c;并针对事件变换处理响应。 Stream 分单订阅流和广播流,单订阅流在发送完成事件之前只允许设置一个监听器&#xff0c;并且只有在流上设置监听器后才开始产生事件&…

基于SSM的图书管理借阅系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

2023亚太杯数学建模A题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料5 最后 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 2023年第十三…

字节流操作

for i in range(100):ai.to_bytes(2,byteorderbig)print(i,a,end )if i%40:print() 字节流 a5678 先把5678转换为二进制就变成 0001_0110_0010_1110拆分两个字节&#xff0c;高字节在前&#xff0c;低字节在后 hig_byte 0001_0110 对应的16进制 0x16 little_byte 0010_11…

3 任务3 使用趋动云部署自己的stable-diffusion

使用趋动云部署自己的stable-diffusion 1 创建项目&#xff1a;2 初始化开发环境实例3 部署模型4 模型测试 1 创建项目&#xff1a; 1.进入趋动云用户工作台&#xff0c;选择&#xff1a;当前空间&#xff0c;请确保当前所在空间是注册时系统自动生成的空间。 a.非系统自动生成…

MATLAB|风玫瑰图

目录 扫一扫关注公众号 效果图 粉丝给的图&#xff1a; 复刻的图&#xff1a; 其他样式效果&#xff1a; 数据 绘图教程 绘制左边Y轴 绘制主、次网格和主、次刻度的极坐标区域。 添加刮风数据&#xff0c;添加数据和颜色、图列大小映射关系。 颜色条绘制​​​​​​…

图的算法

拓扑排序算法 解析 要求&#xff1a;无环有向图 编译过程使用的是拓扑排序。A依赖BCD&#xff0c;在BCD三个文件编译完成才能引入A&#xff1b;B依赖ECD&#xff0c;在ECD三个文件编译完成才能引入B。拓扑排序排出整体的编译顺序E→CD→B→A 算法实现 找到整个图入度为0的点&…

4K壁纸下载器,多种风格壁纸,一键批量下载到本地,桌面壁纸,高清壁纸,壁纸下载

一个桌面壁纸爬虫工具&#xff0c;该工具可以从内置的多个壁纸网站爬取高清壁纸&#xff0c;并支持将壁纸一键下载到本地&#xff0c;真正实现了所见即所得&#xff0c;不必再费心费力的翻看多个网站。 文末附工具下载链接~ 一、软件简介 本次带来的工具由吾爱的一位大佬开发…

小白学爬虫:通过商品ID或商品链接封装接口获取淘宝商品销量数据接口|淘宝商品销量接口|淘宝月销量接口|淘宝总销量接口

淘宝商品销量接口是淘宝开放平台提供的一种API接口&#xff0c;通过该接口&#xff0c;商家可以获取到淘宝平台上的商品销量数据。使用淘宝商品销量接口的步骤如下&#xff1a; 1、在淘宝开放平台注册并创建应用&#xff0c;获取API Key和Secret Key等必要的信息。 2、根据淘宝…

终于有人说清楚了Cookie、Session、Token的区别。详解,面试题

前言&#xff1a; 众所周知&#xff0c;我们访问网页一般都是使用http协议&#xff0c;而http协议的每一次访问都是无状态的。 何为无状态&#xff1f;就是这一次请求和上一次请求是没有任何关系的、互不认识的、没有关联的。这种无状态的好处就是快速&#xff0c;坏处就是无法…

Unity热更新那些事

目录 热更新方案Unity程序的两种编译方式编译阶段执行阶段Mono方式IL2CPP方式两种方式打包以后的项目目录结构 其他 ILRuntime热更新ILRuntime使用注意ILRuntime的实现原理ILRuntime的性能优化建议ILRuntime的性能优化建议 HybridCLR热更新 参考链接 Unity热更新那些事 一小时极…

【算法与数据结构】216、LeetCode组合总和 III

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题可以直接利用77题的代码【算法与数据结构】77、LeetCode组合&#xff0c;稍作修改即可使用。   …

实验5-2——网络yum源的配置

网络yum源的配置 实验步骤&#xff1a; 1.在/etc/yum.repos.d中新建一个文件夹bak备份原来的东西,查看/etc/yum.repos.d/内容 cd /etc/yum.repos.d mkdir bak ls 2.把/etc/yum.repos.d中已有的repo文件都移入bak文件夹中并查看 mv *.repo bak ls 3. 下载安装weget以防万一本…

C语言 每日一题 11.9 day15

数组元素循环右移问题 一个数组A中存有N&#xff08; > 0&#xff09;个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M&#xff08;≥0&#xff09;个位置&#xff0c;即将A中的数据由&#xff08;A0​A1⋯AN−1&#xff09;变换为&…