FPGA技术教程(通俗易懂).ppt_第1页
FPGA技术教程(通俗易懂).ppt_第2页
FPGA技术教程(通俗易懂).ppt_第3页
FPGA技术教程(通俗易懂).ppt_第4页
FPGA技术教程(通俗易懂).ppt_第5页
免费预览已结束,剩余162页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FPGA技术 第二章CPLD FPGA概述 第一章可编程逻辑器件发展历程 第三章硬件描述语言VHDL VerilogHDL简介 第四章QuartusII的VerilogHDL建模与仿真 第一章可编程逻辑器件的发展历程 一 可编程逻辑器件的发展历程二 可编程逻辑器件的分类 早期 FPGA 现在 一 可编程器件大致的发展过程如下 1 20世纪70年代 出现了熔丝编程的PROM和PLA器件 70年代末 AMD公司对PLA进行了改进 推出了PAL器件 2 20世纪80年代初 Lattice 莱迪思 公司发明了电可擦写的 比PAL更灵活的GAL通用阵列逻辑器件 3 20世纪80年代中期 Xilinx公司提出现场可编程概念 生产出了世界上第一片FPGA器件 FPGA是改变内部连接的布线来编程 4 20世纪80年代末 Lattice公司又提出在系统可编程概念 ISP 并推出了一系列具有在系统可编程能力的CPLD器件 CPLD的设计是修改具有固定内部连接电路的逻辑功能来编程 5 20世纪90年代后期 可编程集成电路技术飞速发展 器件的可用逻辑门数超过了百万门 并出现了内嵌复杂功能模块 如加法器 乘法器 RAM CPU核 DSP核等 的SOPC 二 可编程器件的分类1 按集成度来划分 分为高密度和低密度PLD器件 1 集成度小于1000门 每片的LDPLD 又称简单PLD PROM 可编程只读存储器 PLA 可编程逻辑阵列 ProgrammableLogicArray PAL 可编程阵列逻辑 ProgrammableArrayLogic GAL 通用阵列逻辑 GenericArrayLogic 2 集成度大于1000门 每片的HDPLDFPGA FieldProgrammableGateArray CPLD ComplexProgrammableLogicDevice 2 从结构上可分为 1 乘积项结构器件 为 与 或 阵列结构 大部分简单PLD和CPLD都属于这个范畴 2 查找表结构器件 由查找表组成可编程门 再构成阵列形式 FPGA属于此类器件 3 从编程工艺上分为 1 熔丝 Fuse 型器件 编程过程就是根据设计的熔丝图文件来烧断对应的熔丝 来达到编程的目的 编程后即使系统断电 它们中存储的编程信息不会丢失 2 反熔丝 Antifuse 型器件 由Actel公司推出 在编程处通过击穿漏层使得两点之间获得导通 反熔丝PLD抗辐射 耐高低温 功耗低 速度快 在军品和宇航上有较大优势 前两种都属OTP器件 3 EPROM型 紫外线擦除电可编程逻辑器件 它用较高的编程电压进行编程 当需要再次编程时 用紫外线擦除 前三种较少使用 4 EEPROM型 电可擦除可编程逻辑器件 CPLD采用此编程工艺 5 SRAM型 SRAM查找表结构的器件 大部分的FPGA采用此编程工艺 断电后编程信息会丢失 每次上电时 需从器件外部存储器将编程数据重新写入SRAM中 允许无限次编程 6 Flash Fastflash 型 即闪存技术 由Actel公司推出 采用此编程工艺的器件 可以实现多次可编程 也可以做到掉电后不需要重新配置 CPLD采用此编程工艺 第二章CPLD FPGA概述 一 简单的PLD结构二 FPGA CPLD的结构三 FPGA CPLD的基本原理四 FPGA的设计方法五 FPGA设计流程 二维的逻辑块阵列 构成了PLD器件的逻辑组成核心 输入 输出块 连接逻辑块的互连资源 连线资源 由各种长度的连线线段组成 其中也有一些可编程的连接开关 它们用于逻辑块之间 逻辑块输入 输出块之间的连接 一 简单PLD的结构任何组合函数都可以表示为与 或表达式 如F AB BCD PLD由 与门阵列 和 或门阵列 加上输入输出电路构成 早期的PLD有些是 与 阵列可编程 有些是 或 阵列可编程 还有些是 与 和 或 阵列都可编程 1 输入缓冲器2 PLD的互补输入3 PLD中与阵列表示 4 PLD中或阵列的表示5 阵列线连接表示 编程前编程后6 PROM的PLD阵列图 二 FPGA CPLD的结构FPGA CPLD的结构各有其特点和长处 但概括起来 它们是由三大部分组成的 1 逻辑阵列块LAB LogicArrayBlock 或CLB ConfigurableLogicBlock 构成了PLD器件的逻辑组成核心 2 输入 输出块IOB I OBlock 3 连接逻辑块的可编程连线阵列PIA ProgrammableInterconnectArray 或互连资源IR InterconnectResources 它由各种长度的连线线段组成 也有一些可编程的连接开关 用于逻辑块之间 逻辑块与输入 输出块之间的连接 规模大 能够完成任何数字逻辑的功能 实现系统集成在投片前验证设计的正确性 开发成本低修改设计而不用改动硬件电路 开发周期短减少PCB面积 提高系统可靠性 PLD CPLD FPGA 的优点 CPLD和FPGA的区别 制造工艺不同 实现功能不同 FPGA 查找表技术 SRAM工艺 CPLD 乘积项技术 Flash EEPROM工艺 FPGA 时序逻辑电路 CPLD 组合逻辑电路 三 CPLD FPGA基本原理 基于查找表的PLD的基本结构及逻辑实现原理 基于乘积项的PLD的基本结构及逻辑实现原理 基于乘积项的PLD的基本结构及逻辑实现原理 这种FPGA的结构可分为三块 宏单元 Macrocell 可编程连线 PIA 和I O控制块 宏单元是器件的基本结构 由它来实现基本的逻辑功能 可编程连线负责信号传递 连接所有的宏单元 I O控制块负责输入输出的电气特性控制 比如可以设定集电极开路输出 摆率控制 三态输出等 INPUT GCLK1 INPUT GCLRn INPUT OE1 INPUT OE2是全局时钟 清零和输出使能信号 这几个信号有专用连线与器件中每个宏单元相连 信号到每个宏单元的延时相同并且延时最短 宏单元具体结构 与或阵列 每一个交叉点都是可编程熔丝 导通实现与逻辑 或 阵列 可编程D触发器 乘积项结构的逻辑实现原理 f f1 f2 A C D B C D 查找表 Look Up Table 的原理和结构 查找表LUT实质上是一个RAM n位地址线可以配置为n 1的RAM 当用户描述了一个逻辑电路后 软件会计算所有可能的结果 并写入RAM 每一个信号进行逻辑运算 就等于输入一个地址进行查表 找出地址对应的内容 输出结果 XilinxSpartan II内部结构 Altera的FLEX ACEX等芯片的内部结构 查找表结构的逻辑实现原理 f A B C D A C D B C D 选择FPGA还是CPLD CPLD组合逻辑的功能很强 一个宏单元就可以分解十几个甚至20 30多个组合逻辑输入 而FPGA的一个LUT只能处理4输入的组合逻辑 因此 CPLD适合用于设计译码等复杂组合逻辑 但FPGA的制造工艺确定了FPGA芯片中包含的LUT和触发器的数量非常多 往往都是几千上万 CPLD一般只能做到512个逻辑单元 而且如果用芯片价格除以逻辑单元数量 FPGA的平均逻辑单元成本大大低于CPLD 四 FPGA的设计方法 FPGA的常用设计方法包括 自顶向下 和 自下而上 目前大规模FPGA设计一般选择 自顶向下 的设计方法 所谓 自顶向下 设计方法 简单地说 就是采用可完全独立于芯片厂商及其产品结构的描述语言 在功能级对设计产品进行定义 并结合功能仿真技术 以确保设计的正确性 在功能定义完成后 利用逻辑综合技术 把功能描述转换成某一具体结构芯片的网表文件 输出给厂商的布局布线器进行布局布线 布局布线结果还可反标回同一仿真器 进行包括功能和时序的后验证 以保证布局布线所带来的门延时和线延时不会影响设计的性能 自顶向下设计方法学 顶层模块 子模块1 子模块2 子模块3 叶单元 叶单元 叶单元 叶单元 叶单元 叶单元 五 FPGA设计流程 1 设计定义 2 设计输入 布尔等式设计 原理图设计 HDL语言设计 3 功能仿真 RTL代码中引用的由厂家提供的宏模块 IP 4 逻辑综合 5 前仿真 6 布局布线 7 后仿真 8 静态时序分析 9 在系统测试 第三章VerilogHDL语言 一 VerilogHDL设计模块的基本结构二 VerilogHDL词法构成三 VerilogHDL的语句四 VerilogHDL描述方式五 VerilogHDL设计流程六 用VerilogHDL描述数字电路的实例 硬件描述语言 HDL 就是可以描述硬件电路的功能 信号连接关系及定时 时序 关系的语言 也是一种用形式化方法来描述数字电路和设计数字系统的 常用的硬件描述语言有VHDL VerilogHDL 已成为IEEE的工业标准硬件描述语言 得到了众多EDA公司的支持 VHDLVHDL主要用于描述数字系统的结构 行为 功能和接口 VerilogHDLVerilogHDL是在C语言的基础上发展而来的硬件描述语言 具有简洁 高效 易用的特点 VerilogHDL语言简介 能力设计的行为特性 设计的数据流特性 设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制 提供了编程语言接口 通过该接口可以在模拟 验证期间从设计外部访问设计 包括模拟的具体控制和运行 主要功能基本逻辑门 例如and or和nand等都内置在语言中开关级基本结构模型 例如pmos和nmos等也被内置在语言中可采用三种不同方式或混合方式对设计建模两类数据类型能够描述层次设计 可使用模块实例结构描述任何层次能够使用门和模块实例化语句在结构级进行结构描述 一 VerilogHDL设计模块的基本结构VerilogHDL程序设计由模块 module 构成的 设计模块的基本结构如图 一个完整的VerilogHDL设计模块包括端口定义 I O声明 信号类型声明和功能描述4个部分 1模块端口的定义模块端口定义用来声明电路设计模块的输入 输出端口 端口定义格式如下 module模块名 端口1 端口2 端口3 在端口定义的括号中 是设计电路模块与外界联系的全部输入 输出端口信号或引脚 是设计实体对外的一个通信界面 是外界可以看到的部分 不包含电源和接地端 多个端口之间用 分隔 例如1位全加器adder模块的端口定义为moduleadder S CO A B CI 模块名adder 2信号类型声明信号类型声明是声明设计电路的功能描述中所用的信号的数据类型和函数 信号的数据类型主要有连线 wire 寄存器 reg 整型 integer 实型 real 和时间 time 等 信号声明格式如下 wire msb lsb 端口1 端口2 端口3 reg msb lsb 端口1 端口2 端口3 3功能描述功能描述是VerilogHDL程序设计中最主要的部分 用来描述设计模块的内部结构和模块端口间的逻辑关系 在电路上相当于器件的内部电路结构 功能描述可以用assign语句 元件例化 instantiate 方式 always块语句 initial块语句等方法来实现 通常将设计模块描述的方法称为建模 用assign语句建模用assign语句建模的方法很简单 只需要在 assign 后面再加一个表达式 assign语句一般适合对组合逻辑进行赋值 称为连续赋值方式 例1一位全加器的设计1位全加器的逻辑符号 S是全加器的和输出端 CO是进位输出端 A和B是两个加数输入端 CI是低位进位输入端 全加器的VerilogHDL源程序如下 moduleadder1 S CO A B CI inputA B CI outputS CO wireS CO A B CI assign CO S A B CI endmodule assign CO S A B CI 语句实现1位全加器的进位输出CO与和输出S的建模 在语句表达式中 用拼接运算符 将CO S这两个1位操作数拼接为一个2位操作数 用元件例化 instantiate 方式建模元件例化方式建模是利用VerilogHDL提供的元件库实现的 例如 用与门例化元件定义一个三输入端与门可以写为andmyand3 y a b c and是VerilogHDL元件库中与门元件名 myand3是例化出的三输入端与门名 y是与门输出端 a b c是输入端 用always块语句建模always块语句可以产生各种逻辑 常用于时序逻辑的功能描述 一个程序设计模块中 可以包含一个或多个always语句 程序运行中 在某种条件满足时 就重复执行一遍always结构中的语句 例28位二进制加法计数器的设计8位二进制加法计数器的逻辑符号如图 OUT是8位二进制计数器的输出端 8位向量 COUT是进位输出端 1位 DATA是并行数据输入端 8位向量 LOAD是计数器的预置控制输入端 当LOAD 1时 OUT DATA CLK是时钟控制输入端 上升沿为有效边沿 CLR是同步复位输入端 当CLK的上升沿到来时且CLR 1 则计数器被复位 OUT 00000000 逻辑符号图是由计算机对计数器电路的VerilogHDL源代码编译后产生的元件符号 图中的输入 输出标识符自动被改为大写 而源程序中的标识符都是小写 8位二进制加法计数器的VerilogHDL源程序如下 modulecnt8 out cout data load cin clk clr input 7 0 data inputload cin clk clroutput 7 0 out outputcout reg 7 0 out always posedgeclk beginif load out data elseif clr out b00000000 elseout out 1 endassigncout 语句产生进位输出cout 在语句中 out 是与的缩减运算式 只有out中数字全为1时 结果才为1 用initial块语句建模Initial块语句与always语句类似 不过在程序中它只执行1次就结束了 Initial块语句的使用格式 InitialBegin语句1 语句2 end例3用Initial过程语句对测试变量赋值initialbeginfor addr 0 addr size addr addr 1 memory addr 0 对memory存储器进行初始化end 从以上例子中可以看出VerilogHDL程序设计模块的基本结构 VerilogHDL程序是由模块构成的 每个模块的内容都是嵌套在module和endmodule两语句之间 每个模块实现特定的功能 模块是可以进行层次嵌套的 每个模块首先要进行端口定义 并进行I O声明和信号类型声明 然后对模块的功能进行逻辑描述 VerilogHDL程序的书写格式自由 一行可以有一条或多条语句 一条语句也可以分为多行写 除了end或以end开头的关键字 如endmodule 语句外 每条语句后必须要有分号 可以用 或 对VerilogHDL程序的任何部分注释 一个完整的源程序都应当加上必要的注释 以加强程序的可读性 二 VerilogHDL词法构成VerilogHDL源程序一般包括 间隔符与注释符 操作符 数值常量 字符串 标识符和关键字等语法元素 1 间隔符与注释符间隔符又称空白符 包括空格符 tab符号 换行符及换页符等 它们的作用是分隔其他词法标识符 在必要的地方插入间隔符可以增强源文件的可读性 但在字符串中空格符和tab符号 制表符 是有意义的字符 VerilogHDL有单行注释和多行段注释两种注释形式 单行注释以字符 起始 到本行结束 而段注释则以 起始以 结束 在段注释中不允许嵌套 段注释中单行注释标识符 没有任何特殊意义 2 操作符VerilogHDL中定义了操作符 又称运算符 按照操作数的个数 可以分为一元 二元和三元操作符 按功能可以大致分为算术操作符 逻辑操作符 比较操作符等几大类 表1VerilogHDL的操作符及简要说明 同其他高级语言类似 各类操作符号之间有优先级之分 如下表 列表顶部是最高优先级 底部是最低优先级 列在同一行中的操作符具有相同的优先级 所有操作符 除外 在表达式中都是从左向右结合的 圆括号 用于改变优先级或使得表达式中运算顺序更加清晰 提高源文件的可读性 3 数值常量VerilogHDL中的数值常量有整型和实型两大类 分为十进制 十六进制 八进制或二进制 若在前面加上一个正 或负 号就表示有符号数 否则所代表的就是无符号数 在数值常量的任意位置可以随意插入下划线 以提高可读性 常量定义格式为 parameter常量名1 表达式 常量名2 表达式 常量名n 表达式 parameter是常量定义关键字 常量名是用户定义的标识符 表达式为常量赋值 例如parameterVcc 5 fbus 8 b11010001 VerilogHDL中的整型数值常量就是整数 有两种书写格式 一种是无位宽的十进制表示法 如 132 第二种是定义位宽和进制的表示法 这种表示方法通常是无符号数 常数书写格式是 size basevalue其中size是位宽 定义了数值常量的位数 长度 base代表这个数据的进制 取值范围和相应的进制如下表 value是一个数值常量的值 书写格式与进制base相对应 例如16 h6a8c 表示一个4位十六进制数 8 hf5等于8 b11110101 8 b1111xxxx等价2 hfx 8 b1101zzzz等价8 hdz VerilogHDL中的进制 VerilogHDL中的实型数值常量就是浮点数 可以用十进制与科学计数法两种形式书写 如果采用十进制格式 小数点两边必须都有数字 VerilogHDL的编程最终是与硬件相对应的 由于硬件电路中信号的逻辑状态具有特殊性 即不仅有0 低电平 和1 高电平 还有可能是X 未知状态 和Z 高阻态 因此VerilogHDL数值集合有四个基本值 0 逻辑0或假状态 1 逻辑1或真状态 X 逻辑不确定 Z 高阻态 4 字符串字符串是双引号 括起来的字符序列 必须包含在同一行中 不能多行书写 在表达式或赋值语句中作为操作数的字符串被看作ASCII值序列 即一个字符串中的每一个字符对应一个8位ASCII值 5 标识符标识符是模块 寄存器 端口 连线 示例和begin end块等元素的名称 是赋给对象的唯一的名称 标识符可以是字母 数字 符和下划线 字符的任意组合序列 定义标识符规则 首字符不能是数字 必须以字母或下划线 开头 字符数不能多于1024 标识符区分大小写 不要与关键字同名 例如ina inb adder adder8 name adder是正确的 而1a b是错误的 6 关键字关键字是VerilogHDL预先定义的专用词 在IEEE标准 VerilogHDL1364 1995中规定了102个关键词 都采用小写形式 关键词有其特定和专有的语法作用 用户不能再对它们做新的定义 关键字 7 变量变量是在程序运行时其值可以改变的量 在VerilogHDL中 变量分为网络型 netstype 和寄存器型 registertype 两种 网络型变量nets型变量是输出值始终根据输入变化而更新的变量 一般用来定义硬件电路中的各种物理连线 VerilogHDL提供了多种nets型变量 常见的nets型变量及说明 s1 s2 s3 寄存器型变量register型变量是用来描述硬件系统的基本数据对象 作为一种数值容器 可以容纳当前值 也可以保持历史值 与寄存器的记忆功能相对应 可以作为模块各器件间的信息传递通道 register型变量与wire型变量的区别在于register型变量需要被明确的赋值 并且在重新赋值前一直保持原值 register型变量是在always initial等过程语句种定义 并通过过程语句赋值 常见的register型变量及说明 三 VerilogHDL的语句VerilogHDL的语句包括赋值语句 条件语句 循环语句 结构声明语句和编译预处理语句等类型 每一类语句又包括几种不同的语句 在这些语句中 有些语句属于顺序执行语句 有些语句属于并行执行语句 1 赋值语句在VerilogHDL中 赋值语句常用于描述硬件设计电路输出与输入之间的信息传送 改变输出结果 VerilogHDL有4种赋值方法 门基元 连续赋值 过程赋值和非阻塞赋值 门基元赋值语句门基元赋值语句的格式为 基本逻辑门关键字 门输出 门输入1 门输入2 门输入n 例如4输入与非门的门基元赋值语句为nand y a b c d 与语句assigny a b c d 等效 连续赋值语句连续赋值语句的关键字assign 赋值符号是 赋值语句的格式为assign赋值变量 表达式 例如assigny a 1表示输出与输入信号之间具有1个单位的时间延迟endmodule 过程赋值语句过程赋值语句出现在initial和always块语句中 赋值符号是 语句格式为 赋值变量 表达式 过程赋值语句 左边的赋值变量必须是 寄存器 reg型变量 其值在该语句结束时即可得到 如果一个块语句中包含若干条过程赋值语句 按顺序一条一条执行 前面的语句没完成 后面的语句就不能执行 因此 过程赋值语句也称为阻塞赋值语句 非阻塞赋值语句非阻塞赋值语句也是出现在initial和always块语句中 赋值符号是 语句格式为 赋值变量 表达式 非阻塞赋值语句 左边的赋值变量必须是 寄存器 reg型变量 其值在块语句结束时才可得到 与过程赋值语句不同 例如下面的块语句包含4条赋值语句always posedgeclock beginm 3 n 75 n m r n end语句执行结束后 r的值是75 而不是3 因为第3行是非阻塞赋值语句 n m 该语句要等到本块语句结束时 n的值才能改变 块语句的 posedgeclock 是定时控制敏感寒暑 表示时钟信号clock的上升沿到来的敏感时刻 例2上升沿触发的D触发器的VerilogHDL源程序moduleD FF q d clock inputd clock 属于wire型变量outputq 属于reg型变量regq always posedgeclock q d endmodule 2 条件语句条件语句包含if语句和case语句 它们都是顺序语句 应放在always块中 if语句完整的VerilogHDL的if语句结构如下 if 表达式 begin语句 endelseif 表达式 begin语句 endelsebegin语句 end在if语句中 表达式 是逻辑表达式或关系表达式 也可以是位宽为1位的变量 系统对表达式的值进行判断 若为0 x z按 假 处理 若为1 按 真 处理 执行指定的语句 例38线 3线优先编码器的设计8线 3线优先编码器的功能表modulecode y a input 7 0 a output 2 0 y reg 2 0 y always a beginif a 7 y 3 b111 elseif a 6 y 3 b110 elseif a 5 y 3 b101 elseif a 4 y 3 b100 elseif a 3 y 3 b011 elseif a 2 y 3 b010 elseif a 1 y 3 b001 elsey 3 b000 endendmodule case语句case语句是一种多分支的条件语句 case语句的格式为 case 表达式 选择值1 语句1 选择值2 语句2 选择值n 语句n default 语句n 1endcase执行case语句时 首先计算表达式的值 然后执行条件句中相应的 选择值 的语句 当所有的条件句的 选择值 与表达式的值不同时 则执行 default 后的语句 default可以省略 case语句多用于数字系统中的译码器 数据选择器 状态机及微处理器的指令译码器等电路的描述 例4 用case语句描述4选1数据选择器控制信号s1 s2有4种组合 控制a b c d中的一个数据送到输出端 4选1数据选择器VerilogHDL的描述如下 modulemux41 z a b c d s1 s2 inputs1 s2 inputa b c d outputz regz always a b c d s1 s2 begincase s1 s2 2 b00 z a 2 b01 z b 2 b10 z c 2 b11 z d endcaseendendmodulecase语句还有两种变体形式 casez和casex语句 与case语句的区别是不考虑语句中的高阻z和未知x的那些位 只关注其他位的比较结果 4选1数据选择器功能表 3 循环语句循环语句包含for语句 repeat语句 while语句和forever语句4种 for语句for语句的格式为 for 循环指针 初值 循环指针 终值 循环指针 循环指针 步长值 begin语句 endfor语句可以是一组语句重复执行 语句中的参数一般属于整型变量或常量 语句重复执行的次数由语句中的参数确定 即循环重复次数 终值 初值 步长值 例5 8位奇偶校验器的描述用a表示输入信号 长度为8位的向量 在程序中 用for语句对a的值 逐位进行模2加运算 即异或XOR 循环指针变量n控制模2加的次数 11100110奇数个1循环变量的初值为0 终值为8 因此 控制循环共执行了8次 例5用VerilogHDL对8位奇偶校验器的描述如下 moduletest8 a out input 7 0 a outputout regout integern always a beginout 0 for n 0 n 8 n n 1 out out a n 异或endendmodule repeat语句repeat语句的语法格式为 repeat 循环次数表达式 语句 例6用repeat语句实现8位奇偶校验器的描述如下 moduletest8 1 a out parametersize 7 input 7 0 a outputout regout integern always a beginout 0 n 0 repeat size beginout out a n n n 1 endendendmodule MAX plusII软件不支持repeat语句 但synplify软件支持 while语句while语句的语法格式为 while 循环执行条件表达式 begin重复执行语句 修改循环条件语句 endwhile语句在执行时 首先判断循环执行条件表达式是否为真 若为真 则执行其后面的语句 若为假 则不执行 表示循环结束 为了使语句能够结束 在循环执行的语句中必须包含一条能改变循环条件的语句 forever语句forever语句的语法格式为 foreverbegin语句 endforever是一种无穷循环控制语句 它不断地执行其后的语句或语句块 永远不会结束 Forever语句常用来产生周期性的波形 作为仿真激励信号 例如产生时钟clk的语句为 10forever 10clk clk 10表示输出与输入信号之间具有10个单位的时间延迟 clk取非 4 结构声明语句VerilogHDL的任何过程模块都是放在结构声明语句中 结构声明语句包括always initial task和function等4种结构 always块语句在一个VerilogHDL模块 module 中 always块语句的使用次数是不受限制的 块内的语句也是不断重复执行的 always块语句的语法结构为 always begin 过程赋值语句 if语句 case语句 for语句 while语句 repeat语句 task语句 function语句 end在always块语句中 敏感信号表达式应该列出影响块内取值的所有信号 指设计电路的输入信号 多个信号之间用 or 连接 当表达式中任何信号发生变化时 就会执行一遍块内的语句 块内语句可以包括 过程赋值 if case for while repeat task和function等语句 在进行时序逻辑电路的描述中 敏感信号表达式中经常使用 posedge 和 negedge 这两个关键字来声明事件是由输入信号的正边沿 上升沿 或负边沿 下降沿 触发的 如 always posedgeclk 表示模块的事件是由clk的上升沿触发的 而 always negedgeclk 表示模块的事件是由clk的下降沿触发的 initial语句initial语句的语法格式为 initialbegin语句1 语句2 endinitial语句的使用次数是不受限制的 但块内的语句仅执行一次 因此initial语句常用于仿真中的初始化 task语句在VerilogHDL模块中 task语句用来定义任务 任务类似高级语言中的子程序 用来单独完成某项具体任务 并可以被模块或其他任务调用 利用任务可以把一个大的程序模块分解成为若干小的任务 使程序清晰易懂 可以被调用的任务必须事先用task语句定义 定义格式如下 task任务名 端口声明语句 类型声明语句 begin语句endendtask任务定义与模块 module 定义的格式相同 区别在于任务是用task endtask语句来定义 而且没有端口名列表 例如 8位加法器的任务定义如下 taskadder8output 7 0 sum outputcout input 7 0 ina inb inputcin assign cout sum ina inb cin endtask 任务调用的格式如下 任务名 端口名列表 例如8位加法器任务调用adder8 tsum tcout tina tinb 使用任务时 需要注意几点 1 任务的定义和调用必须在同一个module模块内 2 定义任务时 没有端口名列表 但要进行端口和数据的声明 3 当任务调用时 任务被激活 任务调用与模块调用一样 通过任务名实现 调用时需列出端口名列表 端口名和类型必须与任务定义的排序和类型一致 例如8位加法器任务调用时的端口名列表中的tsum tcout tina tinb端口 与任务定义中的端口sum cout ina inb排序和类型保持一致 4 一个任务可以调用别的任务或函数 可调用的任务和函数的个数不受限制 function语句在VerilogHDL模块中 function语句用来定义函数 函数类似高级语言中的函数 用来单独完成某项具体操作 并可以作为表达式中的一个操作数 被模块或任务及其他函数调用 函数调用时返回一个用于表达式的值 可以被调用的函数必须事先定义 函数定义格式如下 function 最高有效位 最低有效位 函数名 端口声明语句 类型声明语句 begin语句 endendfunction在函数定义语句中 最高有效位 最低有效位 是函数调用返回值位宽或类型声明 例8求最大值的函数function 7 0 max input 7 0 a b beginif a b max a elsemax b endendfunction函数调用的格式如下函数名 关联参数表 函数调用一般是出现在模块 任务或函数语句中 通过函数的调用来完成摹写数据的运算或转换 例如 调用上例中求最大值函数的语句为z max x y 其中 x和y是与函数定义的两个参数a b相关联的关联参数 通过函数的调用 求出x和y中的最大值 并用函数名max返回 函数和任务存在以下几处区别 1 任务可以有任意不同类型输入 输出参数 函数不能将inout类型作为输出 2 任务只可以在过程语句中调用 不能在连续赋值语句assign中调用 函数可以作为表达式中的一个操作数 在过程赋值语句和连续赋值语句中调用 3 任务可以调用其他任务或函数 函数可以调用其他函数 但不能调用任务 4 任务不向表达式返回值 函数向调用它的表达式返回一个值 5 语句的顺序执行与并行执行VerilogHDL中有顺序执行语句和并行执行语句之分 always块语句中的语句是顺序语句 按照程序书写的顺序执行 always块本身确是并行语句 它与其他always语句及assign语句 元件例化语句的执行都是同时 即并行 的 例9同步清除十进制加法计数器的描述同步清0是在时钟信号作用下 计数器的状态被clr清0 清0信号clr高电平有效 时钟信号clk上升沿触发 计数器计数状态从4 b0000到4 b1001循环 modulecnt10 clr clk q co inputclr clk output 3 0 q outputco reg 3 0 q regco always posedgeclk beginif clr beginco 0 q 4 b0000 endelseif q 4 b1001 beginq 4 b0000 co 1 endelsebeginco 0 q q 1 endendendmodule 五 VerilogHDL的描述方式 建模方法 系统级 system 用高级语言结构实现设计模块的外部性能的模型 算法级 algorithmic 用高级语言结构实现设计算法的模型 RTL级 RegisterTransferLevel 描述数据在寄存器之间流动和如何处理这些数据的模型 门级 gate level 描述逻辑门以及逻辑门之间的连接的模型 开关级 switch level 描述器件中三极管和储存节点以及它们之间连接的模型 用VerilogHDL描述的电路就称为该设计电路的VerilogHDL模型 建模层次 不同抽象级别的VerilogHDL模型 描述方式 1 结构描述 描述元器件间连接关系 例化2 数据流描述 描述电路数据流行为 assign3 行为描述 描述功能 always4 混合描述 Verilog允许多描述方式共存于同一模块 75 1结构描述 1 基于库元件的结构描述 门类型关键字 门级描述即直接调用门原语进行逻辑的结构描述 以门级为基础的结构描述所建立的硬件模型不仅是可仿真的 也是可综合的 一个逻辑网络由许多逻辑门和开关组成 用逻辑门的模型来描述逻辑网络最直观 门类型的关键字有26个 常用的有9个 not and nand or nor xor xnor buf bufif1 bufif0 notif1 notif0 各种三态门 调用门原语的句法 注1 在端口列表中输出信号列在最前面 注2 门级描述不适于描述复杂的系统 门级描述 可省略 例 采用结构描述方式描述硬件电路moduleexample 4 11 y a b c inputa b c outputy wires1 s2 s3 not s1 a nand s2 c s1 nand s3 a b nand y s2 s3 endmodule 2 基于设计模块的结构描述任何用VerilogHDL描述的电路设计模块 module 均可用模块例化语句 例化一个元件 来实现电路系统的设计 模块例化语句格式与逻辑门例化语句格式相同 具体格式 设计模块名 端口列表 其中 例化电路名 是用户为系统设计定义的标识符 相当于系统电路板上为插入设计模块元件的插座 而端口列表相当于插座上引脚名表 应与设计模块的输入 输出端口一一对应 用模块例化方式设计1位全加器 在1位全加器设计中 需要事先设计一个半加器 然后用例化方式将两个半加器和一个或门连接成全加器 使用两个半加器模块构造全加器moduleHA A B S C inputA B outputS C assignS A B assignC A 或门实例语句endmodule 端口列表小结 端口列表是把例化元件端口与连接实体端口连接起来 端口列表的方法有两种 位置关联法 位置关联法要求端口列表中的引脚明称与设计模块的输入 输出端口一一对应 名称关联法 名称关联法的格式如下 设计模块端口名 连接实体端口名 端口列表中的位置可以是任意的 例 用模块例化方式设计8位计数译码器电路系统 在8位计数译码系统电路设计中 需要事先设计一个4位二进制加法计数器cnt4e模块和一个七段数码显示器的译码器Dec7s模块 然后用例化方式将这两种模块组成计数译码系统电路 4位二进制加法计数器的设计4位二进制加法计数器的符号如图 CLK是时钟输入端 CLR复位控制输入端 当CLR 1时计数器被复位 输出Q 3 0 0000 ENA是使能控制输入端 当ENA 1时 计数器才能工作 COUT是进位输出端 当输出Q 3 0 1111时 COUT 1 modulecnt4e clk clr ena cout q inputclk clr ena output 3 0 q outputcout reg 3 0 q always posedgeclrorposedgeclk beginif clr q b0000 elseif ena q q 1 endassigncout endmodule 七段数码显示器的译码器Dec7s的元件符号如图A 3 0 是4数据输入端 将接至cnt4e的输出端Q 3 0 Q 7 0 是译码器的输出端 提供七段数码显示数据 moduleDec7s a q output 7 0 q input 3 0 a reg 7 0 q always a begincase a 0 q 8 b00111111 1 q 8 b00000110 2 q 8 b01011011 3 q 8 b01001111 4 q 8 b01100110 5 q 8 b01101101 6 q 8 b01111101 7 q 8 b00000111 8 q 8 b01111111 9 q 8 b01101111 10 q 8 b01110111 11 q 8 b01111100 12 q 8 b00111001 13 q 8 b01011110 14 q 8 b01111001 15 q 8 b01110001 endcaseendendmodule 计数译码系统电路的设计计数译码系统电路是用QuartusII的图形编辑方式设计出来的 用模块例化方式将cnt4e和dec7s两种模块组成计数译码系统电路cnt dec7s的源程序 modulecnt Dec v clk clr ena cout q inputclk clr ena output 15 0 q outputcout reg 15 0 q wire 3 0 q1 q2 wirex cnt4eu1 clk clr ena x q1 cnt4eu2 clk clr x cout q2 dec7su3 q1 q 7 0 dec7su4 q2 q 15 8 endmodule 2数据流建模 例 数据流描述的一位全加器moduleFA Df A B Cin Sum Cout inputA B Cin outputSum Cout assignSum A B Cin assignCout A 数据流建模的时延assign 2Sum A B Cin 2表示右侧表达式的值延迟两个时间单位赋给Sum 时间单位是多少 由谁来决定 timescale1ns 100psFPGA设计中的时延仅在功能仿真时有效 不影响实际电路生成 数据流建模注意事项 1 wire型变量如果不赋值 默认值为z 2 数据流建模没有存储功能 不能保存数据 3 wire型变量只能在声明时赋值或者assing语句赋值 4 assign语句并发执行 实际的延迟又物理芯片的布线结果决定 三 VerilogHDL行为描述VerilogHDL行为描述方式是通过行为语句来描述电路要实现的功能 表示输入输出间转换的行为 不涉及具体结构 行为建模是一种 高级 的描述方式 行为描述既可以描述简单的逻辑门 又可以描述复杂的数字系统 乃至微处理器 既可以描述组合逻辑电路 又可以描述时序逻辑电路 例112选1数据选择器 用VerilogHDL对它做行为描述 modulemux 2 to 1 a b out outbar sel 这是一个2选1数据选择器 名为mux 2 to 1inputa b sel 定义模块的输入端口为a b和seloutputout outbar 定义模块的输出端口为out和outbarassignout sel a b 如果sel 1 将a赋值给out 如果sel 0 将b赋值给outassignoutbar out 将out取反后赋值给outbarendmodule 模块描述结束 例3线 8线译码器的VerilogHDL设计moduledecode3 8 a b c y en 这是一个3线 8线译码器 名为decode3 8inputa b c en 定义模块的输入端口output 7 0 y 定义模块的输出端口为outreg 7 0 y always enoraorborc beginif en y 8 b11111111 elsebegincase c b a 3 b000 y 8 b11111110 3 b001 y 8 b11111101 3 b010 y 8 b11111011 3 b011 y 8 b11110111 3 b100 y 8 b11101111 3 b101 y 8 b11011111 3 b110 y 8 b10111111 3 b111 y 8 b01111111 endcaseendendendmodule 模块描述结束 例138D锁存器的设计moduleD 8 d q en output 7 0 q inputen input 7 0 d reg 7 0 q always enord beginif en q q elseq d endendmodule 例14异步清除十进制加法计数器的描述异步清除是指复位信号有效时 计数器立即被清零 不考虑时钟 复位信号clr 高电平有效 时钟信号clk 上升沿触发 当clr 1 计数器清0 clr 0时 计数器正常计数 modulecnt10a clr clk cnt out 模块名称和端口名inputclr clk output 3 0 out outputcnt reg 3 0 out regcnt always posedgeclkorposedgeclr beginif clr beginout 4 b0000 cnt 0 endelseif out 4 b1001 beginout 4 b0000 cnt 1 endelsebegincnt 0 out out 1 endendendmodule 五VerilogHDL设计流程 1 启动Quartus 2 创建工程 3 建立文本编辑文件 4 编译 5 仿真与时序分析 6 锁定引脚并再次编译 7 编程下载 8 硬件功能测试 建立文本编辑文件包括打开文本编辑器 输入编辑文本文件 保存文件等步骤 仿真包括打开波形编辑器 选择需要仿真的I O节点信号 设置波形参数 编辑输入信号波形 保存波形文件 启动仿真等步骤 1 选择路径 确定工程和顶层文件名称 2 添加设计文件 3 选择目标器件 4 选择第三方EDA工具 5 工程结束 1 分析与综合 2 适配器件 3 编程文件汇编等 1 打开Editor编辑窗口 2 分配引脚 3 保存引脚锁定的信息 并再次

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论