




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
可编程逻辑器件eda工程设计流程 绝密 veriloghdl入门教程 请输入文档编号 3veriloghdl建模概述在数字电路设计中 数字电路可简单归纳为两种要素 线和器件 线是器件管脚之间的物理连线 器件也可简单归纳为组合逻辑器件 如与或非门等 和时序逻辑器件 如寄存器 锁存器 ram等 一个数字系统 硬件 就是多个器件通过一定的连线关系组合在一块的 因此 veriloghdl的建模实际上就是如何使用hdl语言对数字电路的两种基本要素的特性及相互之间的关系进行描述的过程 下面通过一些实例 以便对veriloghdl的设计建模有个大概的印象 3 1模块模块 module 是verilog的基本描述单位 用于描述某个设计的功能或结构及与其他模块通信的外部端口 模块在概念上可等同一个器件就如我们调用通用器件 与门 三态门等 或通用宏单元 计数器 alu cpu 等 因此 一个模块可在另一个模块中调用 一个电路设计可由多个模块组合而成 因此一个模块的设计只是一个系统设计中的某个层次设计 模块设计可采用多种建模方式 3 1 1简单事例下面先介绍几个简单的veriloghdl程序 例 1 加法器moduleaddr a b cin count sum 模块定义input 2 0 a input 2 0 b inputcin outputcount output 2 0 sum assign count sum a b cin endmodule该例描述一个3位加法器 从例子可看出整个模块是以module开始 endmodule结束 例 2 比较器modulecompare equal a b input 1 0 a b declaretheinputsignal outputequare declaretheoutputsignal assignequare a b 1 0 ifa b output1 otherwise0 endmodule 2004 08 16 版权所有 侵权必究 第9页 共41页 绝密 veriloghdl入门教程 请输入文档编号 该例描述一个比较器 从上可看到 和 表示注释部分 注释只是为了方便设计者读懂代码 对编译并不起作用 例 3 三态驱动器modulemytri din d en d out inputdin inputd en outputd out enteryourstatementshere assignd out d en din bz endmodulemoduletrist din d en d out inputdin inputd en outputd out statementshere mytriu mytri din d en d out endmodule该例描述了一个三态驱动器 其中三态驱动门在模块mytri中描述 而在模块trist中调用了模块mytri 模块mytri对trist而言相当于一个已存在的器件 在trist模块中对该器件进行实例化 实例化名u mytri 3 1 2模块的结构通过上面的实例可看出 一个设计是由一个个模块 module 构成的 一个模块的设计如下 1 模块内容是嵌在module和endmodule两个语句之间 每个模块实现特定的功能 模块可进行层次的嵌套 因此可以将大型的数字电路设计分割成大小不一的小模块来实现特定的功能 最后通过由顶层模块调用子模块来实现整体功能 这就是top down的设计思想 如3 3 1的例 3 2 模块包括接口描述部分和逻辑功能描述部分 这可以把模块与器件相类比 模块的端口定义部分 如上例 moduleaddr a b cin count sum 其中module是模块的保留字 addr是模块的名字 相当于器件名 内是该模块的端口声明 定义了该模块的管脚名 是该模块与其他模块通讯的外部接口 相当于器件的pin 模块的内容 包括i o说明 内部信号 调用模块等的声明语句和功能定义语句 i o说明语句如 input 2 0 a input 2 0 b inputcin outputcount 其中的input output inout是保留字 定义了管脚信号的流向 n 0 表示该信号的位宽 总线或单根信号线 2004 08 16 版权所有 侵权必究 第10页 共41页 绝密 veriloghdl入门教程逻辑功能描述部分如 assign d out d en din bz 请输入文档编号 mytriu mytri din d en d out 功能描述用来产生各种逻辑 主要是组合逻辑和时序逻辑 可用多种方法进行描述 具体的用法下面章节有介绍 还可用来实例化一个器件 该器件可以是厂家的器件库也可以是我们自己用hdl设计的模块 相当于在原理图输入时调用一个库元件 在逻辑功能描述中 主要用到assign和always两个语句 3 对每个模块都要进行端口定义 并说明输入 输出口 然后对模块的功能进行逻辑描述 当然 对测试模块 可以没有输入输出口 4 veriloghdl的书写格式自由 一行可以写几个语句 也可以一个语句分几行写 具体由代码书写规范约束 5 除endmodule语句外 每个语句后面需有分号表示该语句结束 3 1 3模块语法1 一个模块的基本语法如下 一个模块的基本语法如下 modulemodule name port1 port2 declarations input output inout reg wire parameter function task statements initialstatementalwaysstatementmoduleinstantiationgateinstantiationcontinuousassignmentendmodule模块的结构需按上面的顺序进行 声明区用来对信号方向 信号数据类型 函数 任务 参数等进行描述 语句区用来对功能进行描述如 器件调用 moduleinstantiation 等 2 书写语法建议一个模块用一个文件 模块名与文件名要同名 一行一句语句 信号方向按输入 输出 双向顺序描述 设计模块时可尽量考虑采用参数化 提高设计的重用 以上是初学者的建议 具体的或深入的方面可看相关的文档 下面的有关语法建议类似 3 2时延 2004 08 16 版权所有 侵权必究 第11页 共41页 绝密 veriloghdl入门教程 请输入文档编号 信号在电路中传输会有传播延时等 如线延时 器件延时 时延就是对延时特性的hdl描述 举例如下 assign 2 b a 表示b信号在2个时间单位后得到a信号的值 如下图 a b 2 图3在veriloghdl中 所有时延都必须根据时间单位进行定义 定义方式为在文件头添加如下语句 timescale1ns 100ps其中 timescale是veriloghdl提供的预编译处理命令 1ns表示时间单位是1ns 100ps表示时间精度是100ps 根据该命令 编译工具才可以认知 2为2ns 在veriloghdl的ieee标准中没有规定时间单位的缺省值 由各模拟工具确定 因此 在写代码时必须确定 3 3三种建模方式在hdl的建模中 主要有结构化描述方式 数据流描述方式和行为描述方式 下面分别举例说明三者之间的区别 3 3 1结构化描述方式结构化的建模方式就是通过对电路结构的描述来建模 即通过对器件的调用 hdl概念称为例化 并使用线网来连接各器件的描述方式 这里的器件包括veriloghdl的内置门如与门and 异或门xor等 也可以是用户的一个设计 结构化的描述方式反映了一个设计的层次结构 例 1 一位全加器图4一位全加器的结构图代码 modulefa struct a b cin sum count inputa inputb inputcin 2004 08 16 版权所有 侵权必究 第12页 共41页 绝密 veriloghdl入门教程 请输入文档编号 outputsum outputcount wires1 t1 t2 t3 statements xorx1 s1 a b xorx2 sum s1 cin anda1 t3 a b anda2 t2 b cin anda3 t1 a cin oro1 cout t1 t2 t3 endmodule该实例显示了一个全加器由两个异或门 三个与门 一个或门构成 s1 t1 t2 t3则是门与门之间的连线 代码显示了用纯结构的建模方式 其中xor and or是veriloghdl内置的门器件 以xorx1 s1 a b 该例化语句为例 xor表明调用一个内置的异或门 器件名称xor 代码实例化名x1 类似原理图输入方式 括号内的s1 a b表明该器件管脚的实际连接线 信号 的名称 其中a b是输入 s1是输出 其他同 例 2 两位的全加器两位的全加器可通过调用两个一位的全加器来实现 该设计的设计层次示意图和结构图如下 four bit fa fafcin abcin sumfa structcount fsum fa struct fa struct a sum fb bcin fa structcount fcount four bit fa图5两位全加器的结构示意图代码 modulefour bit fa fa fb fcin fsum fcout parametersize 2 input size 1 fa 2004 08 16 版权所有 侵权必究 第13页 共41页 绝密 veriloghdl入门教程input size 1 fb inputfcin output size 1 fsum outputfcout wireftemp fa structfa1 a fa 1 b fb 1 cin fcin sum fsum 1 cout ftemp 请输入文档编号 fa struct fa2 a fa 2 b fb 2 cin ftemp sum fsum 2 cout fcount endmodule该实例用结构化建模方式进行一个两位的全加器的设计 顶层模块four bit fa调用了两个一位的全加器fa struct 在这里 以前的设计模块fa struct对顶层而言是一个现成的器件 顶层模块只要进行例化就可以了 注意这里的例化中 端口映射 管脚的连线 采用名字关联 如 a fa 2 其中 a表示调用器件的管脚a 括号中的信号表示接到该管脚a的电路中的具体信号 wire保留字表明信号ftemp是属线网类型 下面有具体描述 另外 在设计中 尽量考虑参数化的问题 器件的端口映射必须采用名字关联 3 3 2数据流描述方式数据流的建模方式就是通过对数据流在设计中的具体行为的描述的来建模 最基本的机制就是用连续赋值语句 在连续赋值语句中 某个值被赋给某个线网变量 信号 语法如下 assign delay net name expression 如 assign 2a b 2004 08 16 版权所有 侵权必究 第14页 共41页 绝密 veriloghdl入门教程 请输入文档编号 在数据流描述方式中 还必须借助于hdl提供的一些运算符 如按位逻辑运算符 逻辑与 2004 08 16 版权所有 侵权必究 第15页 共41页 绝密 veriloghdl入门教程 请输入文档编号 regsum cout regt1 t2 t3 always aorborcin beginsum a b cin t1 aendendmodule在例2中 采用更加高级 更趋于行为级 描述方式 即直接采用 来描述加法 count sum 表示对位数的扩展 因为两个1bit相加 和有两位 低位放在sum变量中 进位放在count中 3 3 4混合设计描述 2004 08 16 版权所有 侵权必究 第16页 共41页 绝密 veriloghdl入门教程 请输入文档编号 在实际的设计中 往往是多种设计模型的混合 一般地 对顶层设计 采用结构描述方式 对低层模块 可采用数据流 行为级或两者的结合 如上面的两bit全加器 对顶层模块 four bit fa 采用结构描述方式对低层进行例化 对低层模块 fa 可采用结构描述 数据流描述或行为级描述 4veriloghdl基本语法本节介绍veriloghdl语言的一些基本要素 包括标识符 注释 格式 数字值集合 两种数据类型 运算符和表达式和一些基本的语句如if语句等 4 1标识符4 1 1定义标识符 identifier 用于定义模块名 端口名 信号名等 veriloghdl中的标识符 identifier 可以是任意一组字母 数字 符号和 下划线 符号的组合 但标识符的第一个字符必须是字母或者下划线 另外 标识符是区分大小写的 以下是标识符的几个例子 count count 与count不同 r56 68five 4 1 2关键词veriloghdl定义了一系列保留字 叫做关键词 附录a列出了语言中的所有保留字 注意只有小写的关键词才是保留字 例如 标识符always 这是个关键词 与标识符always 非关键词 是不同的 4 1 3书写规范建议以下是一些书写规范的要求1 用有意义的有效的名字如sum cpu addr等 2 用下划线区分词 3 采用一些前缀或后缀 如时钟采用clk前缀 clk 50 clk cpu 低电平采用 n后缀 enable n 4 统一一定的缩写如全局复位信号rst 5 同一信号在不同层次保持一致性 如同一时钟信号必须在各模块保持一致 6 自定义的标识符不能与保留字同名 7 参数采用大写 如size 4 2注释veriloghdl中有两种注释的方式 一种是以 符号开始 结束 在两个符号之间的语句都是注释语句 因此可扩展到多行 如 2004 08 16 版权所有 侵权必究 第17页 共41页 绝密 veriloghdl入门教程 请输入文档编号 statement1 statement2 statementn 以上n个语句都是注释语句 另一种是以 开头的语句 它表示以 开始到本行结束都属于注释语句 4 3格式veriloghdl是区分大小写的 即大小写不同的标识符是不同的 另外veriloghdl的书写格式是自由的 即一条语句可多行书写 一行可写多个语句 白空 新行 制表符 空格 没有特殊意义 如inputa inputb 与inputa inputb 是一样的 书写规范建议 一个语句一行 采用空四格的table键进行缩进 4 4数字值集合本小节介绍veriloghdl的值的集合和常量 整型 实型 字符型 和变量等 4 4 1值集合veriloghdl中规定了四种基本的值类型 0 逻辑0或 假 1 逻辑1或 真 x 未知值 z 高阻 注意这四种值的解释都内置于语言中 如一个为z的值总是意味着高阻抗 一个为0的值通常是指逻辑0 在门的输入或一个表达式中的为 z 的值通常解释成 x 此外 x值和z值都是不分大小写的 也就是说 值0 x1z与值0x1z相同 veriloghdl中的常量是由以上这四类基本值组成的 4 4 2常量veriloghdl中有三种常量 整型 实型 字符串型 2004 08 16 版权所有 侵权必究 第18页 共41页 绝密 veriloghdl入门教程 请输入文档编号 下划线符号 可以随意用在整数或实数中 它们就数量本身没有意义 它们能用来提高易读性 唯一的限制是下划线符号不能用作为首字符 下面主要介绍整型和字符串型 1 整型整型数可以按如下两种方式书写 1 简单的十进制数格式2 基数格式a 简单的十进制格式这种形式的整数定义为带有一个可选的 一元 或 一元 操作符的数字序列 下面是这种简易十进制形式整数的例子 32 15 十进制数32十进制数 15 b 基数表示法这种形式的整数格式为 size basevaluesize定义以位计的常量的位长 base为o或o 表示八进制 b或b 表示二进制 d或d 表示十进制 h或h 表示十六进制 之一 value是基于base的值的数字序列 值x和z以及十六进制中的a到f不区分大小写 下面是一些具体实例 5 o374 d24 b1x 017 hx4 hz4 d 48 h2a3 b001 2 3 b10 5位八进制数 二进制11111 4位十进制数 二进制0011 4位二进制数7位x 扩展的x 即xxxxxxx4位z 扩展的z 即zzzz非法 数值不能为负在位长和字符之间 以及基数和数值之间允许出现空格非法 和基数b之间不允许出现空格非法 位长不能够为表达式 注意 x 或z 在十六进制值中代表4位x 或z 在八进制中代表3位x 或z 在二进制中代表1位x 或z 基数格式计数形式的数通常为无符号数 这种形式的整型数的长度定义是可选的 如果没有定义一个整数型的长度 数的长度为相应值中定义的位数 下面是两个例子 o721 haf2004 08 16 9位八进制数8位十六进制数 版权所有 侵权必究 第19页 共41页 绝密 veriloghdl入门教程 请输入文档编号 如果定义的长度比为常量指定的长度长 通常在左边填0补位 但是如果数最左边一位为x或z 就相应地用x或z在左边补位 例如 10 b1010 bx0 x1 左边添0占位 0000000010左边添x占位 xxxxxxx0 x1 如果长度定义得更小 那么最左边的位相应地被截断 例如 3 b1001 0011与3 b011相等5 h0fff与5 h1f相等2 字符串型字符串是双引号内的字符序列 字符串不能分成多行书写 例如 internalerror reached here 用8位ascii值表示的字符可看作是无符号整数 因此字符串是8位ascii值的序列 为存储字符串 internalerror 变量需要8 14位 reg 1 8 14 message message internalerror 4 5数据类型veriloghdl主要包括两种数据类型线网类型 nettype 和寄存器类型 regtype 4 5 1线网类型1 wire和tri定义线网类型主要有wire和tri两种 线网类型用于对结构化器件之间的物理连线的建模 如器件的管脚 内部器件如与门的输出等 以上面的加法器为例 输入信号a b是由外部器件所驱动 异或门x1的输出s1是与异或门x2输入脚相连的物理连接线 它由异或门x1所驱动 由于线网类型代表的是物理连接线 因此它不存贮逻辑值 必须由器件所驱动 通常由assign进行赋值 如assigna b c 当一个wire类型的信号没有被驱动时 缺省值为z 高阻 信号没有定义数据类型时 缺省为wire类型 如上面一位全加器的端口信号a b sum等 没有定义类型 故缺省为wire线网类型 2 两者区别tri主要用于定义三态的线网 4 5 2寄存器类型 2004 08 16 版权所有 侵权必究 第20页 共41页 绝密 veriloghdl入门教程 请输入文档编号 1 定义reg是最常用的寄存器类型 寄存器类型通常用于对存储单元的描述 如d型触发器 rom等 存储器类型的信号当在某种触发机制下分配了一个值 在分配下一个值之时保留原值 但必须注意的是 reg类型的变量 不一定是存储单元 如在always语句中进行描述的必须用reg类型的变量 reg类型定义语法如下 reg msb lsb reg1 reg2 regn msb和lsb定义了范围 并且均为常数值表达式 范围定义是可选的 如果没有定义范围 缺省值为1位寄存器 例如 reg 3 0 sat regcnt sat为4位寄存器 1位寄存器 reg 1 32 kisp pisp lisp 寄存器类型的值可取负数 但若该变量用于表达式的运算中 则按无符号类型处理 如 reg a a 1 则a的二进制为1111 在运算中 a总按无符号数15来看待 2 寄存器类型的存储单元建模举例用寄存器类型来构建两位的d触发器如下 reg 1 0 dout always posedgeclk dout din 用寄存器数组类型来建立存储器的模型 如对2个8位的ram建模如下 reg 7 0 mem 0 1 对存储单元的赋值必须一个个的赋值 如上2个8位的ram的赋值必须用两条赋值语句 mem 0 h55 mem 1 haa 3 书写规范建议对数组类型 请按降序方式 如 7 0 4 6运算符和表达式 2004 08 16 版权所有 侵权必究 第21页 共41页 绝密 veriloghdl入门教程 请输入文档编号 4 6 1算术运算符在常用的算术运算符主要是 加法 二元运算符 减法 二元运算符 乘法 二元运算符 在算术运算符的使用中 注意如下两个问题 1 算术操作结果的位数长度算术表达式结果的长度由最长的操作数决定 在赋值语句下 算术操作结果的长度由操作符左端目标长度决定 考虑如下实例 reg 3 0 arc bar crt reg 5 0 frx arc bar crt frx bar crt 第一个加的结果长度由bar crt和arc长度决定 长度为4位 第二个加法操作的长度同样由frx的长度决定 frx bat和crt中的最长长度 长度为6位 在第一个赋值中 加法操作的溢出部分被丢弃 而在第二个赋值中 任何溢出的位存储在结果位frx 4 中 在较大的表达式中 中间结果的长度如何确定 在veriloghdl中定义了如下规则 表达式中的所有中间结果应取最大操作数的长度 赋值时 此规则也包括左端目标 考虑另一个实例 wire 4 1 box drt wire 5 1 cfg wire 6 1 peg wire 8 1 adt assignadt box cfg drt peg 表达式右端的操作数最长为6 但是将左端包含在内时 最大长度为8 所以所有的加操作使用8位进行 2 有符号数和无符号数在设计中 请先按无符号数进行 4 6 2关系运算符关系运算符有 大于 2004 08 16 版权所有 侵权必究 第22页 共41页 绝密 veriloghdl入门教程 请输入文档编号 不小于 45结果为假 0 而 52 b01110等价于 b01000 b01110结果为假 0 在逻辑相等与不等的比较中 只要一个操作数含有x或z 比较结果为未知 x 如 假定 data b11x0 addr b11x0 那么 data addr比较结果不定 也就是说值为x 4 6 3逻辑运算符逻辑运算符有 1为真那么 crd dgs结果为0 假 crd dgs结果为1 真 dgs结果为0 假 逻辑与 的真值表如下 表1逻辑与真值表 2004 08 16 版权所有 侵权必究 第23页 共41页 绝密 veriloghdl入门教程 请输入文档编号 0 假 1 真 x z 不定 0 假 00 x 1 真 01x x z 不定 xxx 逻辑或的真值表如下 表2逻辑或真值表 0 假 1 真 x z 不定 01x z 不定 01x 111 x1x 4 6 4按位逻辑运算符按位运算符有 一元非 相当于非门运算 二元与 相当于与门运算 二元或 相当于或门运算 二元异或 相当于异或门运算 二元异或非即同或 相当于同或门运算 这些操作符在输入操作数的对应位上按位操作 并产生向量结果 下表显示对于不同按位逻辑运算符按位操作的结果 图7按位逻辑运算符真值表例如 假定 2004 08 16 版权所有 侵权必究 第24页 共41页 绝密 veriloghdl入门教程 请输入文档编号 a b0110 b b0100 那么 a b结果为0110a 高4位与低4位交换 由于非定长常数的长度未知 不允许连接非定长常数 例如 下列式子非法 dbus 5 不允许连接操作非定长常数 4 7条件语句if语句的语法如下 if condition 1 procedural statement 1 2004 08 16 版权所有 侵权必究 第25页 共41页 绝密 veriloghdl入门教程 请输入文档编号 elseif condition 2 procedural statement 2 elseprocedural statement 3 如果对condition 1求值的结果为个非零值 那么procedural statement 1被执 如果condition 1的值为0 x或z 那么procedural statement 1不执行 如果存在一个else分支 那么这个分支被执行 以下是一个例子 if sum 60 begingrade c total c total c 1 endelseif sum 75 begingrade b total b total b 1 endelsebegingrade a total a total a 1 end注意条件表达式必须总是被括起来 如果使用if if else格式 那么可能会有二义性 如下例所示 if clk if reset q 0 elseq d 问题是最后一个else属于哪一个if 它是属于第一个if的条件 clk 还是属于第二个if的条件 reset 这在veriloghdl中已通过将else与最近的没有else的if相关联来解决 在这个例子中 else与内层if语句相关联 以下是另一些if语句的例子 if sum 100 sum sum 10 if nickel in deposit 5 2004 08 16 版权所有 侵权必究 第26页 共41页 绝密 veriloghdl入门教程 请输入文档编号 elseif dime in deposit 10 elseif quarter in deposit 25 elsedeposit error 书写建议 1 条件表达式需用括号括起来 2 若为if if语句 请使用块语句begin end if clk beginif reset q 0 elseq d end以上两点建议是为了使代码更加清晰 防止出错 3 对if语句 除非在时序逻辑中 if语句需要有else语句 若没有缺省语句 设计将产生一个锁存器 锁存器在asic设计中有诸多的弊端 如下一例 if t q d 没有else语句 当t为1 真 时 d被赋值给q 当t为0 假 时 因为没有else语句 电路保持q以前的值 这就形成一个锁存器 4 8case语句case语句是一个多路条件分支形式 其语法如下 case case expr case item expr case item expr procedural statement default procedural statement endcasecase语句首先对条件表达式case expr求值 然后依次对各分支项求值并进行比较 第一个与条件表达式值相匹配的分支中的语句被执行 可以在1个分支中定义多个分支项 这些值不需要互斥 缺省分支覆盖所有没有被分支表达式覆盖的其他分支 例 case hex 2004 08 16 4 b0001 led 7 b1111001 1 第27页 共41页 版权所有 侵权必究 绝密 veriloghdl入门教程 请输入文档编号 4 b0010 4 b0011 4 b0100 4 b0101 4 b0110 4 b0111 4 b1000 4 b1001 4 b1010 4 b1011 4 b1100 4 b1101 4 b1110 4 b1111 led 7 b0100100 led 7 b0110000 led 7 b0011001 led 7 b0010010 led 7 b0000010 led 7 b1111000 led 7 b0000000 led 7 b0010000 led 7 b0001000 led 7 b0000011 led 7 b1000110 led 7 b0100001 led 7 b0000110 led 7 b0001110 2 3 4 5 6 7 8 9 a b c d e f default led 7 b1000000 0 endcase书写建议 case的缺省项必须写 防止产生锁存器 5结构建模在3 3 1中 我们已简单介绍了结构化的描述方式 本章节再总结一下 5 1模块定义结构我们已经了解到 一个设计实际上是由一个个module组成的 一个模块module的结构如下 modulemodule name port list declarations and statementsendmodule在结构建模中 描述语句主要是实例化语句 包括对veriloghdl内置门如与门 and 异或门 xor 等的例化 如3 3 1节中全加器的xor门的调用 及对其他器件的调用 这里的器件包括fpga厂家提供的一些宏单元以及设计者已经有的设计 在实际应用中 实例化语句主用指后者 对内置门建议不采纳 而用数据流或行为级方式对基本门电路的描述 端口队列port list列出了该模块通过哪些端口与外部模块通信 5 2模块端口 2004 08 16 版权所有 侵权必究 第28页 共41页 绝密 veriloghdl入门教程 请输入文档编号 模块的端口可以是输入端口 输出端口或双向端口 缺省的端口类型为线网类型 即wire类型 输出或输入输出端口能够被重新声明为reg型 无论是在线网说明还是寄存器说明中 线网或寄存器必须与端口说明中指定的长度相同 下面是一些端口说明实例 modulemicro pc instr nextaddr 端口说明input 3 1 pc output 1 8 instr inout 16 1 nextaddr 重新说明端口类型 wire 16 1 nextaddr 该说明是可选的 因为缺省的就是wire类型 但如果指定了 就 必须与它的端口说明保持相同长度 这里定义线的位宽16 是总线 reg 1 8 instr instr已被重新说明为reg类型 因此它能在always语句或在initial语句中 赋值 endmodule5 3实例化语句1 例化语法一个模块能够在另外一个模块中被引用 这样就建立了描述的层次 模块实例化语句形式如下 module nameinstance name port associations 信号端口可以通过位置或名称关联 但是关联方式不能够混合使用 端口关联形式如下 port expr 通过位置 portname port expr 通过名称 例 1 moduleand c a b inputa b outputc anda1 t3 a b 实例化时采用位置关联 t3对应输出端口c a对应a b对应b anda2 c t3 a a b b 2004 08 16 实例化时采用名字关联 c是and器件的端口 其与信号t3相连第29页 共41页版权所有 侵权必究 绝密 veriloghdl入门教程 请输入文档编号 port expr可以是以下的任何类型 1 标识符 reg或net 如 c t3 t3为wire型标识符 2 位选择 如 c d 0 c端口接到d信号的第0bit位 3 部分选择 如 bus din 5 4 4 上述类型的合并 如 addr a1 a2 1 0 5 表达式 只适用于输入端口 如 a wirezire 0 建议 在例化的端口映射中请采用名字关联 这样 当被调用的模块管脚改变时不易出错 2 悬空端口的处理在我们的实例化中 可能有些管脚没用到 可在映射中采用空白处理 如 dffd1 q qs qbar data d preset 该管脚悬空 clock ck 名称对应方式 对输入管脚悬空的 则该管脚输入为高阻z 输出管脚被悬空的 该输出管脚废弃不用 3 不同端口长度的处理当端口和局部端口表达式的长度不同时 端口通过无符号数的右对齐或截断方式进行匹配 例如 module child pba ppy input 5 0 pba output 2 0 ppy endmodulemoduletop wire 1 2 bdl wire 2 6 mpr childc1 bdl mpr endmodule 2004 08 16 版权所有 侵权必究 第30页 共41页 绝密 veriloghdl入门教程 请输入文档编号 在对child模块的实例中 bdl 2 连接到pba 0 bdl 1 连接到pba 1 余下的输入端口pba 5 pba 4 和pba 3 悬空 因此为高阻态z 与之相似 mpr 6 连接到ppy 0 mpr 5 连接到ppy 1 mpr 4 连接到ppy 2 参见下图 图8端口匹配5 4结构化建模具体实例对一个数字系统的设计 我们采用的是自顶向下的设计方式 可把系统划分成几个功能模块 每个功能模块再划分成下一层的子模块 每个模块的设计对应一个module 一个module设计成一个veriloghdl程序文件 因此 对一个系统的顶层模块 我们采用结构化的设计 即顶层模块分别调用了各个功能模块 下面以一个实例 一个频率计数器系统 说明如何用hdl进行系统设计 在该系统中 我们划分成如下三个部分 2输入与门模块 led显示模块 4位计数器模块 系统的层次描述如下 top cnt bcd cnt bcd v sub and2 and2 v cnt 4b cnt 4b v hex2led hex2led v 图9系统层次描述顶层模块cnt bcd 文件名cnt bcd v 该模块调用了低层模块and2 cnt 4b和hex2led 系统的电路结构图如下 图10系统电路框图 2004 08 16 版权所有 侵权必究 第31页 共41页 绝密 veriloghdl入门教程顶层模块cnt bcd对应的设计文件cnt bcd v内容为 modulecnt bcd bcd a bcd b bcd c bcd d clk gate reset portdeclarations inputclk inputgate inputreset output 3 0 bcd a output 3 0 bcd b output 3 0 bcd c output 3 0 bcd d wireclk wiregate wirereset wire 3 0 bcd a wire 3 0 bcd b wire 3 0 bcd c wire 3 0 bcd d signaldeclarations wirenet104 wirenet116 wirenet124 wirenet132 wirenet80 wirenet92 componentinstantiations cnt 4bu0 clk clk enable gate full net80 q bcd a reset reset cnt 4bu1 clk clk enable net116 2004 08 16版权所有 侵权必究 请输入文档编号第32页 共41页 绝密 veriloghdl入门教程 full net92 q bcd b reset reset cnt 4bu2 clk clk enable net124 full net104 q bcd c reset reset cnt 4bu3 clk clk enable net132 q bcd d reset reset and2u4 a0 net80 a1 gate y net116 and2u5 a0 net92 a1 net116 y net124 and2u6 a0 net104 a1 net124 y net132 endmodule2004 08 16 版权所有 侵权必究 请输入文档编号第33页 共41页 绝密 veriloghdl入门教程 请输入文档编号 注意 这里的and2是为了举例说明 在实际设计中 对门级不要重新设计成一个模块 同时对涉及保留字的 不管大小写 相类似的标识符最好不用 6数据流建模在3 3 2节中 我们已经初步了解到数据流描述方式 本节对数据流的建模方式进一步讨论 主要讲述连续赋值语句 阻塞赋值语句 非阻塞赋值语句 并针对一个系统设计频率计数器的实例进行讲解 6 1连续赋值语句数据流的描述是采用连续赋值语句 assign 语句来实现的 语法如下 assign net type 表达式 连续赋值语句用于组合逻辑的建模 等式左边是wire类型的变量 等式右边可以是常量 由运算符如逻辑运算符 算术运算符参与的表达 如下几个实例 wire 3 0 z preset clear assignz preset 线网说明 连续赋值语句 wirecout cin wire 3 0 sum a b assign cout sum a b cin assignmux s 3 d bz 注意如下几个方面 1 连续赋值语句的执行是 只要右边表达式任一个变量有变化 表达式立即被计算 计算的结果立即赋给左边信号 2 连续赋值语句之间是并行语句 因此与位置顺序无关 6 2阻塞赋值语句 用于阻塞的赋值 凡是在组合逻辑 如在assign语句中 赋值的请用阻塞赋值 更深的知识以后再讲 6 3数据流建模具体实例以上面的频率计数器为例 其中的and2模块我们用数据流来建模 and2模块对应文件and2 v的内容如下 moduleand2 a0 a1 y inputa0 inputa1 outputy 2004 08 16 版权所有 侵权必究 第34页 共41页 绝密 veriloghdl入门教程 请输入文档编号 wirea0 wirea1 wirey addyourcodehereassigny a0end 2004 08 16 版权所有 侵权必究 第35页 共41页 绝密 veriloghdl入门教程 请输入文档编号 假定顺序语句块在第10个时间单位开始执行 两个时间单位后第1条语句执行 即第12个时间单位 此执行完成后 下1条语句在第17个时间单位执行 延迟5个时间单位 然后下1条语句在第20个时间单位执行 以此类推 该顺序语句块执行过程中产生的波形如图 图11顺序语句块中积累延时7 3过程赋值语句veriloghdl中提供两种过程赋值语句initial和always语句 用这两种语句来实现行为的建模 这两种语句之间的执行是并行的 即语句的执行与位置顺序无关 这两种语句通常与语句块 begin end 相结合 则语句块中的执行是按顺序执行的 1 initial语句initial语句只执行一次 即在设计被开始模拟执行时开始 0时刻 通常只用在对设计进行仿真的测试文件中 用于对一些信号进行初始化和产生特定的信号波形 语法如下 大家只要先有个概念就可以 initial timing control procedural statementprocedural statement是下列语句之一 procedural assignment blockingornon blocking 阻塞或非阻塞性过程赋值语句 procedural continuous assignmentconditional statementcase statementloop statementwait statementdisable statementevent triggertask enable userorsystem 事例如上产生一个信号波形 initialbegin 2stream 1 5stream 0 3stream 1 4stream 0 2stream 1 5stream 0 end 2004 08 16 版权所有 侵权必究 第36页 共41页 绝密 veriloghdl入门教程 请输入文档编号 2 always语句always语句与initial语句相反 是被重复执行 执行机制是通过对一个称为敏感变量表的事件驱动来实现的 下面会具体讲到 always语句可实现组合逻辑或时序逻辑的建模 例 1 initialclk 0 always 5clk clk 因为always语句是重复执行的 因此 clk是初始值为0的 周期为10的方波 例 2 d触发器always posedgeclkorposedgerst beginifrstq b0 elseq d 上面括号内的内容称为敏感变量 即整个always语句当敏感变量有变化时被执行 否则不执行 因此 当rst为1时 q被复位 在时钟上升沿时 d被采样到q 有 的用来描述一个时序器件 例 3 2选一的分配器always sel a b c sel a b 这里的sel a b同样称为敏感变量 当三者之一有变化时 always被执行 当sel为1 c被赋值为a 否则为b 描述的是一个组合逻辑mux器件 注意以下几点 1 对组合逻辑的always语句 敏感变量必须写全 敏感变量是指等式右边出现的所有标识符如上的a b和条件表达式中出现的所以标识符如上例3的sel 2 对组合逻辑器件的赋值采用阻塞赋值 3 时序逻辑器件的赋值语句采用非阻塞赋值 如上的q d 7 4行为建模具体实例以上面的频率计数器为例 其中的hex2led和cnt 4b模块采用行为建模 2004 08 16 版权所有 侵权必究 第37页 共41页 绝密 veriloghdl入门教程cnt 4b模块对应的文件cnt 4b v的内容如下 modulecnt 4b clk enable reset full q inputclk inputenable inputreset outputfull output 3 0 q wireclk wireenable wirereset wirefull wire 3 0 q addyourdeclarationsherereg 3 0 qint always posedgeresetorposedgeclk beginif reset qint 4 b0000 elseif enable beginif qint 9 qint 4 b0000 elseqint qint 4 b1 endendassignq qint assignfull qint 9 1 b1 1 b0 endmodule该模块实现一个模10的计数器 hex2led模块对应的文件hex2led v的内容为 modulehex2led hex led 2004 08 16版权所有 侵权必究 请输入文档编号第38页 共41页 绝密 veriloghdl入门教程input 3 0 hex output 6 0 led wire 3 0 hex reg 6 0 led addyourdeclarationsherealways hex begincase hex 请输入文档编
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年甘肃有色冶金职业技术学院妇产护理期末每日一练试卷及完整答案详解【全优】
- 2024-2025学年辅警招聘考试题库检测试题打印含完整答案详解【各地真题】
- 山东临沂产业发展投资集团及权属公司招聘笔试题库参考答案详解
- 解析卷浙教版七年级下册第六章数据与统计图表同步训练试题(含详解)
- 2025四川国土空间规划研究院考核招聘专业技术人员5人笔试模拟试题及答案详解(网校专用)
- 执业药师之《药事管理与法规》题库检测模拟题及参考答案详解(综合卷)
- 2025年新能源汽车换电模式在共享出行领域的应用与电池资产管理策略报告
- 2025居间合同格式
- 2025年农业生物技术在种子品种培育中的基因资源利用与保护研究报告
- 2025年中国个人漂浮装置行业市场全景分析及前景机遇研判报告
- 2025年数字解密:药食同源生意下最香的成分与赛道研究报告
- GB/T 12643-2025机器人词汇
- 2型糖尿病的综合管理课件
- 马克思主义政治经济学第2章-货币课件
- 学术规范与论文写作讲述课件
- 七年级数学学习·探究·诊断上册
- 弹簧设计基础知识概要课件
- GB∕T 17794-2021 柔性泡沫橡塑绝热制品
- 商业银行监管评级简表
- 肾动脉狭窄介入治疗PPT课件(PPT 30页)
- 10kV架空线路设计PPT课件(PPT 69页)
评论
0/150
提交评论