数字设计

   

一、关于组合逻辑

  竞争冒险:一个逻辑门的多个输入信号同时跳变(路径时延不同,使得状态改变的时刻有先有后)。这种现象叫做竞争,引起的结果称为冒险。

  消除毛刺(冒险):(1)增加冗余项;(2)加滤波电容;(3)加选通信号;

    注:在平常实践中,可以使用如下小细节:(1)输出加D触发器;(2)使用格雷码;

  

   注意理解组合逻辑与时序逻辑的差别。

二、关于时序逻辑

1. 时钟基础

  1.1 常见时钟类型

    (1)全局时钟

    (2)内部逻辑时钟,即组合逻辑和计数器分频产生的时钟。对于前者,一般禁止使用,对于后者,也应尽量少使用(用PLL、DLL、DCM替代);

    (3)门控时钟;(一般在组合逻辑中使用,且驱动门控时钟的逻辑都是只包含一个与门/或门,尽量避免使用,除非要求被使用以降低系统功耗)

        推荐的门控时钟电路:  

          

        (拓展)使能时钟:主要是用于时序逻辑中,比门控时钟要来的稳定。

  1.2 时钟抖动

    芯片的某一个给定点上时钟周期发生暂时性变化,也就是说时钟周期在不同的周期上可能加长或缩短。它是一个平均值为0的平均变量。

  1.3 Xilinx中与全局时钟资源和 DLL相关的硬件原语

    IBUFG,IBUFGDS,BUFG,BUFGP,BUFGCE,BUFGMUX,BUFGDLL,DCM等。

  1.4 同步电路设计

    概念:所有电路均在同一时钟的上升沿或者下降沿触发下同步地工作。(多时钟应被视为同步电路概念的延伸,这个时候应尽量做到局部同步)

    设计准则:

      (1)尽可能使用统一时钟,并走全局时钟网络;

      (2)避免使用混合时钟沿采样数据(即同时使用上升沿和下降沿);

      (3)尽量少使用分频器产生的时钟;

      (4)避免使用门控时钟;

      (5)当需要多个时钟时,尽量使局部同步(分成多个模块,每个模块一个时钟);

    个人总结

     同步逻辑和异步逻辑的概念应该都属于同步电路的范畴,它们都是由时钟来控制电路状态的跳变,只不过前者是有统一的时钟或时钟之间有固定的因果关系,后者则相反。

     同步电路和异步电路的区别是:同步电路利用时钟脉冲使其子系统同步工作,而异步电路不依赖时钟,其逻辑输出和任何时钟信号都没关系,主要是组合逻辑电路。

  1.5 FPGA设计中如何实现同步时序电路的延时

    小延时:寄存器打一拍或几拍;

    大延时:利用高速时钟产生计数器,用计数器控制延时;

2. 寄存器(reg)基础

  (1)reg、wire。

    

  (2)基础寄存器

      

  (3)带异步复位的寄存器

      

  (4)带异步置位的寄存器

      

  (5)既带异步复位又带异步置位的寄存器

      

     注:这种情况下,当可能出现set和clr同时有效时,可通过if……else语句设置优先级(比如使异步复位的优先级较高),综合出的电路为:

      

  (6)带同步使能的寄存器

      

3.建立、保持时间及亚稳态

  3.1 建立、保持时间
  3.2 亚稳态的产生

   如果触发器不满足建立时间和保持时间,则会进入亚稳态,即:触发器无法在某个规定的时间段内到达一个可以确认的状态。

  3.3 如何消除

   只要系统中有异步元件,亚稳态就是无法避免的,亚稳态主要发生在异步信号检测、跨时钟域信号传输以及复位电路等常用设计中。针对这几种应用情况,改善方法如下:

   3.3.1 降低系统工作时钟

   3.3.2 用反应更快的触发器

   3.3.3 引入同步机制  

    (1)对异步信号进行同步处理(加两级寄存器,即“一位同步器”);

    

    (2)采用FIFO对跨时钟域数据通信进行缓冲设计;

    (3)对复位电路采用异步复位、同步释放方式处理。

   3.3.4 改善时钟质量,用边沿变化快速的时钟信号

三、FPGA构造

1. 整体构造

  可配置逻辑块(查找表+触发器) + 内部连接线 + 输入输出单元。(当然,现在的FPGA都比较复杂,芯片上通常还包含其他丰富的资源)

      

  复杂FPGA:

    

