导图社区 FPGA学习
FPGA,硬件电路设计,单片机,编程,代码,电子,半导体
编辑于2020-02-13 12:03:06FPGA
发展背景
数字电路发展
自20世纪60年代以来,数字集成电路经历了 SSI(Small Scale Integrated circuit,小规模集成电路), MSI(Medium Scale Integrated circuit,中规模集成电路), LSI(Large ScaleIntegrated circuit,大规模集成电路) 到VLSI(Very Large Scale Integrated circuit,超大规模集成电路)的发展过程 第一类是通用型中、小规模集成电路; 第二类是用软件组态的大规模、超大规模集成电路,如微处理器、单片机等; 第三类是专用集成电路ASIC(Application-Speciftic Integrated Circuit)。
ASIC
ASIC分为全定制和半定制两类。 全定制ASIC的硅片没有经过预加工,其各层掩模都是按特定电路功能专门制造的。 半定制ASIC是按一定规格预先加工好的半成品芯片,然后再按照具体要求进行加工和制 造,它包括门阵列、标准单元和可编程逻辑器件三种
可编程逻辑器件
可编程逻辑器件是ASIC的一个重要分支,它是厂家作为一种通用型器件生产的半定制电路
PLD
典型的PLD由 输入电路、与阵列、或阵列和输出电路组成, 而任意一个组合逻辑都可以用“与-或“表达式来描述  早期的PLD器件的一个共同特点是可以实现速度特性较好的逻辑功能,但其过于简单的 结构也使它们只能实现规模较小的电路。
组成
有编程阵列逻辑PAL(Programmable Array Logic) 通用阵列逻辑GAL(Generic Array Logic)。 PAL由一个可编程的“与” 平面和一个固定的“或” 平面构成, 或门的输出可以通过触发器有选择地被置为寄存状态。 PAL器件是现场可编程的,它的实现工艺有反熔丝技术, EPROM技术和EEPROM技术。 在PAL的基础上,又发展了一种通用阵列逻辑GAL,它采用了EEPROM工艺,实现了电可擦除、电可改写,其输出结构是可编程的逻辑宏单元,因而它的设计具有很强的灵活性,至今仍有许多人使用。
FPGA
发展
20世纪80年代中期, Altera公司(现已被Intel收购,为Intel可编程事业部——PSG) 和Xilinx公司在PAL、 GAL等逻辑器件的基础上, 分别推出了 复杂可编程逻辑器件CPLD(Complex Programmable Logic Device) 现场可编程门阵列FPGA, 同以往的PAL、GAL等相比较, CPLD/FPGA具有 1.体系结构和逻辑单元灵活、 2.集成度高以及适用范围宽等特点。 3.它们可以替代几十甚至几千块通用IC芯片
组成
1.复杂可编程逻辑器件CPLD(Complex Programmable Logic Device) 2.现场可编程门阵列FPGA,现场可编程门阵列FPGA,
CPLD FPGA对比
CPLD与FPGA对照情况如下。 1. 结构 FPGA多为查找表加寄存器结构,大多数使用SRAM工艺,也包含Flash、 Anti-Fuse等工艺 CPLD多为乘积项结构, 使用Flash、 EEPROM工艺。 2. 集成度 FPGA可以达到比CPLD更高的集成度,同时也具有更复杂的布线结构和逻辑实现。 3. 适合类型 CPLD组合逻辑的功能很强,一个宏单元就可以分解成十几个甚至30多个组合逻辑输入,而FPGA的一个查找表LUT只能处理4输入的组合逻辑。 CPLD更适合完成各种算法和组合逻辑, FPGA更适合于完成时序逻辑。 换句话说, CPLD更适合于触发器有限而乘积项丰富的结构, 而FPGA更适合于触发器丰富的结构。 4. 功率消耗 一般情况下, CPLD功耗要比FPGA大,且集成度越高越明显。 5布线资源 FPGA具有丰富的分布式布线资源、布线灵活,但是时序难以预测,一般需要时序约束、时序仿真来验证时序性能。 CPLD由于逻辑块互连是集总式的,相对布线资源有限。 6. 编程方式 目前的CPLD主要是基于EEPROM或FLASH存储器编程,编程次数达1万次。其优点是在系统断电后,编程信息不丢失。 CPLD又可分为在编程器上编程和在系统编程(ISP)两种。 ISP器件的优点是不需要编程器,编程、调试和维护都很方便。 FPGA大部分是基于SRAM编程,其缺点是编程数据信息在系统断电时丢失,每次上电时,需从器件的外部存储器或计算机中将编程数据写人SRAM中。其优点是可进行任意次数的编程,并可在工作中快速编程,实现板级和系统级的动态配置,因此可称为在线重配置(ICR: In CircuitReconfigurable)的PLD或可重配置硬件(RHP: Recontfigurable Hardware Product)。
FPGA 单片机对比
它们在硬件架构上不同, 单片机无论是MCU还是MPU都是基于控制器和算术逻辑单元进行工作的, 而FPGA是基于查找表的硬件电路进行工作的, 这一点正同于单片机用的是软件设计语言而FPGA用的是硬件描述语言一样; 其次, FPGA在芯片容量、组合逻辑、工作速度、设计灵活上远优于单片机; 最后,在代码的设计思想上也不一样, 单片机使用的是串行的设计思想, 而FPGA则使用的是并行的设计思想。
公司
Altera公司(现已被Intel收购,为Intel可编程事业部——PSG) Xilinx公司在PAL、 GAL等逻辑器件的基础上
设计流程

