数字设计
一、关于组合逻辑
竞争冒险:一个逻辑门的多个输入信号同时跳变(路径时延不同,使得状态改变的时刻有先有后)。这种现象叫做竞争,引起的结果称为冒险。
消除毛刺(冒险):(1)增加冗余项;(2)输出加D触发器;(3)使用格雷码;(4)信号同步法;
二、关于时序逻辑
1. 时钟基础
1.1 常见时钟类型
(1)全局时钟;
(2)内部逻辑时钟,即组合逻辑和计数器分频产生的时钟。对于前者,一般禁止使用,对于后者,也应尽量少使用(用PLL替代);
(3)门控时钟;(一般在组合逻辑中使用,且驱动门控时钟的逻辑都是只包含一个与门/或门,尽量避免使用,除非要求被使用以降低系统功耗)
推荐的门控时钟电路:
(拓展)使能时钟:主要是用于时序逻辑中,比门控时钟要来的稳定。
1.2 同步电路设计
概念:所有电路均在同一时钟的上升沿或者下降沿触发下同步地工作。(多时钟应被视为同步电路概念的延伸,这个时候应尽量做到局部同步)
设计准则:
(1)尽可能使用统一时钟,并走全局时钟网络;
(2)避免使用混合时钟沿采样数据(即同时使用上升沿和下降沿);
(3)尽量少使用分频器产生的时钟;
(4)避免使用门控时钟;
(5)当需要多个时钟时,尽量使局部同步(分成多个模块,每个模块一个时钟);
个人总结:
同步逻辑和异步逻辑的概念应该都是属于同步电路里的范畴,它们都是由时钟来控制电路状态的跳变,只不过前者是有统一的时钟或时钟之间有固定的因果关系,后者则相反。
同步电路和异步电路的区别是:同步电路利用时钟脉冲使其子系统同步工作,而异步电路不依赖时钟,其逻辑输出和任何时钟信号都没关系,主要是组合逻辑电路。
2. 寄存器(reg)基础
(1)reg、wire。
(2)基础寄存器
(3)带异步复位的寄存器
(4)带异步置位的寄存器
(5)既带异步复位又带异步置位的寄存器
注:这种情况下,当可能出现set和clr同时有效时,可通过if……else语句设置优先级(比如使异步复位的优先级较高),综合出的电路为:
(6)带同步使能的寄存器
3.建立、保持时间及亚稳态
3.1 建立、保持时间
3.2 亚稳态的产生
如果触发器不满足建立时间和保持时间,则会进入亚稳态,即:触发器无法在某个规定的时间段内到达一个可以确认的状态。
3.3如何消除
只要系统中有异步元件,亚稳态就是无法避免的,亚稳态主要发生在异步信号检测、跨时钟域信号传输以及复位电路等常用设计中。针对这几种应用情况,改善方法如下:
(1)对异步信号进行同步处理(加两级寄存器,即“一位同步器”);
(2)采用FIFO对跨时钟域数据通信进行缓冲设计;
(3)对复位电路采用异步复位、同步释放方式处理。
三、FPGA构造
可配置逻辑块(查找表+触发器) + 内部连接线 + 输入输出单元。(当然,现在的FPGA都比较复杂,芯片上通常还包含其他丰富的资源)
复杂FPGA:
四、RTL设计思想及需要注意的问题
4.1 基本描述方式
(1)数据流描述:assign语句,连续赋值语句
(2)行为级描述:always、initial语句,过程赋值语句
(3)结构化描述:实例化功能模块
4.2 阻塞和非阻塞赋值
4.3 代码的可综合性
行为级描述可基于不同的层次,如系统级、算法级、寄存器传输级(RTL级)、门级、开关级。目前的EDA工具只能综合RTL级以下的描述方式。
4.4 能提升系统性能的代码风格
(1)流水线技术;(用寄存器分割较大的组合逻辑,提高设计频率)
(2)资源共享;(节省面积)
(3)逻辑复制;(用面积来换取时序性能的改善)
(4)改善关键路径的逻辑等级;
(5)消除组合逻辑的毛刺;
4.5 状态机
推荐使用两段式(2个always块)或者三段式(3个always块)写法。
(1)两段式
(2)三段式
4.6 注意的问题
(1)在always或这initial块中被赋值的一定是reg型,在assign中被赋值的一定是wire型;
(2)一个变量不能在多个always块中被赋值;
(3)所有块和实例化模块都是并发执行的;
(4)时序逻辑使用非阻塞赋值(<=),组合逻辑使用阻塞赋值(=),且同一个块中不能混用。always块电平敏感时使用阻塞赋值;
(5)严禁组合逻辑出现反馈环路;
(6)if……else和case语句要完备,并设置default,防止产生latch;
(7)存储器的定义 reg [3:0] mem [0:7] ,位宽为4,地址0~7;
(8)状态机编码最好使用one-hot码,一个完备的状态机应该有初始状态和默认状态。
原文地址:https://www.cnblogs.com/ylsm-kb/p/9136383.html