2.查找表构造和原理

  查找表(look-up-table)简称为LUT,LUT本质上就是一个RAM。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有 4位地址线的16x1的RAM。

  当用户通过原理图或HDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。

3.存储资源

3.1 FPGA中有哪两种存储器资源

  一种叫BLOCK RAM,另一种是由LUT配置成的内部存储器(也就是分布式RAM)。

  注意:BLOCK RAM由一定数量固定大小的存储块构成的,使用BLOCK RAM资源不占用额外的逻辑资源,并且速度快。但是使用的时候消耗的BLOCK RAM资源是其块大小的整数倍。

3.2 FPGA中可以综合实现为RAM/ROM/CAM的三种资源

  BLOCK RAM ,触发器(FF),查找表(LUT)。

四、RTL设计思想及需要注意的问题

1. 基本描述方式

 (1)数据流描述:assign语句,连续赋值语句

 (2)行为级描述:always、initial语句,过程赋值语句

 (3)结构化描述:实例化功能模块

2. 阻塞和非阻塞赋值

3. 代码的可综合性

   行为级描述可基于不同的层次,如系统级、算法级、寄存器传输级(RTL级)、门级、开关级。目前的EDA工具只能综合RTL级以下的描述方式。

4. 能提升系统性能的代码风格

 (1)流水线技术;(用寄存器分割较大的组合逻辑,提高设计频率)

 (2)资源共享;(节省面积)

 (3)逻辑复制;(用面积来换取时序性能的改善)

 (4)改善关键路径的逻辑等级;

 (5)消除组合逻辑的毛刺;

5. 状态机

  5.1 分类——Moore型和Mealy型

    Moore状态机:当前输出只与当前状态有关;(a)

    Mealy状态机:当前输出与当前状态以及当前输入有关;(b)

    

  5.2 写法

   推荐使用两段式(2个always块)或者三段式(3个always块)写法。

    (1)两段式

    

     (2)三段式

       

  总体来说,三段式是最优的状态机书写方式:    

//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器

always @ (posedge clk or negedge rst_n)   //异步复位

if(!rst_n)

    current_state <= IDLE;

else

    current_state <= next_state;//注意,使用的是非阻塞赋值

//第二个进程,组合逻辑always模块,描述状态转移条件判断

always @ (current_state)    //电平触发

   begin

     next_state = x;   //要初始化,使得系统复位后能进入正确的状态

     case(current_state)

     S1: if(...)

        next_state = S2;   //阻塞赋值

     ...

     endcase

end

//第三个进程,同步时序always模块,格式化描述次态寄存器输出

always @ (posedge clk or negedge rst_n)

...//初始化

case(next_state)

S1:

    out1 <= 'b1;   //注意是非阻塞逻辑

S2:

    out2 <= 'b1;

default:...    //default的作用是免除综合工具综合出锁存器。

endcase

end

//三段式并不是一定要写为3个always块,如果状态机更复杂,就不止3段了。

但是需要注意:

(1)第三段使用next_state和current_state的区别在于,当状态跳转时,基于next_state的输出是立刻变化的,而基于current_state输出会延迟一个周期,其他情况都一样,应该根据自己的时序要求,选择用next_state还是current_state。

(2)两段式在组合逻辑特别复杂时适用,但要注意需在后面加一个触发器以消除组合逻辑对输出产生的毛刺。三段式没有这个问题,由于第三个always会生成触发器。

(3)第二个always块中,组合逻辑电平要维持超过一个clock。

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码,一个完备的状态机应该有初始状态和默认状态。