开发平台
软件
仿真工具Modelsim、综合工具Synplify
驱动

仿真
开发
调试
SignalTap II全称SignalTap II Logic Analyzer,是第二代系统级调试工具,可以捕 获和显示实时信号,是一款功能强大且极具实用性的FPGA片上调试工具软件。 SignalTap II可以选择要捕获的信号、捕获的触发方式以及捕获的数据样本深度,实时 数据提供给工程师 帮助debug。
开发板

芯片
开拓者 EP4CE10
安装
使用
流程

新建

配置工程

编译

配置引脚

下载
 
生成jic
p103
Основная тема

结构

可编程输入输出单元I/O
简称I/O单元, 它们是芯片与外界电路的接口部分, 随着ASIC工艺的飞速发展,I/O支持的最高频率越来越高, 一些高端FPGA通过DDR寄存器技术,甚至可以支持高达2Gbit/s的数据数率。
电气标准
不同芯片商、不同器件的FPGA支持 的I/O标准不同,随工艺而定 常见的电气标准 有LVTTL, LVCMOS, SSTL, HSTL, LVDS, LVPECL和PCI等 可编程 完成不同电气特性下对输入/输出信号的驱动与匹配 需求, 目前大多数FPGA的I/O单元被设计为可编程模式, 即通过软件的灵活配置,可以适配不同的电气标准与I/O物理特性; 可以调整匹配阻抗特性、 上下拉电阻、以及调整驱动电流的大小等。
基本可编程逻辑单元
组成
FPGA一般是基于SRAM工艺的,几乎都是 由查找表(LUT, Look Up Table) 寄存器(Register)
嵌入式块RAM
丰富的布线资源
底层嵌入功能单元
内嵌专用硬核
verilog HDL语言特性
背景和区分
Verilog是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言, 它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能 
Verilog与VHDL

Verilog与 C
Verilog是硬件描述语言, 在编译下载到FPGA之后,会生成电路,所以Verilog全部是并 行处理与运行的; C语言是软件语言, 编译下载到单片机/CPU之后,还是软件指令, 而不会根据你的代码生成相应的硬件电路, 而单片机/CPU处理软件指令需要取址、译码、执行, 是串行执行的。
Verilog HDL语法
高级知识
状态机
概念 状态机相当于一个控制器,它将一项功能的完成分解为若干步,每一步对应于二进制的 一个状态,通过预先设计的顺序在各状态之间进行转换,状态转换的过程就是实现逻辑功能的过程
输出关系分类
Mealy状态机: 组合逻辑的输出不仅取决于当前状态,还取决于输入状态 Moore状态机: 组合逻辑的输出只取决于当前状态。  
实际写法分类
一段式: 整个状态机写到一个always模块里面, 在该模块中既描述状态转移,又描述状态的输入和输出。 二段式: 用两个always模块来描述状态机, 一个always模块采用同步时序描述状态转移; 一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出。 不同于一段式状态机的是,它需要定义两个状态,现态和次态,然后通过现态和次态 的转换来实现时序逻辑。 三段式: 在两个always模块描述方法基础上,使用三个always模块, 一个always模块采用同步时序描述状态转移, 一个always采用组合逻辑判断状态转移条件,描述状态转移规律, 一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)  有效地滤去组合逻辑输出的毛刺, 同时也可以更好的进行时序计算与约束, 另外对于总线形式的输出信号来说,容易使总线数据对齐,减小总线数据间的偏移, 从而降低接收端数据采样出错的频率
状态跳转图

