




已阅读5页,还剩297页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VerilogHDL基础第一部分初级篇 第一讲Verilog的基本概念 2020 3 25 2 硬件描述语言HDL HardwareDescriptionLanguage 是硬件设计人员和电子设计自动化 EDA 工具之间的接口 其主要目的是用来编写设计文件 建立电子系统行为级的仿真模型 1 1硬件描述语言HDL 2020 3 25 3 1 1硬件描述语言HDL 硬件描述语言利用计算机的巨大能力对用HDL建模的复杂数字逻辑进行仿真 然后再自动综合以生成符合要求且在电路结构上可以实现的数字逻辑网表 Netlist 根据网表和某种工艺的器件自动生成具体电路然后生成该工艺条件下这种具体电路的延时模型 仿真验证无误后用于制造ASIC芯片或写入CPLD和FPGA器件中 2020 3 25 4 什么是硬件描述语言 具有特殊结构能够对硬件逻辑电路的功能进行描述的一种高级编程语言这种特殊结构能够 描述电路的连接描述电路的功能在不同抽象级上描述电路描述电路的时序表达具有并行性HDL主要有两种 Verilog和VHDLVerilog起源于C语言 因此非常类似于C语言 容易掌握VHDL格式严谨VHDL出现较晚 但标准化早 IEEE1706 1985标准 2020 3 25 5 为什么要使用硬件描述语言 电路的逻辑功能容易理解 便于计算机对逻辑进行分析处理 把逻辑设计与具体电路的实现分成两个独立的阶段来操作 逻辑设计与实现的工艺无关 逻辑设计的资源积累可以重复利用 可以由多人共同更好更快地设计非常复杂的逻辑电路 几十万门以上的逻辑系统 2020 3 25 6 1 2VerilogHDL的历史 1 2 1什么是VerilogHDLVerilogHDL是硬件描述语言的一种 用于数字电子系统设计 设计者可用它进行各种级别的逻辑设计 可用它进行数字逻辑系统的仿真验证 时序分析 逻辑综合 它是目前应用最广泛的一种硬件描述语言 2020 3 25 7 1 2VerilogHDL的历史 1 2 2VerilogHDL的产生及发展VerilogHDL是在1983年由GDA GateWayDesignAutomation 公司的PhilMoorby所创 PhiMoorby后来成为Verilog XL的主要设计者和Cadence公司的第一个合伙人 在1984 1985年间 Moorby设计出了第一个Verilog XL的仿真器 1986年 Moorby提出了用于快速门级仿真的XL算法 1990年 Cadence公司收购了GDA公司1991年 Cadence公司公开发表Verilog语言 成立了OVI OpenVerilogInternational 组织来负责VerilogHDL语言的发展 1995年制定了VerilogHDL的IEEE标准 即IEEE1364 2020 3 25 8 1 2VerilogHDL的历史 2020 3 25 9 VHDL 比VerilogHDL早几年成为IEEE标准 语法 结构比较严格 因而编写出的模块风格比较清晰 比较适合由较多的设计人员合作完成的特大型项目 一百万门以上 1 3VerilogHDL和VHDL的比较 2020 3 25 10 VerilogHDL 较多的第三方工具的支持 语法结构比VHDL简单 学习起来比VHDL容易 仿真工具比较好使 测试激励模块容易编写 1 3VerilogHDL和VHDL的比较 2020 3 25 11 1 3VerilogHDL和VHDL的比较 2020 3 25 12 1 4Verilog目前的应用情况和适用的设计 Verilog的主要应用包括 ASIC和FPGA工程师编写可综合的RTL代码高抽象级系统仿真进行系统结构开发测试工程师用于编写各种层次的测试程序用于ASIC和FPGA单元或更高层次的模块的模型开发 2020 3 25 13 1 4Verilog目前的应用情况和适用的设计 Verilog较为适合系统级 System 算法级 Alogrithem 寄存器传输级 RTL 逻辑 Logic 门级 Gate 和电路开关级 Switch 的设计 而对于特大型 千万门级以上 的系统级 System 设计 则VHDL更为合适 2020 3 25 14 1 5采用VerilogHDL设计复杂数字电路的优点 1 5 1传统设计方法 电路原理图输入法采用电路原理图输入法进行设计 周期长 需要专门的设计工具 需手工布线等 这种低水平的设计方法大大延长了设计周期 2020 3 25 15 采用Verilog输入法 可以很容易地把完成的设计移植到不同厂家的不同芯片中去 并在不同规模应用时可以较容易地作修改 采用Verilog输入法最大的优点是其与工艺无关性 实际上这是利用了计算机的巨大能力并在EDA工具帮助下 把逻辑验证与具体工艺库匹配 布线即时延计算分成不同的阶段来实现 从而减轻了人们的繁琐劳动 1 5 2VerilogHDL设计法与传统的电路原理图输入法的比较 2020 3 25 16 1 5采用VerilogHDL设计复杂数字电路的优点 1 5 3Verilog的标准化与软核的重用Verilog是在1983年由GDA公司首先开发成功的 经过诸多改进 于1995年11月正式被批准为VerilogIEEE1363 1995标准 又于2001年3月在原标准的基础上经过改进和补充推出VerilogIEEE1364 2001新标准 由于VerilogHDL设计方法与工艺无关性 因而大大提高了Verilog模型的可重用性 我们把功能经过验证的 可综合的 实现后电路结构总门数在5000门以上的VerilogHDL模型称之为 软核 Softcore 而把由软核构成的器件成为虚拟器件 利用软核和虚拟器件的可重复利用的特性就可大大缩短设计周期 加快了复杂电路的设计 2020 3 25 17 1 5 4软核 固核和硬核的概念以及它们的重用 显而易见 在具体实现手段和工艺技术尚未确定的逻辑设计阶段 软核具有最大的灵活性 而近年来电路实现工艺技术的发展是相当迅速的 为了逻辑电路设计成果的积累 和更快更好地设计更大规模的电路 发展软核的设计和推广软核的重用技术是非常有必要的 把在某一种专用半导体集成电路工艺的 ASIC 器件上实现的经验证是正确的总门数在5000门以上的电路结构掩膜 称之为 硬核 把在某一种现场可编程门阵列 FPGA 器件上实现的 经验证是正确的总门数在5000门以上电路结构编码文件 称之为 固核 2020 3 25 18 1 6VerilogHDL的设计流程简介 自顶向下的设计是从系统级开始 把系统级划分为若干个基本单元 然后再把每个基本单元划分为下一层次的基本单元 一直这样做下去 直到可以直接用EDA元件库的基本元件来实现为止图1 1 3为自顶向下 Top Down 的示意图 以设计树的形式绘出 1 6 1自顶向下 Top Down 设计的基本概念 图1 1 3Top Down设计思想 2020 3 25 19 1 6VerilogHDL的设计流程简介 1 6 2层次管理的基本概念复杂数字逻辑电路和系统的层次化 结构化设计隐含着硬件设计方案的逐次分解 完整的硬件设计可以由图1 1 3所示的设计树描述 在这个设计树上 节点对应着该层次上基本单元的行为描述 树枝对应着基本单元的结构分解 在不同的层次都可以进行仿真以对设计思想进行验证 EDA工具提供了有效的手段来管理错综复杂的层次 即可以很方便地查看某一层次某模块的源代码或电路图以改正仿真时发现的错误 2020 3 25 20 1 6 3具体模块的设计编译和仿真的过程 1 6VerilogHDL的设计流程简介 从左图可以看出 模块设计流程主要由两大主要功能部分组成 1 设计开发 即从编写设计文件 综合到布局布线 投片生成这样一系列步骤 2 设计验证 也就是进行各种仿真的一系列步骤 如果在仿真过程中发现问题就返回设计输入进行修改 2020 3 25 21 1 6VerilogHDL的设计流程简介 1 6 4对应具体工艺器件的优化 映象和布局布线由于各种ASIC和FPFA器件的工艺各不相同 因而当用不同厂家的不同器件来实现已验证的逻辑网表 EDIF文件 时 就需要不同的基本单元库与布线延迟模型与之对应才能进行准确的优化 映象 和布局布线 基本单元库与布线延迟模型由熟悉本厂工艺的工程师提供 再由EDA厂商的工程师编入相应的处理程序 而逻辑电路设计师只需用一文件说明所用的工艺器件和约束条件 EDA工具就会自动地根据这一文件选择相应的库和模型进行准确的处理从而大大提高设计效率 2020 3 25 22 1 7小结 掌握HDL设计方法应从学习VerilogHDL设计方法开始 由于Top Down的设计方法是首先从系统设计入手的 因而从顶层进行功能划分和结构设计 系统的总体仿真是顶层进行功能化分的重要环节 这时的设计与工艺无关 从底向上的设计在某种意义上讲是Top Down设计的逆过程 Verilog数字系统设计教程 第二讲Verilog语法的基本概念 2020 3 25 24 概述 Verilog既是一种行为描述的语言也是一种结构描述语言 Verilog模型可以是实际电路的不同级别的抽象 这些抽象的级别包括 系统级 system 用高级语言结构实现设计模块的外部性能的模型 算法级 algorithm 用高级语言结构实现设计算法的模型 RTL级 RegisterTransferLevel 描述数据在寄存器之间流动和如何处理 控制这些数据流动的模型 以上三种都属于行为描述 只有RTL级才与逻辑电路有明确的对应关系 门级 gate level 描述逻辑门以及逻辑门之间的连接的模型 开关级 switch level 描述器件中三极管和储存节点以及它们之间连接的模型 2020 3 25 25 VerilogHDL行为描述语言具有以下功能 可描述顺序执行或并行执行的程序结构 用延迟表达式或事件表达式来明确地控制过程的启动时间 通过命名的事件来触发其它过程里的激活行为或停止行为 提供了条件如if else case 循环程序结构 提供了可带参数且非零延续时间的任务 task 程序结构 提供了可定义新的操作符的函数结构 function 提供了用于建立表达式的算术运算符 逻辑运算符 位运算符 VerilogHDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计 概述 2020 3 25 26 概述 因其结构化的特点又使它具有以下功能 提供了一套完整的表示组合逻辑的基本元件的原语 primitive 提供了双向通路 总线 和电阻器件的原语 可建立MOS器件的电荷分享和电荷衰减动态模型 2020 3 25 27 2 1Verilog模块的基本概念 下面先介绍几个简单的VerilogHDL程序 从中了解Verilog模块的特性 例2 1 modulemuxtwo out a b sl inputa b sl outputout regout always sloraorb if sl out a elseout b endmodule a b sl out 2020 3 25 28 2 1Verilog模块的基本概念 MUX 多路选择器 的行为可以描述为 只要信号a或b或sl发生变化 如果sl为0则选择a输出 否则选择b输出 这个行为的描述并没有说明如果输入a或b是三态的 高阻时 输出应该是什么 但有具体结构的真实电路是有一定的输出的 没有考虑延时问题 2020 3 25 29 2 1Verilog模块的基本概念 例2 2 moduletwomux out a b sl inputa b sl outputout notu1 nsl sl and 1u2 sela a nsel and 1u3 selb b sl or 2u4 out sela selb endmodule MUX的结构级描述 采用Verilog基本单元 门 描述 描述中含有传输延时 2020 3 25 30 2 1Verilog模块的基本概念 例2 3 moduleadder count sum a b cin input 2 0 a b inputcin outputcount output 2 0 sum assign count sum a b cin endmodule 这个例子描述了一个三位的加法器 从例子中可以看出 整个VerilogHDL程序是位于module和endmodule声明语句之间的 2020 3 25 31 2 1Verilog模块的基本概念 例2 4 modulecompare equal a b outputequal 声明输出信号equalinput 1 0 a b 声明输入信号a bassignequal a b 1 0 如果两个输入信号相等则输出为1 否则输出为0 endmodule 这个程序描述了一个比较器 在这个程中 和 表示注释部分 注释只是为了方便程序员理解程序 对编译是不起作用的 2020 3 25 32 例2 5 moduletrist2 out in enable outputout inputin enable bufil1mybuf out in enable endmodule 2 1Verilog模块的基本概念 程序通过调用一个在Verilog语言提供的原语库中现存的三态驱动器元件bufil1来实现其逻辑功能 这个调用过程也称为库元件bufif1的实例化 在本模块中它被具体化为mybuf 33 例2 6 moduletrist1 sout sin ena outputsout inputsin ena mytritri inst out sout in sin enable ena 调用由mytri模块定义的实例元件tri inst 即把已定义的模块myfri在本模块中具体化为tri instendmodulemodulemytri out in enable outputout inputin enable assignout enable in bz endmodule 2 1Verilog模块的基本概念 2020 3 25 34 2 2Verilog用于模块的测试 如何检查上述例子其功能是否正确 需要有测试激励信号输入到被测模块需要记录被测模块的输出信号需要把用功能和行为描述的Verilog模块转换为门级电路互连的电路结构 综合 需要对已经转换为门级电路结构的逻辑进行测试 门级电路仿真 需要对布局布线后的电路结构进行测试 布局布线后仿真 35 2 2Verilog用于模块的测试 36 2 3小结 通过上面的例子可以看到 1 VerilogHDL程序是由模块构成的 每个模块的内容都是位于module和endmodule两个语句之间 每个模块实现特定的功能 2 模块是可以进行层次嵌套的 3 每个模块要进行端口定义 并说明输入输出口 然后对模块的功能进行描述 4 VerilogHDL程序的书写格式自由 一行可以写几个语句 一个语句也可以分写多行 5 除了endmodule语句外 每个语句和数据定义的最后必须有分号 6 可以用 和 对VerilogHDL程序的任何部分作注释 一个好的 有使用价值的源程序都应当加上必要的注释 以增强程序的可读性和可维护性 Verilog数字系统设计教程 第三讲常用Verilog语法之一 3 1模块的结构 Verilog的基本设计单元是 模块 block 一个模块是由两部分组成的 一部分描述接口 另一部分描述逻辑功能 即定义输入是如何影响输出的 moduleblock1 a b c d inputa b outputc d assignc a b assignd aendmodule a b c d Verilog模块的结构由在module和endmodule关键词之间的四个主要部分组成 端口定义 moduleblock1 a b c d I O说明 inputa b c outputd 内部信号声明 wirex 功能定义 assignd a x assignx bendmodule 3 1模块的结构 3 1模块的结构 3 1 1模块的端口定义模块的端口声明了模块的输入输出口 其格式如下 module模块名 口1 口2 口3 口4 3 1 2模块内容模块的内容包括I O说明 内部信号声明 功能定义 I O说明的格式输入口 input 信号位宽 1 0 端口名1 input 信号位宽 1 0 端口名2 input 信号位宽 1 0 端口名i 共有i个输入口 3 1模块的结构 输出口output 信号位宽 1 0 端口名1 output 信号位宽 1 0 端口名2 output 信号位宽 1 0 端口名j 共有j个输出口 输入 输出口 inout 信号位宽 1 0 端口名1 inout 信号位宽 1 0 端口名2 inout 信号位宽 1 0 端口名k 共有k个双向总线端口 I O说明也可以写在端口声明语句里 其格式如下 modulemodule name inputport1 inputport2 outputport1 outputport2 3 1模块的结构 内部信号说明在模块内用到的和与端口有关的wire和reg变量的声明 如 reg width 1 0 R变量1 R变量2 wire width 1 0 W变量1 W变量2 3 1模块的结构 功能定义模块中最重要的部分是逻辑功能定义部分 有三种方法可在模块中产生逻辑 用assign语句 数据流描述 assigna bend 3 1模块的结构 3 1 3理解要点如在模块中逻辑功能由下面三个语句块组成 assigncs a0end三条语句是并行的 它们产生独立的逻辑电路 而在always块中 begin与end之间是顺序执行的 3 2数据类型及其常量及变量 3 2 1 常量在程序运行过程中 其值不能被改变的量称为常量 一 数字整数 在VerilogHDL中 整型常量即整常数有以下四种进制表示形式 1 二进制整数 b或B 2 十进制整数 d或D 3 十六进制整数 h或H 4 八进制整数 o或O 数字表达方式有以下三种 1 这是一种全面的描述方式 2 在这种描述方式中 数字的位宽采用缺省位宽 这由具体的机器系统决定 但至少32位 3 在这种描述方式中 采用缺省进制十进制 3 1 2数值1 VerilogHDL中的数值可取下面的四类值 VerilogHDL中有两类数值常量整型数和实型数 下划线符号 除了不能放于数值的首位以外 可以随意用在整型数与实型数中 他们对数值的大小没有任何改变 只是为了提高可读性 1 整型数及其表示VerilogHDL的整数可以使二进制 b或B 十进制 d或D 十六进制 h或H 与八进制 o或O 有下面三种书写形式 1 简单的十进制格式 2 缺省位宽的基数格式 3 指定位宽的基数格式 VerilogHDL中有两类数值常量整型数和实型数 简单的十进制格式 用 的数字串组成的十进制数 可以用符号 或 来表示数的正负 缺省位宽的基数格式 表示形式为 符号 为基数格式表示的固有字符 该字符不能省略 否则为非法表示形式 参数用于说明数值采用的进制格式 参数为相应进制格式下的一串数字 这种格式未指定位宽 其缺省值至少为 位 指定位宽的基数格式 表示形式为 size base format number 参数 size 用来指定所表示数字的位宽 当位宽小于数值的实际大小时 相应的高位部分被忽略 当位宽大于数值的实际位数 且数值的最高位是 或 时 相应的高位部分补 而当位宽大于数值的实际位数 但数值的最高位是x或z时 相应的高位部分补 或 VerilogHDL中有两类数值常量整型数和实型数 基数符号及其合法的表示值 VerilogHDL中有两类数值常量整型数和实型数 例 三种格式的整数表示法 15 十进制15 简单的十进制 h15 十进制21 十六进制15 缺省位宽的十六进制5 b10011 十进制19 二进制10011 位的二进制12 h01F 十进制31 十六进制01F 位的十六进制 VerilogHDL中有两类数值常量整型数和实型数 VerilogHDL中的实数可以用十进制与科学计数法两种格式来表示 如果采用十进制格式 小数点两边必须都有数字 否则为非法的表示形式 实数表示法的实例1 8 十进制计数法3 8e10 科学计数法2 1E 9 科学计数法可用e或E表示 其结果相同3 2387 3398 3047 使用下划线提高可读性3 非法表示 小数点两遍都必须有数 2e6 非法表示 小数点两遍都必须有数 12 非法表示 小数点两遍都必须有数 实型数及其表示 VerilogHDL中有两类数值常量整型数和实型数 3 2数据类型及其常量及变量 x和z值 在数字电路中 x代表不定值 z代表高阻值 一个x可以用来定义十六进制数的4位二进制数的状态 八进制数的3位 二进制数的1位 z的表示方式同x类似 z还有一种表达方式是可以写作 3 2数据类型及其常量及变量 负数 一个数字可以被定义为负数 只需在位宽表达式前加一个减号 减号必须写在数字定义表达式的最前面 注意减号不可以放在位宽和进制之间也不可以放在进制和具体的数之间 8 d5 这个表达式代表5的补数 用八位二进制数表示 8 d 5 非法格式下画线 underscore 下划线可以用来分隔开数的表达以提高程序可读性 但不可以用在位宽和进制处 只能用在具体的数字之间 16 b1010 1011 1111 1010 合法格式8 b 0011 1010 非法格式当常量不说明位数时 默认值是32位 每个字母用8位的ASCII值表示 3 2数据类型及其常量及变量 二 参数 parameter 型用参数声明一个可变常量 常用于定义延时及宽度变量 参数定义的语法 parameter 可一次定义多个参数 用逗号隔开 在使用文字 literal 的地方都可以使用参数 参数的定义是局部的 只在当前模块中有效 参数定义可使用以前定义的整数和实数参数 modulemod1 out in1 in2 parametercycle 20 prop del 3 setup cycle 2 prop del p1 8 x word 16 bx file usr1 jdough design mem file dat wire p1 0 w1 Awiredeclarationusingparameter endmodule 注意 参数file不是string 而是一个整数 其值是所有字母的扩展ASCII值 若file AB 则file值为8 h4142 用法 fopen file display s file 3 2数据类型及其常量及变量 3 2 2变量变量即在程序运行过程中其值可以改变的量 常用的网络数据类型包括wire型和tri型 wire型变量通常是用来表示单个门驱动或连续赋值语句驱动的网络型数据 tri型变量则用来表示多驱动器驱动的网络型数据 表1 3 1Wire tri变量的真值 3 2数据类型及其常量及变量 一 wire型wire型数据常用来表示用于以assign关键字指定的组合逻辑信号 Verilog程序模块中输入输出信号类型缺省时自动定义为wire型 其格式如下 wire n 1 0 数据名1 数据名2 数据名i 共有i条总线 每条总线内有n条线路 或wire n 1 数据名1 数据名2 数据名i 3 2数据类型及其常量及变量 二 reg型寄存器是数据储存单元的抽象 寄存器数据类型的关键字是reg reg类型数据的默认初始值为不定值x reg型数据常用来表示用于 always 模块内的指定信号 常代表触发器 在 always 块内被赋值的每一个信号都必须定义成reg型 reg型数据的格式如下 reg n 1 0 数据名1 数据名2 数据名i 或reg n 1 数据名1 数据名2 数据名i moduletop wirey rega b DUTu1 y a b initialbegina 0 b 0 10a 1 endendmodule moduleDUT Y A B outputY inputA B wireY A B and Y A B endmodule 举例说明数据类型的选择 输入口 input 可以由寄存器或网络连接驱动 但它本身只能驱动网络连接 输出口 output 可以由寄存器或网络连接驱动 但它本身只能驱动网络连接 输入 输出口 inout 只可以由网络连接驱动 它本身也只能驱动网络连接 如果信号变量是在过程块 initial块或always块 中被赋值的 必须把它声明为寄存器类型变量 如何选择正确的数据类型 如何选择正确的数据类型 moduletop wirey rega b DUTu1 y a b initialbegina 0 b 0 5a 1 endendmodule moduleDUT Y A B outputY inputA B wireY A B and Y A B endmodule 输入端口可以由net register驱动 但输入端口只能是net 输出端口可以是net register类型 输出端口只能驱动net 在过程块中只能给register类型赋值 若Y A B说明为reg则会产生错误 in1 in2 O A B Y 双向端口输入 输出只能是net类型 选择数据类型时常犯的错误举例 修改前 moduleexample o1 o2 a b c d inputa b c d outputo1 o2 regc d rego2andu1 o2 c d always aorb if a o1 b elseo1 0 endmodule 修改后 moduleexample o1 o2 a b c d inputa b c d outputo1 o2 regc d rego2rego1 andu1 o2 c d always aorb if a o1 b elseo1 0 endmodule example v 选择数据类型时常犯的错误举例 Compilingsourcefile example v Error Illegalleft hand sideassignment Verilog ILHSA example v 11 o1 b Error Illegalleft hand sideassignment Verilog ILHSA example v 12 o1 0 2errors 第一次编译信息verilog cexample v 第二次编译信息 Compilingsourcefile example v Error Incompatibledeclaration c definedasinputatline2 Verilog IDDIL example v 5 Error Incompatibledeclaration d definedasinputatline2 Verilog IDDIL example v 5 Error Gate u1 hasillegaloutputspecification Verilog GHIOS example v 8 3errors 3 2数据类型及其常量及变量 三 memory型VerilogHDL通过对reg型变量建立数组来对存储器建模 可以描述RAM型存储器 ROM存储器和reg文件 数组中的每一个单元通过一个数组索引进行寻址 在Verilog语言中没有多维数组存在 memory型数据是通过扩展reg型数据的地址范围来生成的 其格式如下 reg n 1 0 存储器名 m 1 0 或reg n 1 0 存储器名 m 1 3 3运算符及表达式 VerilogHDL语言的运算符范围很广 其运算符按其功能可分为以下几类 3 3运算符及表达式 在VerilogHDL语言中运算符所带的操作数是不同的 按其所带操作数的个数运算符可分为三种 1 单目运算符 unaryoperator 可以带一个操作数 操作数放在运算符的右边 2 二目运算符 binaryoperator 可以带二个操作数 操作数放在运算符的两边 3 三目运算符 ternaryoperator 可以带三个操作 这三个操作数用三目运算符分隔开 见下例 clock clock 是一个单目取反运算符 clock是操作数 c a b 是一个二目按位或运算符 a和b是操作数 r s t u 是一个三目条件运算符 s t u是操作数 3 3运算符及表达式 3 3 1 基本的算术运算符 加 减 乘 除 模 将负数赋值给reg或其它无符号变量使用2的补码算术 如果操作数的某一位是x或z 则结果为x在整数除法中 余数舍弃模运算中使用第一个操作数的符号 modulearithops parameterfive 5 integerans int reg 3 0 rega regb reg 3 0 num initialbeginrega 3 regb 4 b1010 int 3 int 1111 1111 1101endinitialfork 10ans five int ans 15 20ans int 5 2 ans 1 30ans five int ans 1 40num rega regb num 1101 50num rega 1 num 0100 60num int num 1101 70num regb rega num 1 80 finish joinendmodule 注意integer和reg类型在算术运算时的差别 integer是有符号数 而reg是无符号数 3 3运算符及表达式 3 3 2 位运算符 not and or xor xnor xnor 按位操作符对矢量中相对应位运算 regb 4 b1010regc 4 b1x10num regb位值为x时不一定产生x结果 如 50时的or计算 modulebitwise reg 3 0 rega regb regc reg 3 0 num initialbeginrega 4 b1001 regb 4 b1010 regc 4 b11x0 endinitialfork 10num regajoinendmodule 五类按位操作符的运算规则 五类按位操作符的运算规则 modulebitTest reg 3 0 a b c initialbegina 4 b1100 b 4 b0011 c 4 b0101 displayb a 按位非运算符 结果为4b 0011 displayb a 按位异或非运算符 结果为4b 0110endendmodule 按位运算的例子 3 3运算符及表达式 3 3 2 位运算符 当两个操作数位数不同时 位数少的操作数零扩展到相同位数 a 4 b1011 b 8 b01010011 c a b a零扩展为8 b00001011 位运算符中除了 是单目运算符以外 均为二目运算符 即要求运算符两侧各有一个操作数 位运算符中的二目运算符要求对两个操作数的相应位进行运算操作 Verilog数字系统设计教程 第四讲常用Verilog语法之二 4 1逻辑运算符 not and or 逻辑操作符的结果为一位1 0或x 逻辑操作符只对逻辑值运算 如操作数为全0 则其逻辑值为false如操作数有一位为1 则其逻辑值为true若操作数只包含0 x z 则逻辑值为x 逻辑反操作符将操作数的逻辑值取反 例如 若操作数为全0 则其逻辑值为0 逻辑反操作值为1 modulelogical parameterfive 5 regans reg 3 0 rega regb regc initialbeginrega 4 b0011 逻辑值为 1 regb 4 b10 xz 逻辑值为 1 regc 4 b0z0 x 逻辑值为 x endinitialfork 10ans regajoinendmodule VerilogHDL提供了三种逻辑运算符 逻辑与运算符 逻辑或运算符 逻辑非运算符 其中逻辑与和逻辑或是双目运算符 逻辑非是单目运算符 逻辑运算的真值表 4 1逻辑运算符 modulelogicalTest reg 3 0 a b c initialbegina 2 b 0 c 4 hx display a b 逻辑与 结果为0 display a b 逻辑或 结果为1 display a 逻辑非 结果为0 display a c 结果为1 未知数 1 1 display c 结果为未知数endendmodule 4 1逻辑运算符 4 2关系运算符 大于 大于等于 小于等于 modulerelationals reg 3 0 rega regb regc regval initialbeginrega 4 b0011 regb 4 b1010 regc 4 b0 x10 endinitialfork 10val regc rega val x 20val regb rega val 1 40val regb regc val 1 50 finish joinendmodule rega和regc的关系取决于x 无论x为何值 regb regc 其结果是1 b1 1 b0或1 bx 4 3等式运算符 赋值操作符 将等式右边表达式的值拷贝到左边 逻辑等 case等 a 2 b1x b 2 b1x if a b display aisequaltob else display aisnotequaltob a 2 b1x b 2 b1x if a b display aisidenticaltob else display aisnotidenticaltob 注意逻辑等与case等的差别 2 b1x 2 b0 x值为0 因为不相等2 b1x 2 b1x值为x 因为可能不相等 也可能相等 2 b1x 2 b0 x值为0 因为不相同2 b1x 2 b1x值为1 因为相同 4 3等式运算符 逻辑等 逻辑不等 其结果是1 b1 1 b0或1 bx 如果左边及右边为确定值并且相等 则结果为1 如果左边及右边为确定值并且不相等 则结果为0 如果左边及右边有值不能确定的位 但值确定的位相等 则结果为x 的结果与 相反 值确定是指所有的位为0或1 不确定值是有值为x或z的位 moduleequalities1 reg 3 0 rega regb regc regval initialbeginrega 4 b0011 regb 4 b1010 regc 4 b1x10 endinitialfork 10val rega regb val 0 20val rega regc val 1 30val regb regc val x 40val regc regc val x 50 finish joinendmodule moduleequTest reg 3 0 a b c d e f initialbegina 4 b 7 缺省值为十进制数c 4 b010 d 4 bx10 e 4 bx101 f 4 bxx01 displayb c 输出0010 displayb d 输出xx10 displayb a b 相等运算符 结果为0 displayb c d 不相等运算符 结果为x displayb c f 不相等运算符 结果为1 displayb d e 全等运算符 结果为0 displayb c d 非全等运算符 结果为1endendmodule 相等关系运算符的例子 4 3等式运算符 相同 case等 不相同 case不等 其结果是1 b1 1 b0或1 bx 如果左边及右边的值相同 包括x z 则结果为1 如果左边及右边的值不相同 则结果为0 的结果与 相反 综合工具不支持 moduleequalities2 reg 3 0 rega regb regc regval initialbeginrega 4 b0011 regb 4 b1010 regc 4 b1x10 endinitialfork 10val rega regb val 0 20val rega regc val 1 30val regb regc val 0 40val regc regc val 1 50 finish joinendmodule 4 4移位运算符 逻辑右移 逻辑左移 移位操作符对其左边的操作数进行向左或向右的位移位操作 第二个操作数 移位位数 是无符号数若第二个操作数是x或z则结果为x 将左边的操作数右移右边操作数指定的位数 在赋值语句中 如果右边 RHS 的结果 位宽大于左边 则把最高位截去位宽小于左边 则零扩展 moduleshift reg 9 0 num num1 reg 7 0 rega regb initialrega 8 b00001100 initialfork 10num 3 num 00 0000 0001 20regb 3 regb 0000 0001 30num 2 rega 1111 1100 50num1 2 num1 00 1111 1100 60 finish joinendmodule 建议 表达式左右位数一致 4 5位拼接运算符 位拼接还可以用嵌套的方式来表达 b 3 a b 这等同于 b a b a b a b 用于表示重复的表达式如上例中的4和3 必须是常数表达式 位拼接运算符 其使用方法如下 信号1的某几位 信号2的某几位 信号n的某几位 例 a b 3 0 w 3 b101 位拼接还可以用重复法来简化表达式 4 w 这等同于 w w w w moduleconcatTest rega reg 1 0 b reg 5 0 c initialbegina 1 b1 b 2 b00 c 6 b101001 displayb a b 产生一个3位数3 b100 displayb c 5 3 a 产生一个4位数4 b1011endendmodule modulereplicTest rega reg 1 0 b reg 5 0 c initialbegina 1 b1 b 2 b00 displayb 4 a 结果为1111c 4 a displayb c 结果为001111endendmodule 连接运算的例子 复制运算的例子 4 6缩减运算符 缩减运算的具体运算过程是这样的 第一步先将操作数的第一位与第二位进行或与非运算 第二步将运算结果与第三位进行或与非运算 依次类推 直至最后一位 reg 3 0 B regC C 由于缩减运算的与 或 非运算规则类似于位运算符与 或 非运算规则 这里不再详细讲述 请参照位运算符的运算规则介绍 4 7优先级别 下面对各种运算符的优先级别关系作一总结 见下表 最高 优先级 最低 4 9赋值语句和块语句 赋值语句在VerilogHDL语言中 信号有两种赋值方式 1 非阻塞 Non Blocking 赋值方式 如b a 块结束后才完成赋值操作 b的值并不是立刻就改变的 这是一种比较常用的赋值方法 特别在编写可综合模块时 2 阻塞 Blocking 赋值方式 如b a 赋值语句执行完后 块才结束 b的值在赋值语句执行完后立刻就改变的 在沿触发的always块中使用时 综合后可能会产生意想不到的结果 4 9赋值语句和块语句 赋值语句 moduleswap vals rega b clk initialbegina 0 b 1 clk 0 endalways 5clk clk always posedgeclk begina b 非阻塞过程赋值b a 交换a和b值endendmodule 过程赋值有两类 阻塞过程赋值 非阻塞过程赋值 阻塞过程赋值执行完成后再执行在顺序块内下一条语句 非阻塞赋值不阻塞过程流 仿真器读入一条赋值语句并对它进行调度之后 就可以处理下一条赋值语句 若过程块中的所有赋值都是非阻塞的 赋值按两步进行 仿真器计算所有RHS表达式的值 保存结果 并进行调度在时序控制指定时间的赋值 在经过相应的延迟后 仿真器通过将保存的值赋给LHS表达式完成赋值 4 9赋值语句和块语句 赋值语句 阻塞与非阻塞赋值语句行为差别举例1 modulenon block1 rega b c d e f initialbegin blockingassignmentsa 101 time10b 20 time12c 41 time16endinitialbegin non blockingassignmentsd 101 time10e 20 time2f 41 time4endinitialbegin monitor time a bb bc bd be bf b a b c d e f 100 finish endendmodule 输出结果 0a xb xc xd xe xf x2a xb xc xd xe 0f x4a xb xc xd xe 0f 110a 1b xc xd 1e 0f 112a 1b 0c xd 1e 0f 116a 1b 0c 1d 1e 0f 1 4 9赋值语句和块语句 块语句 语句块提供将两条或更多条语句组合成语法结构上相当于一条语句的机制 在VerilogHDL中有两类语句块 即 1 顺序语句块 begin end 语句块中的语句按给定次序顺序执行 2 并行语句块 fork join 语句块中的语句并行执行 4 9赋值语句和块语句 块语句 顺序块 顺序块有以下特点 1 块内的语句是按顺序执行的 即只有上面一条语句执行完后下面的语句才能执行 2 每条语句的延迟时间是相对于前一条语句的仿真时间而言的 3 直到最后一条语句执行完 程序流程控制才跳出该语句块 4 9赋值语句和块语句 顺序块的格式如下 begin语句1 语句2 语句n end 或begin 块名块内声明语句语句1 语句2 语句n end 其中 块名即该块的名字 一个标识名 其作用后面再详细介绍 块内声明语句可以是参数声明语句 reg型变量声明语句 integer型变量声明语句 real型变量声明语句 块语句 顺序块 4 9赋值语句和块语句 下面举例说明 例4 3 beginareg breg creg areg creg的值为breg的值 end从该例可以看出 第一条赋值语句先执行 areg的值更新为breg的值 然后程序流程控制转到第二条赋值语句 creg的值更新为areg的值 因为这两条赋值语句之间没有任何延迟时间 creg的值实为breg的值 块语句 顺序块 4 9赋值语句和块语句 并行块有以下四个特点 块内语句是同时执行的 即程序流程控制一进入到该并行块 块内语句则开始同时并行地执行 2 块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间的 3 延迟时间是用来给赋值语句提供执行时序的 4 当按时间时序排序在最后的语句执行完后或一个disable语句执行时 程序流程控制跳出该程序块 块语句 并行块 4 9赋值语句和块语句 并行块的格式如下 fork语句1 语句2 语句n join 或fork 块名块内声明语句语句1 语句2 语句n j
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年永磁式步进电机合作协议书
- 2024年海南省眼科医院招聘事业编制人员真题
- 尿酸血症课件
- 初二数学(含中考题)24线段的垂直平分线课件34
- 稳定的环保应急预案有哪些(3篇)
- 临时给排水施工方案(3篇)
- 2025年城市轨道交通项目智能化升级服务合作协议
- 2025年度深圳华安生物高通量基因合成服务合同书
- 2025年高性能外墙涂料节能减排工程承包合同
- 2025年度健康农产品批发配送服务协议
- 2025年高考化学四川卷试题答案解读及备考指导(精校打印)
- 2025年押品评估准入考试题库
- 刑法基本原则解读课件
- 2025年药物医疗器械临床试验质量管理规范(GCP)试题(附答案)
- 新疆处方管理办法
- 2025企业级AI Agent(智能体)价值及应用报告
- 2025年高考化学试卷真题完全解读(黑吉辽蒙卷)
- 《临床执业助理医师大纲2024版》
- 班主任常规管理实施策略
- 腹股沟脓肿的护理查房
- 2024-2025学年广东省深圳市南山区七年级(下)期末语文试卷
评论
0/150
提交评论