FPGA总结——杂谈的更多相关文章

  1. FPGA与simulink联合实时环路系列——实验三 按键key

    实验三 按键key 实验内容 在FPGA的实验中,经常涉及到按键的使用,按键是必不可少的人机交互的器件之一,在这些实验中,有时将按键的键值读取显示到数码管.LCD或者是通过串口传送到PC的串口助手上进 ...

  2. FPGA与simulink联合实时环路系列——实验二LED

    实验二LED 实验内容 在实验一的基础上,将simulink产生的测试信号输出到FPGA开发板上的LED灯进行显示,这里要在生成的硬件模型上进行修改,将传送到FPGA的信号输出到8个LED灯上,并且对 ...

  3. FPGA优化之高扇出

    Fanout即扇出,模块直接调用的下级模块的个数,如果这个数值过大的话,在FPGA直接表现为net delay较大,不利于时序收敛.因此,在写代码时应尽量避免高扇出的情况.但是,在某些特殊情况下,受到 ...

  4. 关于 FPGA 内部信号扇入扇出

    扇入.扇出系数 扇入系数是指门电路允许的输入端数目.一般门电路的扇入系数为1—5,最多不超过8.扇出系数是指一个门的输出端所驱动同类型门的个数,或称负载能力.一般门电路的扇出系数为8,驱动器的扇出系数 ...

  5. FPGA Timing笔记

    很多FPGA工程师都会遇到timing的问题,如何让FPGA跑到更快的处理频率是永久话题.决定FPGA的timing关键是什么?如何才能跑到更快的频率呢? A. 第一步需要了解FPGA的timing路 ...

  6. FPGA的引脚VCCINT 、VCCIO VCCA

    首先是看到FPGA在配置的时候有三种不同的电VCCINT .VCCIO VCCA,于是就查了下有什么不同: FPGA一般会有许多引脚,那它们都有什么用呢? VCCINT为施加于 FPGA 内核逻辑的电 ...

  7. 【转】PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数

    原文地址: PHP 杂谈<重构-改善既有代码的设计>之一 重新组织你的函数 思维导图   点击下图,可以看大图.    介绍   我把我比较喜欢的和比较关注的地方写下来和大家分享.上次我写 ...

  8. FPGA与simulink联合实时环路系列——实验一 测试

    实验一 测试 实验内容 在simulink创建测试模块,通过测试模块产生信号,再传送到FPGA,FPGA读出后再将信号无处理传送回simulink进行显示.由此来测试整个硬件在环的功能是否正常,并且熟 ...

  9. FPGA与simulink联合实时环路系列—开篇

    FPGA与simulink联合实时环路系列—开篇 作为网络上第一个开源此技术,笔者迫不及待地想将此技术分享出来,希望大家多多支持.笔者从2011年接触FPGA以来,从各个方面使用FPGA,无论是控制. ...

随机推荐

  1. [ci]容器ci索引

    伙计们: 有任何意见或建议或看不懂的请在对应的文章下留言(请注明上下文) 我会及时改动. 这是以前的一些在物理机上搞过 [ci]容器ci索引 http://www.cnblogs.com/iiiihe ...

  2. 【iCore4 双核心板_uC/OS-II】例程十一:内存管理

    一.实验说明: 应用程序在运行中为了某种特殊需要,经常需要临时获得一些内存空间.而作为比较完善的操作系统uC/OS-II,也具有动态分配内存的能力. uC/OS-II对内存进行两级管理:把连续内存分成 ...

  3. HIVE metastore Duplicate key name 'PCS_STATS_IDX' (state=42000,code=1061)

    HDP 版本:2.4.0.0-169. 解决:将hive 所在 节点上的/usr/hdp/2.4.0.0-169/hive/script/metastore/upgrade/msql/hive-sch ...

  4. python pyenv

    使用pyenv安装多个版本的python 管理多个python环境使用 virtualenv 请看  http://www.cnblogs.com/juandx/p/5357518.html 安装py ...

  5. C++中常用的std标准容器

    从c++11标准以来,c++中std定义的几种容器的效率非常高,优化的非常好,完全没有必要自己去定义类似的数据结构.了解使用它们,可以满足90%的日常编程需要.该篇文章基于c++11标准,从用户角度来 ...

  6. GLSL版本的区别和对比

    之前尝试将一个GLSL version 110的版本写成GLSL version 330的,在此将学习过程和收获记录下来. 参考链接 GLSL Versions 介绍 你可以使用#version命令作 ...

  7. MySQL 表中添加 时间戳 字段

    场景: 有张表的数据需要用同步工具同步至其他库,需要 update_time 时间戳字段 来做增量同步. 解决方法: alter table quant_stk_calc_d_wxcp add upd ...

  8. SpringBoot系统列 2 - 配置文件,多环境配置(dev,qa,online)

    实现项目的多环境配置的方法有很多,比如通过在Pom.xml中配置profiles(最常见) 然后在Install项目打War包的时候,根据需求打不同环境的包,如图: 这种配置多环境的方法在SSM框架中 ...

  9. Java 判断字符串 中文是否为乱码

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class ChineseUtill { private ...

  10. YII2 使用phpexcel(干货)

    参考:http://www.cnblogs.com/xiaocongjiejie/p/5106249.html http://www.cnblogs.com/xiaocongjiejie/p/5106 ...