本博文参考米联客提供的教程,不太适合一点基础都没有的小白,不会讲解代码思路,只是编译工具的使用

1,概述

本实验对前文没有进行的仿真进行测试以及在线逻辑分析使用的尝试(不使用IP)。本文通过(*mark_debug = "true"*) 进行对信号的捕捉检测。

2,代码

module key #
(
parameter CLK_FREQ = 100000000
)
(
input clk_i,
input key_i,
output key_cap
);
//10ms
parameter CNT_10MS = (CLK_FREQ/100 - 1'b1);
parameter KEY_S0 = 2'd0;
parameter KEY_S1 = 2'd1;
parameter KEY_S2 = 2'd2;
parameter KEY_S3 = 2'd3;
reg [24:0] cnt10ms = 25'd0;
(*mark_debug = "true"*) reg [1:0] key_s = 2'b0;
(*mark_debug = "true"*) reg [1:0] key_s_r = 2'b0;
(*mark_debug = "true"*) wire en_10ms ;
assign en_10ms = (cnt10ms == CNT_10MS);
assign key_cap = (key_s==KEY_S2)&&(key_s_r==KEY_S1);
always @(posedge clk_i)beginif(cnt10ms < CNT_10MS)cnt10ms <= cnt10ms + 1'b1;elsecnt10ms <= 25'd0;end
always @(posedge clk_i)beginkey_s_r <= key_s;end
always @(posedge clk_i)beginif(en_10ms)begincase(key_s)KEY_S0:beginif(!key_i)key_s <= KEY_S1;endKEY_S1:beginif(!key_i)key_s <= KEY_S2;elsekey_s <= KEY_S0;endKEY_S2:beginif(key_i)key_s <= KEY_S3;endKEY_S3:beginif(key_i)key_s <= KEY_S0;elsekey_s <= KEY_S2;endendcaseendend
endmodule

以上代码中,首先把系统时钟做分频,产生 10ms 的分配时钟使能信号。在设计的状态机中,分 4 个状态
KEY_S0:判断按键是否按下,如果是,转移到状态 KEY_S1;
KEY_S1:10ms 后再次判断按键是否按下,如果是,转移状态到 KEY_S2,否则继续回到 KEY_S0;
KEY_S2:判断按键是否抬起,如果是,转移状态到 KEY_S3
KEY_S1:10ms 后再次判断按键是否抬起,如果是,转移状态到 KEY_S0,否则继续回到 KEY_S2;
当状态从 KEY_S1 转到 KEY_S2 代表依次按钮按下 key_cap 输出一次高电平。
调用 key 模块


module Key_Jitter(
input clk_i,
input rst_n_i,
input key_i,
output [3:0] led_o
);
(*mark_debug = "true"*) reg [3:0] led_o;
(*mark_debug = "true"*) wire key_cap;
always @(posedge clk_i)
beginif(!rst_n_i)beginled_o <= 4'b0000;endelse if(key_cap)beginled_o <= ~led_o;end
end
key#(.CLK_FREQ(100000000))key0(.clk_i(clk_i),.key_i(key_i),.key_cap(key_cap));
endmodule

每次 key_cap 有效,都会翻转一次 LED 的输出。
仿真代码

module Key_Jitter_TB;
// Inputs
reg clk_i;
reg rst_n_i;
reg key_i;
wire [3:0] led_o;
// Instantiate the Unit Under Test (UUT)
Key_Jitter uut (
.clk_i(clk_i),
.rst_n_i(rst_n_i),
.key_i(key_i),
.led_o(led_o)
);
initial
begin
// Initialize Inputs
clk_i = 0;
forever
#5 clk_i=~clk_i;
end
initial
begin
// Initialize Inputs
rst_n_i = 0;
#100;
rst_n_i=1;
key_i = 1;
#10000;
foreverbeginkey_i = 0;// Wait 100 ns for global reset to finish#100;key_i=1; #1000;key_i=0; #1000;key_i=1; #2000;key_i=0; #5000;#50000000;key_i=1;key_i=0; #1000;key_i=1; #2000;key_i=0; #1000;key_i=1; #2000;#50000000;key_i=0;end
end
endmodule

接下来进行仿真

3,仿真


进入后即可。添加信号,或是重新进行仿真等待和ISE很像,可以使用简单的命令语句或者直接在UI界面进行操作都很简单。

4,Chipscope 在线逻辑分析仪仿真

(*mark_debug = "true"*)添加到需要观察的信号前面即可,前面代码以给出。

step1,点击next

step2,设置
以下是这只在线逻辑分析仪的采样深度,使用的是 FPGA 的 BRAM,以及设置 Captrue control,对于这种超慢信号,
XILINX 的在线逻辑分析低于 20M 采样速度的,波形窗口就不会显示波形,这个 XILINX 也没有特别说明过,但是
通过设置 Captrue control,可以用我们这里的 en_10ms 来作为扑捉控制,而采样时钟依然用系统时钟。
以上是教程中的原话,不是很理解。以后补上。

最后点击结束即可。

5,结果观察

这里没有给出管脚约束。前面教程有。下来直接连接下载到开发板即可自动弹出一个界面。

Captrue mode 一定要设置为 BASIC
Window data depth 为采样深度设置为 2048 最大
Trigger position inwindow 设置为 1024
以上参数都可以根据需要用户自行设置



随意按下按键
等待到2048即可观察到检测的信号,这里是状态机的跳转强情况

Vivado入门使用指南之----按键消抖(仿真与在线逻辑分析仪仿真-不使用ip)相关推荐

  1. [FPGA入门笔记](十):按键消抖实验

    简介 今天购买了AXLINX AX7020的开发板,从今天开始每一个例程都要做文档记录,为自己加油. 本实验,基于ALINX AX7020开发板,芯片为xc7z020clg400-2.开发板输入时钟为 ...

  2. 单片机入门资料,按键消抖方式,按键怎么消抖

     1.什么是按键消我们先来看一下按键按下去的波形图 1.按键消抖原理 我们可以看到当按键按下的那一时刻和松开的时候有类似于锯齿的形状那就是按键抖动,这个抖动不是我们人为能控制得了的,所以我们只能对进行 ...

  3. STM32按键消抖——入门状态机思维

    在嵌入式软件开发中,状态机编程是一个十分重要的编程思想,它也是嵌入式开发中一个常用的编程框架.掌握了状态机编程思想,可以更加逻辑清晰的实现复杂的业务逻辑功能. 1 状态机思想 状态机,或称有限状态机F ...

  4. 【Verilog HDL 训练】第 09 天(按键消抖)

    5月7日 按键防抖 1. 用verilog实现按键抖动消除电路,抖动小于15ms,输入时钟12MHz. 在编写Verilog代码之前,先分析下一些前提问题,首先是几个按键(1个,多个),我们以1个和三 ...

  5. Verilog功能模块 —— 按键消抖

    一. 什么是按键消抖 按键消抖_百度百科 (baidu.com) 按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断 ...

  6. stm32 工业按键检测_STM32单片机按键消抖和FPGA按键消抖大全

    写在前面: 物联网STM32入门 - 直播课程 - 创客学院​www.makeru.com.cn 按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖 ...

  7. Verilog中按键消抖检测的实现

    Verilog按键消抖是FPGA学习时的一个入门教程,为避免眼高手低,还是再次分析与记录一下.此处着重介绍按键消抖的基本原理,对按键消抖与检测的关键技术进行分析,并进行功能仿真. 一.按键消抖基本原理 ...

  8. 51单片机定时器中断按键消抖(无延时)

    单片机入门学习记录(二) 在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理.按键的抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应 ...

  9. FPGA学习-Verilog实现独立按键消抖

    文章目录 前言 一.独立按键消抖原理 二.按键消抖程序实现(Verilog) 1.按键触发判断 2.计数器模块实现 3.按键状态更新 4.按键控制led亮灭 三.仿真测试文件编写 四.编译结果 前言 ...

最新文章

  1. Python-练习7
  2. 设计模式:适配器模式(Adapter)
  3. 在玩客云或树莓派上通过ffmpeg将视频推流到直播平台
  4. [Big Data - Kafka] Kafka设计解析(四):Kafka Consumer解析
  5. Nginx跨域解决方案
  6. 为什么都瞧不起QQ邮箱?
  7. go语言 html 5 gui,仅需简单 5 步,给你的 Golang 程序添加 GUI (使用 Electron )
  8. Alex 的 Hadoop 菜鸟教程: 第17课 更快速的MapReduce - Spark
  9. 2022-2028中国安全代码审查软件市场现状研究分析与发展前景预测报告
  10. 计算机取证程序论文,计算机取证论文参考文献推荐 计算机取证论文参考文献哪里找...
  11. springboot webService调用
  12. Siemens配置许可证服务器,OPC 服务器 配置
  13. 使用elasticsearch文件搜索系统助力亚马逊解决方案架构师认证考试
  14. JAVA语言五猴分桃简单解法_五猴分桃问题详解
  15. 接口保护,element-ui+axios使用加密,后端php-laravel解密
  16. mpd无法启动的案例及解决
  17. 2021年芒种是几月几号?芒种习俗有哪些 ?
  18. swift for 循环
  19. WHUT·PTA·实验一 (个人整理+理解版 )
  20. Hello Qt(一)——QT简介

热门文章

  1. Gson转Map时,Int会变成double解决方法
  2. 在nodeJs的Express框架下用TypeScript编写router路由出现import关键字错误的解决方案
  3. libc.so.6被删后导致系统无法使用的原因及解决方法
  4. sun.misc.BASE64Encoder找不到的解决方法
  5. XmlHttpRequest错误:Access-Control-Allow-Origin不允许使用原点null
  6. win11资源管理器历史搜索记录如何删除 Windows11禁用资源管理器历史搜索记录的设置方法
  7. Win11任务栏不重叠怎么设置,Win11任务栏不重叠设置方法
  8. Aubo i5真机 ros - melodic 版驱动下载 [ 驱动下载 ]
  9. Linux技术进阶示意图
  10. 两轮差速驱动机器人轮间距校准方法