逻辑设计中复位的稳妥处理方法?
前言
看别人的好设计,能让自己从细节上提升,所谓好的设计,除了从各种指标上评判,我们都知道,设计的兼容性(参数化),可读性,可扩展性等等,可是既然是学习,我们本身就不知道什么样的才是好的,这些指标也分辨不出来,怎么办呢?
那就不如简单粗暴些,看官方的例程,例如Xilinx的例程,不过我也需要澄清一点,我并不是说官方的设计一定是好的设计,例如我曾见过A家的uart设计,那风格简直了,各个模块都放到一个文件里,就这一点就不可原谅。
当然,原因也可能人家就不是自己写的,机器生成的罢了。
对于官方的设计,很多地方还是值得学习的,见过的逻辑设计多了, 我们就可以去辨别,对好的设计也颇为感觉,工程师的洁癖以及共识,会让你不自觉的认为这种设计是好的。(今天的内容借鉴与X家的例程:wavegen)
今天的话题是复位,当然对于复位,我在学生时期就总结很多,什么异步复位以及同步复位的好处,但总归,这些复位方式都有一些弊端,看会不会对你的工程产生影响,如果工程的结构就不在乎,那直接异步复位简单粗暴也无可厚非,但很多设计是对复位敏感的。
如果要使用复位让所有模块一起工作,作为一种起点性的东西(你有更充分的理由吗?欢迎打出来告诉大家),复位还是需要设计的,推荐的方式,老生常谈,就是异步复位,同步释放。
逻辑设计
可以设计成一个模块,供工程调用,代码可读性强,清晰明了,是好的设计。
module reset_bridge (input clk_dst, // Destination clockinput rst_in, // Asynchronous reset signaloutput reg rst_dst // Synchronized reset signal
);//......endmodule
模块名reset_bridge,很不错的名字。
废话不多说,上图:
对于高电平复位信号,使用时钟对其两拍同步,当然起点位置一定要和原复位信号一致,保证能检测到复位,复位的结束位置是设计的精华,重点,那就是大家要同时释放,用时钟采样复位结束位置,保证同步,且保证复位长度至少一个时钟,这里打两拍,复位长度就为两个时钟了。
如下图示意:
对于低电平复位,下图示意:
后面就只讨论高电平复位了,低电平复位留作作业。
为什么上面强调打两拍使用呢?
这是因为输入的复位信号是一个异步信号,什么时候都可能出现,如果出现的位置不巧,不满足时钟采样的建立保持时间,就会出现亚稳态,也就是在下图圈出来的位置,不知道是高电平还是低电平,不确定:
那就达不到设计的初衷,从设计上就解决这种时序问题,后面还可以在时序约束时候,直接false复位路径,不做考虑。
于是我们使用的复位信号,在其他模块中使用的复位信号是最后一个信号rst_dst。
好了,就这样,直接分享A家的Verilog逻辑:
//-----------------------------------------------------------------------------
//
// Copyright (c) 2008 Xilinx Inc.
//
// Project : Programmable Wave Generator
// Module : reset_bridge.v
// Parent : Various
// Children : None
//
// Description:
// This is a specialized metastability hardener intended for use in the
// reset path. The reset will assert ASYNCHRONOUSLY when the input reset is
// asserted, but will deassert synchronously.
//
// In designs with asynchronous reset flip-flops, this generates a reset
// that can meet the "recovery time" requirement of the flip-flop (be sure
// to enable the recovery time arc checking - ENABLE=reg_sr_r).
//
// In designs with synchronous resets, it ensures that the reset is
// available before the first valid clock pulse arrives.
//
// Parameters:
// None
//
// Notes :
//
// Multicycle and False Paths, Timing Exceptions
// A tighter timing constraint should be placed between the rst_meta
// and rst_dst flip-flops to allow for meta-stability settling time
//`timescale 1ns/1psmodule reset_bridge (input clk_dst, // Destination clockinput rst_in, // Asynchronous reset signaloutput reg rst_dst // Synchronized reset signal
);//***************************************************************************
// Register declarations
//***************************************************************************reg rst_meta; // After sampling the async rst, this has// a high probability of being metastable.// The second sampling (rst_dst) has// a much lower probability of being// metastable//***************************************************************************
// Code
//***************************************************************************always @(posedge clk_dst or posedge rst_in)beginif (rst_in)beginrst_meta <= 1'b1;rst_dst <= 1'b1;endelse // if !rst_dstbeginrst_meta <= 1'b0;rst_dst <= rst_meta;end // if rstend // alwaysendmodule
关于时序上的分析,可见:
【 FPGA/IC 】谈谈复位
逻辑设计中复位的稳妥处理方法?相关推荐
- FPGA的设计艺术(16)逻辑设计中无刻不在的判断之if/case语句
前言 Verilog中的if或者case语句十分简单,但确实十分重要,我们的逻辑设计可以说一定离不开它,我们时时刻刻使用它,我们使用它进行建模,通常对应的是多路选择器这样的硬件单元或者变种. 我们通常 ...
- 逻辑设计中需要显式地使用IBUF以及OBUF类似的原语吗?
前言 平日里写博文都是长文,或者稍长文,但是最近感觉这样既不利于看,也不利于写? 不利于写很好理解,就是大家都有自己的正式事业,上班或者上学,没有整体的时间去写文章,这会导致像我一样,一次断更,甚至达 ...
- allegro差分信号走线_浅谈硬件设计中的一些思路和方法(5)—信号系统,又学到了...
房价在涨,客户需求在涨,体重在涨,房租在涨,火气在涨,唯一不涨的大概只有薪资了??? 现在客户好套路啊~我们卖的A+B,他非要让我在B上开一个兼容C的口子,然后他用C+B.问题是C不是我们的产品啊~让 ...
- FPGA逻辑设计回顾(11)FPGA以及PC中的RAM与ROM
文章目录 前言 RAM以及ROM在计算机中的应用 什么是存储器? 什么是硬盘驱动器? 其他类型的存储器 什么是RAM? RAM的类型 SRAM DRAM 什么是ROM? ROM的类型 掩膜ROM PR ...
- java物理架构_Java应用架构读书笔记(1):物理设计与逻辑设计
逻辑设计 几乎大部分帮助软件设计和架构的原则和模式主要都是关注逻辑设计.逻辑设计主要关于语言构造块,比如类,操作符,方法和包.识别一个类的方法,类之间的关系,系统包的接口等问题都是逻辑设计相关的问题. ...
- 数据库设计-逻辑设计
数据库设计 逻辑设计: 什么是逻辑设计? 独立于具体的物理数据库之外,抽象出的数据库通用的设计模型. 逻辑设计是做什么的? 将需求分析转化为数据库的逻辑模型. 通过常用的数据库设计方法,如ER图对逻辑 ...
- 软件项目工作量估算中使用的功能点方法是什么?
简单的说,功能点方法是一种估算软件项目大小的方法,它是从用户视角出发,通过量化系统功能来度量软件的规模,这种度量主要基于系统的逻辑设计.功能点规模度量方法在国际上的应用已经比较广泛,并且已经取代代码行 ...
- 数据库设计-逻辑设计 1
数据库设计 逻辑设计: 什么是逻辑设计? 独立于具体的物理数据库之外,抽象出的数据库通用的设计模型. 逻辑设计是做什么的? 将需求分析转化为数据库的逻辑模型. 通过常用的数据库设计方法,如ER图对逻辑 ...
- FPGA的设计艺术(15)逻辑设计及仿真利器之各式各样的循环
前言 Verilog中的循环各式各样,例如,for循环,while循环,forever循环和repeat循环,有的可以综合有的不可用综合,就凭这一条特点,就能在逻辑设计中排除很多种循环语句,对于设计来 ...
最新文章
- c# dialogresult 选择文件_C#实战037:一个简单的入门应用程序NXPlug install
- Linux下常用日志分析工具
- 一个分支强制替代另一个分支
- 面试必备Linux基础知识
- adb隐藏状态栏图标_[应用]华为手机怎么设置隐藏状态栏上的图标
- Drupal常用开发工具(一)——Devel模块
- 玩转 Java8 Stream,常用方法大合集
- phpstorm统计程序行数_Python 实现代码行数统计
- 即学即会 Serverless | 初识 Serverless 架构
- Django表单提交数据与网页跳转
- 配置rsync同步+inotify实时监控
- ubuntu目录结构
- Excel导入txt数据乱码
- 【每日一具9】Gif动画录制工具
- Vue3.0调用PC端本地摄像头录像
- Facebook承诺为普通市民提供1500套住房
- android下载文件地址,安卓迅雷下载的文件在哪里迅雷下载文件存放位置-独木成林...
- Linux负载均衡解决方案 -- LVS 理论概述
- JAVASE高级部分
- 2018年总结, 2019年规划
热门文章
- java选择哪款eclipse_写java程序用哪一个版的eclipse比较好
- h3c交换机限制端口访问_H3C交换机端口限速和流量监管典型配置指导
- @query 注解的定义_SpringDataJpa(5)---定义查询方法
- 基于matlab_simulink的捷联惯性导航系统仿真,基于MATLAB/Simulink的捷联惯性导航系统仿真...
- k2677场效应管参数引脚_场效应管参数大全2.doc
- python装饰器执行顺序_python unittest单元测试框架-3用例执行顺序、多级目录、装饰器、fixtures...
- 小米履带机器人充电时一直响_小米有品上线擦地机器人,每天放出去溜一圈,老婆夸我家务做的好...
- linux mysql 1045 错误_Linux 下,mysql数据库报无法登陆错误:ERROR 1045 (28000): Access denied for use...
- 土地利用转移矩阵图怎么做_土地利用转移矩阵生成的几种方法
- 计算机应用基础word表说课,制作word表格说课课件.ppt