数字设计

   

一、关于组合逻辑

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

  消除毛刺(冒险):(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. ld: library not found for -lstdc++.6

    ld: library not found for -lstdc++.6 Xcode10 删除 libstdc++.6.tbd libstdc++.6.0.9.tbd 用 libc++.tbd lib ...

  2. [svc]容器网络学习索引及网络监控

    整理的可能有些误失,抽时间在细细的分类完善下. 发现这篇对于网络从低到高层协议整理的还不错 每层都有一些有意思的话题 一些协议有一些设计上的弱点, 所以产生了种种的网络层安全问题 一般我们学一些 1, ...

  3. idea maven 集成多模块 module

    首先第一步创建 顶级项目  也就是父项目 在创面那部中 不管你勾不勾 create from 那个选项 都无所谓,最终创建的项目要全删的 ,只保留pom.xml 父项目结构 接下来 创建子项目  也是 ...

  4. JAVA获取apk包的package和launchable-activity名称(完善成EXE版)

    出来混迟早是要还的. 在这一篇中https://www.cnblogs.com/sincoolvip/p/5882817.html,只是简单讲了一下获取apk包的package和launchable- ...

  5. ROS常用命令汇总

    ROS系统也是通过命令行操作,总结了下平时工作中使用的命令工具,以后使用多会陆续添加. 查看ROS_PACKAGE_PATH环境变量 $ echo $ROS_PACKAGE_PATH /home/sa ...

  6. thinkphp5 composer

    前提:已安装composer 1.安装包 https://packagist.org/?query=thinkphp ,tp的各种安装包 2.安装 //安装命令, composer create-pr ...

  7. UEditor在asp.netMVC4中的使用,包括上传功能,粘贴表格不显示边框问题

    网页编程中在线编辑器的使用还是很重要的,最近研究了一下百度出的UEditor编辑器,把它结合到刚学的asp.netMVC+EF中,同时实现上传资料(包括图片,视频等)功能,下面就以一个最简单的新闻管理 ...

  8. Ubuntu16.04首次root登录设置

    一.首次登录root模式设置 当第一次安装并登录Ubuntu16.04系统时,系统默认只能使用guest模式登录.登录系统后,在图像界面的右上方的系统设置中可转换为普通用户模式. 在普通登录模式下,经 ...

  9. 必问的Java集合框架面试题

    Arraylist 与 LinkedList 异同 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全: 底层数据结构: Arraylist 底层使用 ...

  10. ganglia-gmetad 配置文件

    gmetad 主要用来收集和汇聚gmond所收集的指标数据的守护进程,通过tcp端口8651监听其他gmetad连接,并向授权的主机提供xml格式的网络状态,gmetad通过tcp端口8652 对交互 ...