本节实验主要讲解FPGA开发中边沿检测方法,我们在设计中会经常用到。这个地方大家一定要理解。

1.1.1.原理介绍

学习HDL语言设计与其他语言不一样,HDL语言设计需要考虑更多的信号的电气特性,时序特性。我们先看一下边沿检测的基本原理。

如上图,为我们待检测信号,可以看出边沿的特性:边沿两侧信号的电平发生了变化。红色为上升沿,绿色为下降沿。上升沿之前电平为低,上升沿之后电平为高。下降沿之前为电平为高,下降沿之后电平为低。

设计思路:设计一个多位寄存器key_sfr[2:0],每当系统时钟来一次,就将key_sfr寄存器低2位与输入信号i_key拼接{key_sfr[1:0],i_key},然后再赋值给key_sfr[2:0]寄存器,这样就把i_key信号同步到了key_sfr寄存器的bit0,而之前bit0移位到了bit1,bit1移位到bit2。容易理解key_sfr[1]为key_sfr[0]前一时刻状态,而key_sfr[2]又为key_sfr[1]前一时刻状态。我们通过key_sfr[2:1]既可以判断相邻时刻,输入信号的电平是否发生了变化。当key_sfr[2:1]=2’b01,表示按键前一时刻为低电平,而后一时刻为高电平,相邻时刻,输入信号的电平发生了变化,此时为上升沿。当key_sfr[2:1]=2’b10,表示按键前一时刻为高电平,而后一时刻为低电平,此时为下降沿。

1.1.2.  代码实现

代码主要实现了按键按下时,LED指示灯输出不同的状态,循环8次按下按键,LED分别输出8种不同的指示灯状态。

1.  module edge_detect

2.      (

3.          input                  i_clk        ,//模块输入时钟 ,50mhz

4.          input                  i_rst_n      ,//复位信号,低电平有效

5.          input                  i_key        ,//按键输入

6.          output reg [3:0]       o_led_out       //LED指示灯输出

7.      );

8.      reg    [2:0]               key_sfr               ;   //按键同步移位寄存器

9.      wire                       w_key_rise            ;//按键上升沿

10.     wire                       w_key_fall            ;//按键下降沿

11. //-------------------------------------------------------------------

12. //  同步i_key信号,i_key为按键输入异步时钟域信号,应同步到本地时钟域

13. //-------------------------------------------------------------------

14.     always @ (posedge i_clk or negedge i_rst_n)

15.     begin

16.         if(!i_rst_n)

17.             key_sfr      <=3'b000;

18.         else

19.             key_sfr      <={key_sfr[1:0],i_key}   ; //
key_sfr[2]信号是                          i_key经过同步3拍后的信号

20.     end

21. //-------------------------------------------------------------------

22. //  判别i_key信号的边沿

23. //-------------------------------------------------------------------