四值逻辑
1: 0: x:模糊状态 z:三态情形 高阻态
编程

编程规范
工程组织形式
 doc:一般存放工程相关的文档,包括该项目用到的datasheet(数据手册)设计方案等 par:主要存放工程文件和使用到的一些IP文件; rtl:主要存放工程的rtl代码,工程的核心,名与module名称一致,按照模块的层次分开存放 sim:主要存放工程的仿真代码
空格 和注释

信号命名
我们建议如下: ① 信号命名需要体现其意义,比如fifo_wr代表FIFO读写使能; ② 可以使用“_”隔开信号,比如sys_clk; ③ 内部信号不大写,也不大小写混合,全部小写; ④ 模块名小写; ⑤ 低电平有效的信号, _n作为信号后缀; ⑥ 异步信号 _a作为信号后缀;
文件名要体现其意义
模块化
 
模块例化
 同一个任务分顶层模块 和被调用磨块
标识符
标识符(identifier)用于定义模块名、端口名和信号名等。 Verilog的标识符可以是任意一组字母、数字、 $和_(下划线)符号的组合, 但标识符的第一个字符必须是字母或者下划线。 另外,标识符是区分大小写的。 普通内部信号建议全部小写, 参数定义建议大写
编程流程
先写 _top模块 再写底层调用模块
先写 模块结构 再定义模块参数
先写 模块功能分配 再细化模块功能
方法
方法的本质是改变它的数据结构 本质是运算符
延时
# 是延迟的意思,井号后面数字是延迟的数量,延迟的单位由`timescale控制 比如有:`timescale 1ns/1ps 意思就是时间单位为1ns,精度是1ps`timescale 1ns/1ps比如有:`timescale 1ns/1ps 意思就是时间单位为1ns,精度是1ps 那么,#10.5 就是延迟10.5ns的意思#10.5那么,#10.5 就是延迟10.5ns的意思 在同步时序数字逻辑电路的verilog代码中,不能加入“#”进行延迟,这不是代码编写阶段能决定的
模块的时钟计算
 由于例化时clk为系统 时钟sys_clk(50MHz),所以每隔0.5秒改变数码管显示的数值时 此参数值为0.5 × 50000000 =25000000,此功能由计时模块(time_count)实现
代码算法
控制器+case
 全执行 轮询 编程执行顺序, 大块分频时间在上 小块不分频时间在下 同时间节奏模块在一起 彼此模块通过变量通信
程序的抽象结构
代码内容
模块端口定义
input output 输入输出定义

信号类型说明
prameter 参数类型定义
 
wire 网线类型定义

reg 寄存器类型定义
功能描述
always块 条件执行模块描述方式

assign块描述方式
 
