写在前面的话

之前梦翼师兄和大家一起学习了层次化设计方法,大家应该懂了,哦,原来所谓的层次化设计就是将一个大的系统不断地拆分成一些便于实现的最小逻辑单元。如果大家真的只是这么想的话,那么梦翼师兄真的是误人子弟喽。在梦翼师兄看来,所谓的层次化设计绝不仅仅是简单的模块拆分,更重要的是要设计好组成各功能单元的各子模块之间的握手级联关系以及各功能模块之间的级联关系。这也是本节梦翼师兄想要给大家重点说明的一些问题。

电平触发

FPGA内部两个不同的模块之间通信,除了需要我们所熟知的数据总线、地址总线以外,通常还需要一些控制信号线以及模块间的握手、反馈信号。

现在我们提出一种假设,假设我们的设计中有两个这样的模块,一个是控制模块,一个是被控制的数据采集模块,简易结构如下图所示

我们将两个模块之间的控制信号定义为Start_ctl,控制模块通过Start_ctl信号控制数据采集模块启动或停止。那么就是这样的一个看似简单的逻辑,我们应该如何实现呢?我们首先来学习一种方法触发方式:电平触发。数据模块检测到Start_ctl为高电平则开始数据采集,检测到Start_ctl为低电平则停止采集。这种方式看起来很简单,但真的可以轻易地实现我们的目标吗?假设数据采集模块采集一组有效数据的时间是不确定的(根据外部输的信号的情况来决定)。那么如果我们需要控制数据采集模块只采集一组数据,当我们将Start_ctl信号置为高电平以后,数据采集模块开始采集数据,那么在什么时间我们应该将Start_ctl信号置为低电平结束采集呢?答案是:不知道。因此我们必须再设计一条反馈信号线,数据采集模块采集结束以后,将反馈信号置为高电平,控制模块接收到反馈信号之后,再将启动信号置为低电平。简易结构图如下图所示

那么这样的控制—反馈关系真的一定可以解决问题吗?如果大家够细心的话,其实还是存在隐患的。控制模块只有接收到flag信号以后才能进一步地决定Start_ctl信号的状态,那么这个过程中可能会存在周期差,那么在这个周期差的时间内,数据采集模块很可能再次被启动。因此,这点我们需要特别注意。

尖峰脉冲

除了电平触发可以作为握手信号,梦翼师兄在这里给大家分享另外一种在同步时序逻辑设计条件下,比较行之有效的方式:模块之间使用尖峰脉冲作为握手信号。示图如下:

注:这里的尖峰指的是有且只有一个时钟周期高电平的脉冲信号

模块功能介绍

模块名

功能描述

Key_scan

矩阵键盘按键扫描模块

shift

键值移位寄存模块

模块端口介绍

模块名

功能描述

Clk

系统时钟

Rst_n

系统低电平复位信号

Row

矩阵键盘“行线”

Result

移位寄存结果输出

模块内部连线介绍

模块名

功能描述

Col

矩阵键盘“列线”

Key_num

键值移位寄存模块

Key_flag

尖峰脉冲

系统功能描述

以上系统主要由两个模块组成,一个是矩阵键盘的按键扫描模块,另一个是按键值的移位、保存模块。Key_scan按键检测模块的主要任务就是负责扫描检测按键动作,并将确定的键值输出到信号线Key_num,而shift键值移位寄存模块的主要任务就是将每次检测到的键值通过移位的方式存储到一个大位宽的输出寄存器Result。

那么,试想一下,如果我们只是直接地将Key_num输入到shift模块,可以实现每次按键的正确移位寄存吗?答案一定是 NO! 因为我们每次按键的时间长短是不一定的,可能是短短的几秒,也可能是几分钟按着不放。那么这种情况下,每隔多长时间我们进行一次数据采集和移位工作呢?很明显,由于时间的不确定性,通过这种方式的模块级联,注定是要失败的。

两个模块之间的直接级联,之所以会失败是因为我们没有为两个模块设置“握手”信号,因此,我们才会设置Key_flag这样的一个信号作为两个模块之间通信的桥梁。Key_flag是一个有且只有一个时钟周期的尖峰脉冲信号,当按键检测模块检测到按键按下并将按键值输出到Key_num的同时驱动Key_flag出现一个时钟周期的高电平,之后一直置为低,直到按键放开并检测到有新的按键按下,Key_flag信号才有可能会再次出现尖峰脉冲。也就是说,每当有一个尖峰脉冲出现就代表有一个新的按键动作发生。那么,shift 模块只要检测到尖峰脉冲就可以进行一次移位操作。

由以上分析可以看出,合理、巧妙的利用尖峰脉冲可以使我们的系统变得高效而简单,同时不容易出现周期差的问题。因此,梦翼师兄建议大家做系统级联的时候,应该尽可能使用尖峰脉冲的方式而非电平触发的方式作为握手信号。

 