24.     assign  w_key_rise=(key_sfr[2:1]==2'b01)?1'b1:1'b0;

25. //-------------------------------------------------------------------

26. //  按键按下时,计数器加1,循环记数从0-7.

27. //-------------------------------------------------------------------

28.     always @ (posedge i_clk or negedge i_rst_n)

29.     begin

30.         if(!i_rst_n)

31.             key_cnt        <=3'b000;

32.         else if(w_key_rise)

33.             key_cnt        <=key_cnt  +   1'b1;

34.     end

35. //-------------------------------------------------------------------

36. //  计数器在不同状态时输出不同的LED指示灯状态

37. //-------------------------------------------------------------------

38.     always @ (posedge i_clk or negedge i_rst_n)

39.     begin

40.         if(!i_rst_n)

41.             o_led_out   <=4'b1110;

42.         else begin

43.             case(key_cnt)  //计数器不同状态,输出指示灯状态不同

44.                 3'b000:     o_led_out<=  4'b1110;

45.                 3'b001:     o_led_out<=  4'b1101;

46.                 3'b010:     o_led_out<=  4'b1011;

47.                 3'b011:     o_led_out<=  4'b0111;

48.                 3'b100:     o_led_out<=  4'b1100;

49.                 3'b101:     o_led_out<=  4'b1001;

50.                 3'b110:     o_led_out<=  4'b0011;

51.                 3'b111:     o_led_out<=  4'b0000;

52.                 default:    o_led_out<=  o_led_out;

53.             endcase

54.         end

55.     end

56. endmodule

1.1.3.  功能仿真

我们不再列出仿真代码,大家可以参考sim文件夹下的代码。双击的批处理文件modelsim_run.bat,就可以启动仿真,调出仿真结果,如下图。可以看到我们模拟8次按键操作,每次按键松开时,LED指示灯都切换至不同的输出状态。

下面我们再通过仿真,具体看一下边沿检测的时序仿真结果。我们找到任意一个i_key信号的上升沿,放大至下图。可以看到i_key先置1,而key_sfr的bit0延迟了一个时钟周期后才置1。key_sfr的bit1则比i_key信号延迟了2个时钟周期,而key_sfr的bit2则比i_key信号延迟了3个时钟周期。上升沿标志信号w_key_rise比实际i_key上升沿是延迟了2个时钟周期的。大家在今后的设计中一定要注意这些时序的小细节,考虑这些延迟是否会给你的设计带来问题。

1.1.4.  实验结果

根据第四章2.4.6节介绍的程序烧写方法,将工程烧写文件烧写至FPGA中,观察现象,并验证设计的正确性。

边沿检测方法-FPGA入门教程的更多相关文章

  1. 如何新建Quartus工程—FPGA入门教程【钛白Logic】

    这一章我们来实现第一个FPGA工程—LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...

  2. Quartus II 安装教程—FPGA入门教程【钛白Logic】

    Quartus II 工具安装一般分为两个部分,首先是开发工具本身的安装,其次就是器件库的安装,我们可以根据我们的需要选择相应的器件库来安装,这里我们使用Cyclone IV的FPGA,即安装Cycl ...

  3. Quartus II 破解教程—FPGA入门教程【钛白Logic】

    这一节主要说明如何破解Quartus II 13.1.首先找到我们提供的破解工具,这里我们的电脑是64位的,所以使用64位破解器.如下图. 第一步:将破解工具拷贝到安装目录下“D:\altera\13 ...

  4. 系列文章 -- OpenCV入门教程

     <OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之 ...

  5. FPGA基础入门篇(四) 边沿检测电路

    FPGA基础入门篇(四)--边沿检测电路 一.边沿检测 边沿检测,就是检测输入信号,或者FPGA内部逻辑信号的跳变,即上升沿或者下降沿的检测.在检测到所需要的边沿后产生一个高电平的脉冲.这在FPGA电 ...

  6. FPGA编程技巧系列之按键边沿检测

    抖动的产生: 通常的按键所用开关为机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开.因而在闭合及断开的瞬间均伴随有一连串的 ...

  7. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...

  8. Web前端入门教程之浏览器兼容问题及解决方法

    JavaScript 被称为JS,是作为浏览器的内置脚本语言,为我们提供操控浏览器的能力,可以让网页呈现出各种特殊效果,为用户提供友好的互动体验.JS是Web前端入门教程中的重点和难点,而浏览器兼容性 ...

  9.  FPGA边沿检测Verilog代码

    FPGA边沿检测Verilog代码(上升沿,下降沿,双边沿) 实现思路:用两个一位寄存器直接异或可以实现 代码实现: ​ module edge_detect( input clk, input rs ...

随机推荐

  1. Debug时含有的子元素,在代码里获取不到的问题

    比如,Debug时如下图展示: 我想要获取的是:ansList.get(i).getComponent().getConnectorId() debug时明明有这个元素,但是当我写出来的时候却发现:a ...

  2. 【AtCoder010】B - Boxes(差分)

    AtCoder Grand Contest 010 B题 题目链接 题意 n个盒子,第i个盒子有ai个石头. 重复这个步骤:选一个盒子i,每次从第i+j个盒子中移走j个石头,j从1到n,第n+k个盒子 ...

  3. 【Luogu4630】【APIO2018】 Duathlon 铁人两项 (圆方树)

    Description ​ 给你一张\(~n~\)个点\(~m~\)条边的无向图,求有多少个三元组\(~(x, ~y, ~z)~\)满足存在一条从\(~x~\)到\(~z~\)并且经过\(~y~\)的 ...

  4. 机器学习&深度学习资料收集

    缘由 以下博客都是我在学习过程中看到的一些知识讲解非常好的博文,就不转载了,直接给出链接方便以后重复访问.有了自己的理解之后再重新整理资料发布吧 : ) sklearn系列 http://www.cn ...

  5. 洛谷 画栅栏Painting the Fence 解题报告

    P2205 画栅栏Painting the Fence 题目描述 \(Farmer\) \(John\) 想出了一个给牛棚旁的长围墙涂色的好方法.(为了简单起见,我们把围墙看做一维的数轴,每一个单位长 ...

  6. 最长公共子序列LCS(POJ1458)

    转载自:https://www.cnblogs.com/huashanqingzhu/p/7423745.html 题目链接:http://poj.org/problem?id=1458 题目大意:给 ...

  7. java匹配竖线的错误警示

    String s1 = "|"; // 输出 | System.out.println(s1); String s2 = s1.replaceAll("|",& ...

  8. react与fetch

    JavaScript 中的 ajax 很早之前就有一个诟病----复杂业务下的 callback 嵌套的问题.promise 正是 js 中解决这一问题的钥匙. 接下来我们在react项目中应用到的f ...

  9. 01-HTML5的介绍

    本章知识点 HTML5介绍 什么是 HTML5 HTML的新特性 HTML新增的语义化标签 HTML5介绍 HTML5,在2014年10月由万维网联盟(W3C)完成标准制定. HTML5的设计目的是为 ...

  10. 7.14 Git 工具 - 凭证存储

    凭证存储 如果你使用的是 SSH 方式连接远端,并且设置了一个没有口令的密钥,这样就可以在不输入用户名和密码的情况下安全地传输数据. 然而,这对 HTTP 协议来说是不可能的 —— 每一个连接都是需要 ...