assign always区别
assign语句使用时不能带时钟。 always语句可以带时钟, 也可以不带时钟。 在always不带时钟时,逻辑功能和assign完全一致,都是只产生组合逻辑。比较简单的 组合逻辑推荐使用assign语句,比较复杂的组合逻辑推荐使用always语句。   
元件例化
语句
编译预处理语句
define
include
timescale
赋值语句
连线赋值语句
过程赋值语句
阻塞赋值=
所谓阻塞的概念是指,在同一个always块中,后面的赋值语句是在前一句赋值语句结束后才开始赋值的。 • 这是因为在赋值时先计算等号右手方向部分的值, 即把等号右手方向的计算结果赋值给等号左手方向的变量或表达式的时刻,它才允许别的赋值语句的执行。 • 阻塞赋值的执行可以认为是只有一个步骤的操作,即计算等号右手方向表达式的值并更新等号左手方向的变量• 阻塞赋值的执行可以认为是只有一个步骤的操作,即计算等号右手方向表达式的值并更新等号左手方向的变量,且不能允许有来自任何其他Verilog语句的干扰且不能允许有来自任何其他Verilog语句的干扰
阻塞不适用情况
如果在一个过程块中阻塞赋值的等号右手方向的某个变量如果在一个过程块中阻塞赋值的等号右手方向的某个变量,正好是另一个过程块中阻塞赋值的等号左手方向的变量正好是另一个过程块中阻塞赋值的等号左手方向的变量 这两个过程块又用同一个时钟沿触发,这时阻塞赋值操作会出现问题, 即如果阻塞赋值的顺序安排不好,就会出现竞争。 若这两个阻塞赋值操作用同一个时钟沿触发,则执行的顺序是无法确定的
阻塞使用情况
1)在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构; 3、用always块建立组合逻辑模型时,用阻塞赋值。 6、不要在一个以上的always块中为同一个变量赋值。 在同一个always块中不要既用非阻塞赋值又用阻塞赋值。
非阻塞赋值
在赋值操作时刻开始时计算非阻塞赋值符的右手方向的表达式,赋值操作时刻结束时更新非阻塞赋值符的左 手方向的变量。 Ø在计算非阻塞赋值的右手方向表达式和更新非阻塞赋值符左手方向变量期间,其他的Verilog语句,包括其 他的Verilog非阻塞赋值语句都能同时计算非阻塞赋值符的右手方向的表达式和更新非阻塞赋值符的左手方向 的变量
非阻塞使用情况
(2)在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构 1,时序电路建模时,用非阻塞赋值。 2、锁存器电路建模时,用非阻塞赋值。 4、在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。
条件语句
if-else
case
casez
latch锁存器注意事项
latch是指锁存器 主要危害是会产生毛刺(glitch),这种毛刺对下一级电路是很危险的 预防解决办法 就是if必须带else分支, case必须带default分支 
循环语句
for
repeat
while
forever
结构说明语句
语句的执行方式: always
always
不断的重复执行 event expression
值改变触发

时钟边沿触发
initial
仿真中使用,只执行一次
task/function
task和function语句可以在程序模块中的一处或多处调用
区别

function
1.函数不能启动任务, 2.在函数中不能包含有任何的时间控制语句, 3.同时定义函数时至少要有一个输入参量等。  
task

程序数据结构
关键字

常用

数据类型
  
reg
wire
parameter
interger
常量
数字进制格式
 当代码中没有指定数字的位宽与进制时,默认为32位的十进制, 比如100,实际上表示的值为32’d100。
逻辑值

变量
网络型wire
nets型变量指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接 特性: wire是一种最常用的nets型变量 • wire型数据常用来表示以assign语句赋值的组合逻辑信号 • Verilog HDL模块中的输入/输出信号类型缺省时自动定义为wire型 • wire型信号可以用做任何方程式的输入,也可以用做“assign”语句和实例元件的输出 • 对于综合而言,其取值为0,1,x,z
寄存器型reg
需要被明确赋值 寄存器型变量对应的是具有状态保持作用的电路元件,如触发器、寄存器等。 Ø Ø在设计中必须将寄存器型变量放在过程块语句(如 initial、always)中,通过过程赋值语句赋值。 Ø另外,在always、initial等过程块内被赋值的每一个 信号都必须定义成寄存器型
reg
常用的寄存器型变量
interger
32位带符号整数型变量
real
64位带符号实数型变量
time
无符号时间变量
网络型 和寄存器型区别
register型变量与nets型变量的根本区别在于: register型变量需要被明确地赋值,并且在被重新赋值前一直保持原值。
数组
运算符
1、算术运算符、 2、关系运算符、 3、逻辑运算符、 4、条件运算符、 5、位运算符、 6、移位运算符、 7、拼接运算符。 
优先级

单目运算符
双目运算符
三目运算符
Основная тема