top_down设计技巧的更多相关文章

  1. .NET框架设计(常被忽视的C#设计技巧)

    阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...

  2. .NET框架设计(常被忽视的框架设计技巧)

    阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...

  3. objc@interface的设计哲学与设计技巧

    blog.sunnyxx.com 我是前言 学习objc时,尤其是先学过其他编程语言再来看objc时,总会对objc的类声明的关键字interface感到有点奇怪,在其它面向对象的语言中通常由clas ...

  4. .NET框架设计—常被忽视的框架设计技巧

    阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...

  5. WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心

    原文:WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心 流文档是WPF中的一种独特的文档承载格式,它的书写和呈现方式都很像HTML,它也几乎具备了HTML的绝大多数优势,并提供了更 ...

  6. WPF界面设计技巧(10)-样式的继承

    原文:WPF界面设计技巧(10)-样式的继承 PS:现在我的MailMail完工了,进入内测阶段了,终于可以腾出手来写写教程了哈,关于MailMail的介绍及内测程序索取:http://www.cnb ...

  7. WPF界面设计技巧(9)—使用UI自动化布局

    原文:WPF界面设计技巧(9)-使用UI自动化布局 最近一直没时间更新这系列文章,因为我一直在埋头编写我的第一个WPF应用程序:MailMail 今天开始编写附属的加密/解密工具,对UI自动化布局有些 ...

  8. WPF界面设计技巧(8)—自制山寨版CheckListBox

    原文:WPF界面设计技巧(8)-自制山寨版CheckListBox 近年来IT市场山寨横行啊,我们今天也来发扬一下山寨精神,搞个自制的CheckListBox出来. 喏,CheckListBox 就是 ...

  9. WPF界面设计技巧(7)—模拟电梯升降的缓动动画

    原文:WPF界面设计技巧(7)-模拟电梯升降的缓动动画 如同Flash一样,WPF的亮点之一也在于其擅于表现平滑的动画效果,但以移动动画来说,仅凭简单的起始位置.目标位置,所产生的动画仍会非常生硬,这 ...

随机推荐

  1. 【C/C++】随机数的生成

    C/C++:rand()函数 rand()函数的头文件:#include<stdlib.h> 该函数产生的随机数随机性差,速度慢,周期小(0-32767) 用法如下所示: #include ...

  2. 【Kubernetes 系列三】Kubernetes 学习文档推荐

    标题 地址 备注 Kubernetes 官方文档 https://kubernetes.io/docs 英文文档,全面 Kubernetes Handbook ttps://jimmysong.io/ ...

  3. HTML加载FLASH(*.swf文件)详解

    引言 在web项目中经常会遇到在线浏览word文档,通常解决方法将word转换成pdf,然后在线浏览,但是在实际实现过程中,由于阅读器的原因,用户可以直接下载该pdf,这显然不是我们想要的,通过网络搜 ...

  4. trec 2019 fair ranking track

    trec 2019 fair ranking track     最近实验室要求参加trec 2019新出的track:fair ranking track.这里整理一下该任务的思想和要求.这次tra ...

  5. windows 下 ctags 安装以及 tags 目录创建

    最近处理 .as 格式代码,需要转换成 c# 格式, 用 VS 查看,无法跳转,十分蛋疼,又用起了好久没用的 VIM,配置 tags 文件,实现自动跳转. 1.下载ctag文件http://ctags ...

  6. python3 how to creat alphabet

    Python: How To Generate a List Of Letters In The Alphabet  Method 1# First we need to figure out the ...

  7. virtualenv使用和virtualenvwrapper使用笔记

    virtualenv使用笔记 1.安装 pip install virtualenv 2.创建虚拟环境 virtualenv env //对于python2.7,该虚拟环境env必须在英文目录路径下 ...

  8. 小白学Python(1)——安装与调试,“你好,世界”,“hello,world”

    之前从没接触过编程之类的东西,在网上下载个自己需要的软件真实比较麻烦,找了半天总是没有合适的,好不容易找到了,不过那家公司已经倒闭了,软件不更新也运行不了了,于是乎,求人不如求己,自己没事编程吧. 在 ...

  9. python+Selenium-字符运行报错问题

    最近开始接触自动化测试,在写一个简单的查询脚本时,遇到编码无法识别的问题 SyntaxError: Non-ASCII character '\xe5' in file F:/soft_Test/py ...

  10. VS引用文件出现黄色感叹号丢失文件,应该如何解决?

    VS是微软开发的一款超级强大的IDE,深受广大.net开发者喜爱. 但是再强大,也会有它的bug和缺点. 多人协同开发时,不知道你有没有遇到一个这样的情况:第二天上班,早早来到公司,打开电脑,拉取一下 ...