FPGA基础——杂谈

数字设计

   

一、关于组合逻辑

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

  消除毛刺(冒险):(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

时间: 2024-08-03 22:18:59

FPGA基础——杂谈的相关文章

FPGA基础设计(四):IIC协议

很多数字传感器.数字控制的芯片(DDS.串行ADC.串行DAC)都是通过IIC总线来和控制器通信的.不过IIC协议仍然是一种慢速的通信方式,标准IIC速率为100kbit/s,快速模式速率为400kbit/s.本文致力于讲述如何用计数器控制和分频时钟控制两种方式完成IIC的读写操作. IIC协议 ??IIC协议是一种多机通讯,由SDA数据线和SCL时钟线构成串行总线,所有的IIC设备都可以挂载到总线上,但每个设备都有唯一的设备读地址和设备写地址.在使用IIC作为数字接口的芯片datasheet中

FPGA基础入门篇(四) 边沿检测电路

FPGA基础入门篇(四)--边沿检测电路 一.边沿检测 边沿检测,就是检测输入信号,或者FPGA内部逻辑信号的跳变,即上升沿或者下降沿的检测.在检测到所需要的边沿后产生一个高电平的脉冲.这在FPGA电路设计中相当的广泛. 没有复位的情况下,正常的工作流程如下: (1)D触发器经过时钟clk的触发,输出trigger信号,保存了t0时刻的信号. (2)同时由trigger通过非门输出信号,保留了当前时刻t1的触发信号 (3)经过与门输出信号pos_edge,neg_edge a) 只有t0时刻为高

FPGA基础知识6(FPGA时钟系统及多时钟系统处理)

需求说明:FPGA基本知识 内容       :第一部分  FPGA各个时钟说明 第二部分  FPGA时钟总结 第三部分  异步时钟同步化及门控时钟 来自       :时间的诗 第一部分  FPGA各个时钟说明 来自:http://blog.chinaunix.net/uid-7547035-id-60220.html 1.         FPGA的全局时钟是什么? FPGA的全局时钟应该是从晶振分出来的,最原始的频率.其他需要的各种频率都是在这个基础上利用PLL或者其他分频手段得到的. 2

FPGA基础知识(四)锁存器、触发器、寄存器和缓冲器的区别

一.锁存器锁存器(latch)---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化.锁存器不同于触发器,它不在锁存数据时,输出端的信号随输入信号变化,就像信号通过一个缓冲器一样:一旦锁存信号起锁存作用,则数据被锁住,输入信号不起作用.锁存器也称为透明锁存器,指的是不锁存时输出对于输入是透明的.锁存器(latch):我听过的最多的就是它是电平触发的,呵呵.锁存器是

FPGA基础知识10(锁存器、触发器、寄存器和缓冲器的区别)

需求说明:IC设计基础 内容       :锁存器.触发器.寄存器和缓冲器的区别 来自       :时间的诗 原文:http://www.cnblogs.com/wwping/articles/2261312.html 一.锁存器 锁存器(latch)---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态 锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化. 锁存器不同于触发器,它不在锁存数据时,输出端的信号随

FPGA基础知识0(查找表LUT和编程方式)

资料来源:http://wenku.baidu.com/link?url=QoNSMH7pejiuGqV22sKLVTr2zdHxORcr0R3RnOlNuK17164pHfnBtleayAFQn72Ge2wNUPteF8mcqoGpbEIVWbKWImZCXVVkKhd9oFsSmHC 第一部分: 查找表LUT FPGA是在PAL.GAL.EPLD.CPLD等可编程器件的基础上进一步发展的产物.它是作为ASIC领域中的一种半定制电路而出现的,即解决了定制电路的不足,又克服了原有可编程器件门电路

C#学习之基础杂谈

这周三晚上上了第二节C#,章老师详细介绍了C#的一些基础知识.因为大部分都和C++,JAVA等语言类似,所以此处不再赘述,只略微记录一下一些我自己认为比较重要,容易出错抑或与其他语言不大一样之处. 1.类型转换 在C#中,下列赋值语句: 值域大的变量  = 值域小的变量是可以通过编译的,而 值域小的变量  = 值域大的变量 这样的赋值语句是不能通过编译的.如下列代码: 1 short x=5; 2 //赋值语句: 值域大的变量 = 值域小的变量: 3 //编译可通过,y的值为5,隐式类型转换成功

FPGA基础 之逻辑单元

逻辑单元在FPGA内部,是用于完成用户逻辑的最小单元 逻辑单元在ALTERA叫作(Logic Element, LE )        LE, 在XILINX里叫做LC(LOGIC CELL) 逻辑单元与逻辑阵列 a)         逻辑单元在FPGA内部,用于完成用户逻辑的最小单元.一个逻辑阵列包含16个逻辑单元以及一些其他资源,在一个逻辑阵列内部的16个逻辑单元有更为紧密的联系,可以实现特有的功能. 一个逻辑单元主要由以下部件组成:一个四输入的查询表(LookUpTable,LUT),一个

FPGA基础知识1

1.乘法 在FPGA中,乘法运算可以分为 1)信号与信号之间的运算,用乘法器核实现: 2)常数与信号之间的运算,利用移位及加减法实现. A x 16 = A左移4位: A x 20 = A x 16 + A x 4 = A左移4位 + A左移2位: A x 27 = A x 32 - A x 4 - A = A左移5位 - A左移2位 - A: 注意:乘法运算时,需要先对数据位进行扩充. 2.除法 在FPGA中,除法运算可以分为 1)信号与信号之间的运算,用除法器核实现: 2)常数与信号之间的运