数字系统设计与VerilogHDL-第9版- 课件全套 第1-11章 EDA技术概述-Verilog设计实例_第1页
数字系统设计与VerilogHDL-第9版- 课件全套 第1-11章 EDA技术概述-Verilog设计实例_第2页
数字系统设计与VerilogHDL-第9版- 课件全套 第1-11章 EDA技术概述-Verilog设计实例_第3页
数字系统设计与VerilogHDL-第9版- 课件全套 第1-11章 EDA技术概述-Verilog设计实例_第4页
数字系统设计与VerilogHDL-第9版- 课件全套 第1-11章 EDA技术概述-Verilog设计实例_第5页
已阅读5页,还剩482页未读 继续免费阅读

下载本文档

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

文档简介

数字系统设计与VerilogHDL(第9版)数字系统设计与VerilogHDL(第9版)第1章EDA技术概述1.1EDA技术及其发展历程1.2Top-down设计思路1.3IP核复用1.4EDA设计的流程1.5常用的EDA工具软件EDA(ElectronicDesignAutomation)就是以计算机为工作平台,以EDA软件工具为开发环境,以PLD器件或者ASIC专用集成电路为目标器件设计实现电路系统的一种技术。1.电子CAD(ComputerAidedDesign)2.电子CAE(ComputerAidedEngineering)3.EDA(ElectronicDesignAutomation)1.1EDA技术及其发展历程EDA技术的应用范畴EDA技术的新发展(1)电子技术各个领域全方位融入EDA技术。(2)IP(IntellectualProperty)核在电子设计领域得到了广泛的应用。(3)嵌入式微处理器软核的出现,更大规模的FPGA/CPLD器件的不断推出,使得SoPC(SystemonProgrammableChip,可编程芯片系统)步入实用化阶段。(4)用FPGA实现完全硬件的DSP(数字信号处理)处理成为可能。(5)在设计和仿真两方面支持标准硬件描述语言的EDA软件不断推出,系统级、行为验证级硬件描述语言的出现使得复杂电子系统的设计和验证更加高效。现代EDA技术(1)采用硬件描述语言进行设计(2)逻辑综合与优化(3)开放性和标准化(4)更完备的库1.2Top-down设计思路1.2.1Top-down设计1.2.2Bottom-up设计1.2.1Top-down设计Top-down的设计须经过“设计—验证—修改设计—再验证”的过程,不断反复,直到结果能够实现所要求的功能,并在速度、功耗、价格和可靠性方面实现较为合理的平衡。Bottom-up设计,即自底向上的设计,由设计者调用设计库中的元件(如各种门电路、加法器、计数器等),设计组合出满足自己需要的系统缺点:效率低、易出错1.2.2Bottom-up设计IP(IntellectualProperty):原来的含义是指知识产权、著作权,在IC设计领域指实现某种功能的设计。IP核(IP模块):指功能完整,性能指标可靠,已验证的、可重用的电路功能模块。IP复用(IPreuse)1.3IP核复用软IP--用VHDL等硬件描述语言描述的功能块,但是并不涉及用什么具体电路元件实现这些功能。固IP--完成了综合的功能块。硬IP--供设计的最终阶段产品:掩膜。IP核与SoC设计SoC:SYSTEMonaCHIP1.4EDA设计的流程基于FPGA/CPLD的数字系统设计流程1.原理图输入(Schematicdiagrams)2.硬件描述语言(HDL文本输入)设计输入(1)ABEL-HDL(2)AHDL(3)VHDL(4)VerilogHDLIEEE标准硬件描述语言与软件编程语言有本质的区别综合(Synthesis)将较高层次的设计描述自动转化为较低层次描述的过程◆

行为综合:从算法表示、行为描述转换到寄存器传输级(RTL)◆

逻辑综合:RTL级描述转换到逻辑门级(包括触发器)◆版图综合或结构综合:从逻辑门表示转换到版图表示,或转换到PLD器件的配置网表表示综合器是能自动实现上述转换的软件工具,是能将原理图或HDL语言描述的电路功能转化为具体电路网表的工具C、ASM...程序CPU指令/数据代码:0100101000101100软件程序编译器COMPILER软件编译器和硬件综合器区别VHDL/VERILOG.程序

硬件描述语言综合器SYNTHESIZER为ASIC设计提供的电路网表文件(a)软件语言设计目标流程(b)硬件语言设计目标流程布局布线布局布线可理解为将综合生成的电路逻辑网表映射到具体的目标器件中实现,并产生最终的可下载文件的过程。布局布线将综合后的网表文件针对某一具体的目标器件进行逻辑映射,把整个设计分为多个适合器件内部逻辑资源实现的逻辑小块,并根据用户的设定在速度和面积之间做出选择或折中;布局是将已分割的逻辑小块放到器件内部逻辑资源的具体位置,并使它们易于连线;布线则是利用器件的布线资源完成各功能块之间和反馈信号之间的连接。时序分析与时序约束时序分析,或者称为静态时序分析(STA),是指分析设计中所有的时序路径(TimingPath),计算每条时序路径的延时,检查每一条时序路径尤其是关键路径是否满足时序要求,并给出时序分析和报告结果,只要该路径的时序裕量(Slack)为正,就表示该路径能满足时序要求。仿真(Simulation)功能仿真(FunctionSimulation)时序仿真(TimingSimulation)仿真是对所设计电路的功能的验证编程与配置把适配后生成的编程文件装入到PLD器件中的过程称为下载。通常将对基于EEPROM工艺的非易失结构PLD器件的下载称为编程(Program),将基于SRAM工艺结构的PLD器件的下载称为配置(Configure)。1.5常用的EDA工具软件集成的FPGA/CPLD开发工具逻辑综合器仿真器其他EDA工具FPGA/CPLD开发工具逻辑综合器(Synthesizer)仿真工具(simulationtools)1-1EDA技术的应用领域有哪些?1-2什么是Top-down设计方式?1-3数字系统的实现方式有哪些?各有什么优缺点?1-4什么是IP复用技术?IP核对EDA技术的应用和发展有什么意义?1-5以自己熟悉的一款FPGA芯片为例,说明其内部集成了哪些硬核逻辑,其支持的软核有哪些?1-6基于FPGA/CPLD的数字系统设计流程包括哪些步骤?1-7什么是综合?常用的综合工具有哪些?1-8FPGA与ASIC在概念上有什么区别?1-9功能仿真与时序仿真有何区别?习题1END数字系统设计与VerilogHDL(第9版)数字系统设计与VerilogHDL(第9版)第2章FPGA/CPLD器件2.1PLD器件概述2.2PLD的基本原理与结构2.3低密度PLD的原理与结构2.4CPLD的原理与结构2.5FPGA的原理与结构2.6FPGA/CPLD的编程工艺2.7边界扫描测试技术2.8FPGA/CPLD的编程与配置2.9典型的FPGA/CPLD系列2.1PLD器件概述PLD的发展历程熔丝编程的PROM和PLA器件AMD公司推出PAL器件GAL器件FPGA器件EPLD器件CPLD器件内嵌复杂功能模块的SoPC◆

1985年,美国Xilinx公司推出了现场可编程门阵列(FPGA,FieldProgrammableGateArray)◆CPLD(ComplexProgrammableLogicDevice),即复杂可编程逻辑器件,是从EPLD改进而来的。PLD的发展PLD按集成度分类一般将GAL22V10(500门~750门)作为简单PLD和高密度PLD的分水岭四种SPLD器件的区别器件与阵列或阵列输出电路PROM固定可编程固定PLA可编程可编程固定PAL可编程固定固定GAL可编程固定可组态PLD器件按照可以编程的次数可以分为两类:(1)一次性编程器件(OTP,OneTimeProgrammable)(2)可多次编程器件OTP类器件的特点是:只允许对器件编程一次,不能修改,而可多次编程器件则允许对器件多次编程,适合于在科研开发中使用。按编程特点分类(1)熔丝(Fuse)(2)反熔丝(Antifuse)编程元件(3)紫外线擦除、电可编程,如EPROM。(4)电擦除、电可编程方式,(EEPROM、快闪存储器(FlashMemory)),如多数CPLD(5)静态存储器(SRAM)结构,如多数FPGA按编程元件和编程工艺分类非易失性器件易失性器件PLD器件的原理结构图2.2PLD的基本原理与结构数字电路符号表示数字逻辑电路的两种国标符号对照PLD电路符号表示PLD的输入缓冲电路PLD与阵列表示PLD或阵列表示PLD连接表示法2.3低密度PLD的原理与结构PROM的逻辑阵列结构PROMPROM表达的PLD阵列图PROM用PROM实现半加器PLAPLA逻辑阵列示意图PALPAL结构PAL的常用表示PALPAL22V10部分结构图GALGAL22V10的结构(局部)GAL22V10的OLMC结构CPLD器件的结构2.4CPLD的原理与结构典型CPLD器件的结构MAX7000S器件的内部结构MAX7000S器件的宏单元结构MispLSI1032器件的GLB的结构XC9500器件的宏单元结构2.5FPGA的原理与结构2输入或门真值表ABF000011101111用2输入查找表实现或门功能查找表原理ABCF000000100100011110001011110111113人表决电路的真值表用3输入的查找表实现3人表决电路查找表结构

4输入LUT及结构FPGA器件的内部结构典型FPGA的结构XC4000器件的CLB结构CycloneIV器件的LE结构CycloneIV器件结构1.熔丝(Fuse)型器件2.反熔丝(Anti-fuse)型器件3.EPROM型,紫外线擦除电可编程4.EEPROM型6.SRAM型5.Flash型2.6FPGA/CPLD的编程工艺1.熔丝(Fuse)型器件熔丝型开关2.反熔丝结构反熔丝结构3.浮栅编程元件EPROM存储器EEPROM的存储单元3.浮栅编程元件4.SRAM编程元件SRAM基本单元结构边界扫描电路结构为了解决超大规模集成电路(VLSI)的测试问题,自1986年开始,IC领域的专家成立了“联合测试行动组”(JTAG,JointTestActionGroup),并制定出了IEEE1149.1边界扫描测试(BST,BoundaryScanTest)技术规范2.7边界扫描测试技术边界扫描IO引脚功能引脚名

称功

能TDI测试数据输入指令和测试数据的串行输入引脚,数据在TCK的上升沿时刻移入TDO测试数据输出指令和测试数据的串行输出引脚,数据在TCK的下降沿时刻移出;如果没有数据移出器件,此引脚处于高阻态TMS测试模式选择选择JTAG指令模式的串行输入引脚,在正常工作状态下TMS应是高电平TCK测试时钟输入时钟引脚TRST测试电路复位低电平有效,用于初始化或异步复位边界扫描电路边界扫描数据移位方式2.8FPGA/CPLD的编程与配置未编程前先焊接安装减少对器件的触摸和损伤不计较器件的封装形式样机制造方便支持生产和测试流程中的修改在系统现场重编程修改允许现场硬件升级迅速方便地提升功能ISP功能提高设计和应用的灵活性Altera的FPGA器件配置方式方式说

明PS模式被动串行,由外部主机(MAXII芯片或微处理器)控制配置过程AS主动串行,用串行配置器件(如EPCS1,EPCS4,EPCS16)配置FPP快速被动并行,使用增强型配置器件或并行同步微处理器接口进行配置AP主动并行PPS被动并行同步,使用并行同步微处理器接口进行配置PPA(被动并行异步,使用并行异步微处理器接口进行配置JTAG模式使用下载电缆通过JTAG接口进行配置1.AS配置模式EPCS对单个CycloneIV器件的AS配置电路2.PS配置模式外部主机PS模式配置单个CycloneIV器件的电路3.JTAG配置方式CycloneIV器件的JTAG模式配置电路2.9典型的FPGA/CPLD系列1.Stratix高端FPGA芯片系列器件系列StratixStratixIIStratixIIIStratixⅣStratixVStratix10推出年份20042006200820102013工艺技术(nm)13090654028142.Arria中端FPGA芯片系列器件系列ArriaGXArriaIIGXArriaIIGZArriaVGX,GT,SXArriaVGZArria10GX,GT,SX推出年份20092010201120122013工艺技术(nm)9040402828203.Cyclone低成本FPGA芯片系列器件系列CycloneCycloneIICycloneIIICycloneIVCycloneV推出年份20022004200720092011工艺技术(nm)130906560284.Altera的CPLD芯片系列器件系列早期的CPLDMAXIIMAXIIZMAXVMAX10推出年份1995~20022004200720102014工艺技术0.50~0.30微米180nm180nm180nm55nm习题22-1PLA和PAL在结构上有何区别?2-2简述基于乘积项的可编程逻辑器件的结构特点。2-3基于查找表的可编程逻辑结构的原理是什么?2-4基于乘积项和基于查找表的结构各有什么优点?2-5某与或阵列如图所示,写出F1、F0的函数表达式。END数字系统设计与VerilogHDL(第9版)数字系统设计与VerilogHDL(第9版)第3章

原理图与基于IP核的设计

3.1设计流程3.2原理图设计方式3.3基于IP核的设计3.4锁相环IP核3.5SignalTapII的使用方法3.1设计流程基于QuartusPrime的设计流程3.2原理图设计方式QuartusPrime的主界面输入元件3.2.1半加器设计半加器电路图3.2.1半加器设计使用NewProjectWizard创建工程3.2.1半加器设计设置Directory,Name,Top-LevelEntity对话框3.2.1半加器设计将设计文件加入当前工程中3.2.1半加器设计选择目标器件3.2.1半加器设计选择综合器、仿真器3.2.1半加器设计工程信息汇总显示3.2.1半加器设计创建元件符号对话框3.2.1半加器设计3.2.21位全加器设计1位全加器原理图选择菜单Processing→StartCompilation,或者单击按钮,即启动了完全编译,完全编译包括如下5个过程:

分析与综合(Analysis&Synthesis);适配(Fitter);装配(Assembler);定时分析(TimeQuestTimingAnalysis);网表文件提取(EDANetlistWriter)。3.2.3编译编译信息汇总3.2.3编译建立QuartusPrime和Modelsim的链接3.2.4仿真设置仿真文件的格式和目录3.2.4仿真自动生成的TestBench模板文件3.2.4仿真对TestBench进一步设置3.2.4仿真1位全加器时序仿真波形图3.2.4仿真目标板为DE10-Lite,目标器件为10M50DAF484C7G。选择菜单AssignmentsPinPlanner,在PinPlanner对话框中进行引脚的锁定。本例5个引脚的锁定如下:A →PIN_C10 SW0(拨动开关)B →PIN_C11 SW1(拨动开关)CIN →PIN_D12 SW2(拨动开关)SUM →PIN_A8 LEDR0(LED灯)COUT →PIN_A9 LEDR1(LED灯)3.2.5下载编程下载窗口3.2.5下载定制ROM核SaveIPVariation对话框3.3基于IP核的设计基于lpm_rom实现的4×4无符号数乘法器原理图3.3基于IP核的设计ROM存储器的内容存储在*.mif文件中3.3基于IP核的设计WIDTH=8;DEPTH=256;ADDRESS_RADIX=UNS;DATA_RADIX=UNS;CONTENTBEGIN[0..16]:0;17:1;18:2;19:3;20:4;...mult_rom.mif文件内容如下250:150;251:165;252:180;253:195;254:210;255:225;END;4×4无符号数乘法器波形仿真结果3.3基于IP核的设计用altpll锁相环IP核实现倍频和分频,将输入的50MHz时钟信号产生两路输出,一路输出9MHz(占空比为50%)分频信号,一路输出有5ns相移的100MHz(占空比为40%)倍频信号,并进行仿真验证。3.4锁相环IP核用altpll锁相环宏模块实现倍频和分频选择芯片和设置参考时钟用altpll锁相环宏模块实现倍频和分频锁相环端口设置用altpll锁相环宏模块实现倍频和分频输出时钟c0设置用altpll锁相环宏模块实现倍频和分频输出时钟c1设置用altpll锁相环宏模块实现倍频和分频选择需要的输出文件格式用altpll锁相环宏模块实现倍频和分频锁相环电路仿真波形(Modelsim)用altpll锁相环宏模块实现倍频和分频3.5SignalTapII的使用方法嵌入式逻辑分析仪SignalTapII为设计者提供了一种方便高效的硬件测试手段,它可以随设计文件一起下载到目标芯片中,捕捉目标芯片内信号节点或总线上的数据,将这些数据暂存于目标芯片的嵌入式RAM中,然后通过器件的JTAG端口,将采集到的信息和数据送到计算机进行显示,供调试者分析。调入待测信号SignalTapII参数设置窗口SignalTapII数据窗口显示的实时采样的信号波形3-1基于Quartus软件,采用原理图设计方式,使用D触发器设计一个2分频电路;并在此基础上,设计一个4分频和8分频电路并进行仿真。3-2基于Quartus软件,采用原理图设计方式,用74161设计一个模10计数器,并进行编译和仿真。3-3基于QuartusPrime软件,用74161设计一个模99的计数器,个位和十位都采用8421BCD码的编码方式设计,分别用置0和置1两种方法实现,完成原理图设计输入、编译、仿真和下载整个过程。3-5基于QuartusPrime软件,用74283(4位二进制全加器)设计实现一个8位全加器,并进行综合和仿真,查看综合结果和仿真结果。习题3END数字系统设计与VerilogHDL(第9版)数字系统设计与VerilogHDL(第9版)第4章

Verilog设计初步

4.1VerilogHDL简史4.2Verilog模块初识4.3Verilog设计示例

4.4Verilog文字规则

4.5数字4.6数据类型4.7向量

4.8数组4.9参数4.10操作符4.1VerilogHDL简史VerilogHDL是1983年由GDA公司的PhilMoorby首创,后来Moorby设计了Verilog-XL仿真器并获成功,从而使Verilog语言得到推广使用。1989年,Cadence收购GDA,并在1990年公开发布VerilogHDL,并成立OVI(OpenVerilogInternational)组织负责Verilog语言的推广,Verilog语言的发展开始进入快车道,到1993年,几乎所有的ASIC厂商都开始支持Verilog。1995年,VerilogHDL成为IEEE标准,称为IEEEStandard1364-1995(Verilog-1995)。2001年,IEEE1364-2001标准(Verilog-2001)发布,Verilog-2001对Verilog-1995标准做了扩充和增强,提高了行为级和RTL级建模的能力。目前,多数综合器、仿真器支持的仍然是Verilog-2001标准。2005年,IEEE1364-2005标准(Verilog-2005)发布,该版本是对Verilog-2001版本的修正。Verilog语言的特点支持多个层级的设计建模,从开关级、门级、寄存器传输级到行为级,都可以胜任,可在不同设计层次上对数字系统建模,也支持混合建模。支持三种硬件描述方式:行为级描述——使用过程化结构建模;数据流描述——使用连续赋值语句建模;结构描述——使用门元件和模块例化语句建模。可指定设计延时,路径延时,生成激励和指定测试的约束条件,支持动态时序仿真和静态时序检查。内置各种门元件,可进行门级结构建模;内置开关级元件,可进行开关级的建模。4.2Verilog模块初识moduleaoi(a,b,c,d,f);/*模块名为aoi,端口列表a,b,c,d,f*/inputa,b,c,d; //模块的输入端口为a,b,c,doutputf; //模块的输出端口为fwirea,b,c,d,f;//定义信号的数据类型assignf=~((a&b)|(~(c&d))); //逻辑功能描述endmodule“与-或-非”电路Verilog程序由模块构成,每个模块的内容都嵌在module和endmodule两个关键字之间;每个模块首先要进行端口定义,分为输入端口input和输出端口output等,然后对模块的功能进行定义;Verilog程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写;除endmodule等少数语句外,每个语句的最后必须有分号;可以用/*……*/和//……对Verilog程序进行注释。

1.模块声明模块声明包括模块名字,模块输入、输出端口列表。模块定义格式如下:module模块名(端口1,端口2,端口3,……);2.端口(Port)定义对模块的输入输出端口要明确说明,其格式为:input端口名1,端口名2,……

端口名n; //输入端口output端口名1,端口名2,……

端口名n; //输出端口inout端口名1,端口名2,……

端口名n; //输入输出端口3.信号类型声明对模块中所用到的所有信号(包括端口、信号等)都必须进行数据类型的定义。数据类型声明示例:regcout; //定义信号cout的数据类型为reg型reg[3:0]out; //定义信号out的数据类型为4位reg型wirea,b,c,d,f; //定义信号a,b,c,d,f为wire型如果没有声明信号的数据类型,则综合器将其默认为是wire型。4.逻辑功能定义(1)用assign连续赋值语句定义。例如:assignf=~((a&b)|(~(c&d)));(2)用always过程语句定义。Verilog模块的模板module<顶层模块名>#(参数列表parameter...)(<输入输出端口列表>);

端口、信号数据类型声明;/*任务、函数声明,用关键字task,funtion定义*///逻辑功能定义assign<结果信号名>=<表达式>; //使用assign语句定义逻辑功能always@(<敏感信号表达式>) //用always块描述逻辑功能begin//过程赋值//if-else,case语句;for循环语句//task,function调用end//门元件例化

门元件名<例化名>(<端口列表>);//子模块例化<子模块名><例化名>#(参数传递)(<端口列表>);endmodule例4.4三人表决电路的Verilog描述。modulevote( //模块名与端口列表inputa,b,c, //模块的输入端口outputf); //模块的输出端口wirea,b,c,f; //定义信号的数据类型assignf=(a&b)|(a&c)|(b&c); //逻辑功能描述endmodule4.3Verilog设计示例例4.5BCD码加法器。moduleadd4_bcd(inputcin,input[3:0]ina,inb,outputwire[3:0]sum,outputcout);wire[4:0]temp=ina+inb+cin;assign{cout,sum}=(temp>9)?(temp+6):temp;endmoduleBCD码加法器的RTL综合视图例4.7异步清零/异步置1(低电平有效)的D触发器moduledff_asyn(inputd,clk,set,reset,outputregq,qn);always@(posedgeclk,negedgeset,negedgereset)beginif(~reset)beginq<=1'b0;qn<=1'b1;end //异步清零,低电平有效elseif(~set)beginq<=1'b1;qn<=1'b0;end //异步置1,低电平有效elsebeginq<=d;qn<=~d;endendendmodule例4.8带同步复位的4位模10BCD码计数器modulecount10(inputreset,clk,outputreg[3:0]qout,outputcout);always@(posedgeclk)beginif(~reset)qout<=0; //同步复位elseif(qout<9)qout<=qout+1;elseqout<=0;end //大于9,计数值清零assigncout=(qout==9)?1:0; //产生进位输出信号endmodule4位模10BCD码计数器的RTL级综合原理图4.4Verilog文字规则Verilog源代码由各种符号流构成,这些符号包括:空白符(Whitespace)注释(Comments)操作符(Operators)数字(Numbers)字符串(Strings)标识符(Identifiers)关键字(Keywords)等空白符和注释空白符(Whitespace)空白符包括:空格、tab、换行和换页。空白符使代码错落有致,阅读起来更方便。在综合时空白符被忽略。注释(Comment)单行注释:以“//”开始到本行结束多行注释:多行注释以“/*”开始,到“*/”结束关键字(Keywords)Verilog语言内部已经使用的词称为关键字或保留字,用户不能随便使用这些保留字。关键字都是小写的,例如,ALWAYS(标识符)不是关键字,它与always(关键字)是不同的4.4.2字符串字符串是由双引号标识的字符序列,字符串只能写在一行内,不能分成多行书写。字符串变量应定义为reg类型,其大小等于字符串的字符数乘以8。reg[8*12:1]stringvar;initialbeginstringvar="Helloworld!";end存储12个字符的字符串“Helloworld!”需要定义一个尺寸为8×12(96位)的reg型变量。字符串中的特殊字符\n、\t、\\和\"等常用的转义字符,VerilogHDL也同样支持,这些特殊的转义字符用符号“\”开头,其对应的按键和符号如表所示。例4.11转义字符测试代码modulestring_tb();reg[7:0]a;reg[8*4-1:0]b,str; //声明2个可容纳4个字符的字符串变量initialbegina="\123";b="AaCc";str={"\\","\0","\"","\n"}; //用拼接操作符实现字符的拼接$display("%sisstoredas%h",a,a);$display("%sisstoredas%h",b,b);$display("%sisstoredas%h",str,str);endendmodule4.4.3标识符

标识符是用户在编程时给Verilog对象起的名字,模块、端口和实例的名字都是标识符。标识符可以是任意一组字母、数字以及符号“$”和“_”(下划线)的组合,但标识符的第一个字符不能是数字或$,只能是字母(a~z、A~Z)或者是下划线“_”;标识符是区分大小写的。标识符最长可以包含1024个字符。示例:shiftreg_amerge_ab_bus3 //以下划线开头n$657整数实数4.5数字数字分为整数(integer)和实数(real)。

整数书写方式1:简单的十进制数格式,可以带负号,比如:659//十进制数659-59//十进制数-59整数(integer)整数书写方式2:按基数格式书写,其格式为:<+/-><size>'<s>basevalue<+/-><位宽>'<s>基数

数字(1)size为对应的二进制数的宽度,可省;(2)base为基数,或者称进制,可在前面加上s(或S),以表示有符号数。

进制可指定为如下4种:

二进制(b或B);

十进制(d或D,或缺省);

十六进制(h或H);

八进制(o或O)。(3)value是基于进制的数字序列,整数(integer)整数书写示例:8'b11000101//位宽为八位的二进制数110001018'hd5//位宽为八位的十六进制数d5;5'O27//5位八进制数4'D2//4位十进制数24'B1x_01//4位二进制数1x015'Hx//5位x(扩展的x),即xxxxx4'hZ//4位z,即zzzz8□'h□2A/*在位宽和'之间,以及进制和数值之间允许出现空格但'和进制之间,数值间不允许出现空格*/整数(integer)实数有两种表示方法。(1)十进制表示法(decimalnotation),例如:14.72。(2)科学记数法(scientificnotation),例如:39e8(等同于39108)。实数表示的例子:24.2631.2E12 //指数符号可以是e或E1.30e-2

//其值为0.01300.1e-0

//0.129E-2

//0.29236.123_763_e-12 //带下划线实数(Real)4.6数据类型Verilog有下面四种基本的逻辑状态。0:低电平、逻辑0或逻辑非1:高电平、逻辑1或“真”x或X:不确定或未知的逻辑状态z或Z:高阻态Verilog中的所有数据类型都在上述4类逻辑状态中取值。VerilogHDL的数据类型(DataType)主要用于表示数字电路中的物理连线、数据存储和传输线等物理量。Verilog共有19种数据类型,可分为两类:物理数据类型(包括wire型、reg型等)和抽象数据类型(包括time、integer、real型等)。数据类型Verilog中的变量分为如下两种数据类型:net型variable型net型中常用的有wire、tri;variable型包括reg、integer等。

4.6.2net数据类型net型数据多表示硬件电路中的物理连接,net型数据的值取决于驱动器的值。net型变量两种驱动方式:一是用连续赋值语句assign对其进行赋值,另一种方式是将其连接至门元件。如果net型变量没有连接到驱动源,则其值为高阻态z(trireg除外,在此情况下,它应该保持以前的值)。4.6.2net数据类型wire型是最常用的net数据类型,输入/输出信号在没有明确指定数据类型时均被默认为wire型。wire型变量的驱动方式包括连续赋值或者门元件驱动。tri型和wire型在功能及使用方法上是完全一样的,对综合器来说,对tri型数据和wire型数据的处理是完全相同的。wire型和tri型变量示例:wirew1,w2; //声明2个wire型变量w1,w2wire[7:0]databus; //databus的宽度是8位tri[15:0]busa; //三态16位总线busa4.6.3variable数据类型variable型变量必须放在过程语句(initial、always)中,通过过程赋值语句赋值;在always、initial过程块内赋值的信号也必须定义成variable型。reg型变量通过过程赋值语句赋值,用于建模寄存器,也可用来建模边沿敏感(触发器)和电平敏感(锁存器)的存储单元,同时,它也可以用来表示组合逻辑。reg型变量按无符号数处理,可使用关键字signed将其变为有符号数,并被EDA综合器和仿真器以2的补码的形式进行解释。示例:rega,b; //声明reg型变量a,breg[7:0]qout; //声明8位宽的reg型变量,无符号regsigned[8:1]opd1; //8位宽有符号reg型变量,以2的补码形式存在4.6.3variable数据类型4.7向量宽度为1位的变量(net型或reg型)称为标量(scalar),如果在变量声明中没有指定位宽,则默认为标量(1位)。宽度大于1位的变量(net型或reg型)称为向量(vector)。示例:wire[3:0]bus; //4位的总线reg[7:0]ra; //8位寄存器,其中ra[7]为最高有效位reg[0:7]rb; //rb[0]为最高有效位,rb[7]为最低有效位rega; //reg标量reg[4:0]x,y,z; //3个5位reg向量reg[-1:4]b; //6位reg向量,reg[-1]为最高有效位向量中的任意位都可以被单独选择,并且可对其单独赋值。如:reg[7:0]addr; //reg型变量,8位[7,6,5,4,3,2,1,0]addr[0]=1; //最低位赋1addr[3]=0; //第3位赋04.7.1

位选可选择单个比特位,也可以选择相邻的多位进行赋值或其他操作,称为段选。例如:wire[15:0]busa; //wire型向量assignbusa[7:0]=8'h23; //常数段选上面的多位选择,用常数作为地址范围,称为常数段选。4.7.2常数段选Verilog-2001中新增了一种段选方式:索引段选),其形式如下:[base_expr+:width_expr]//起始表达式

正偏移

位宽[base_expr-:width_expr]//起始表达式

负偏移

位宽例如:reg[63:0]word;reg[3:0]byte_num; //取值范围:0到7wire[7:0]byteN=word[byte_num*8+:8];4.7.3索引段选数组(Arrays)由元素(element)构成,元素可以是标量,也可以是向量。例如:regx[11:0]; //x是数组,其元素为reg标量,共12个元素wire[0:7]y[5:0]; //y是数组,其元素为8位宽wire型向量reg[31:0]v[127:0]; //v是数组,其元素为32位宽reg型向量4.8数组(Arrays)元素为reg类型的一维数组也称为存储器(Memory)。存储器可用于建模只读存储器(ROM)、随机存取存储器(RAM)。例如:reg[7:0]mema[0:255]; //256×8位的存储器,地址索引从0到2554.8.2存储器数组不能整体赋值,每次只能对数组的一个元素(element)进行赋值,每个元素都用一个索引号寻址,对元素进行位选和段选及赋值操作也是允许的。数组赋值的例子:mema[1]=0; //合法,mema的第2个元素赋值为0arrayb[1][0]=0; //合法,元素arrayb[1][0]赋值为0inta[4]=33559; //合法赋值mema=0; //非法,数组不能整体赋值4.8.3数组的赋值参数属于常量,它只能被声明(赋值)一次。通过使用参数,可以提高Verilog代码的可读性、可复用性和可维护性。4.9参

数parameter参数声明的格式如下。parameter[signed][range]参数名1=表达式1,参数名2=表达式2,...;参数可以有符号,可指定范围(位宽),还可指定其数据类型。parameter参数声明示例。parametermsb=7;parametere=25,f=9; //定义2个参数parameterr=5.7; //r为实数型参数parameterbyte_size=8,byte_mask=byte_size-1;parametersigned[3:0]mux_sel=0; //有符号参数4.9.1parameter参数例4.15采用参数定义的加法器操作数的位宽moduleadd_w//模块声明采用Verilog-2001格式#(parameterMSB=15,LSB=0) //参数声明,句末没有分号(input[MSB:LSB]a,b,output[MSB+1:LSB]sum);assignsum=a+b;endmodule例4.16采用参数声明的Johnson计数器modulejohnson_w#(parameterWIDTH=8) //参数声明(inputclk,clr,outputreg[WIDTH-1:0]qout);always@(posedgeclk,posedgeclr)beginif(clr)qout<=0;elsebeginqout<=qout<<1;qout[0]<=~qout[WIDTH-1];endendendmodule例4.174位格雷码计数器modulegraycnt#(parameterWIDTH=4)(outputreg[WIDTH-1:0]graycount, //格雷码输出信号inputwireenable,clear,clk); //使能、清零、时钟信号reg[WIDTH-1:0]bincount;always@(posedgeclk)if(clear)beginbincount<={WIDTH{1'b0}}+1;graycount<={WIDTH{1'b0}};endelseif(enable)beginbincount<=bincount+1;graycount<={bincount[WIDTH-1],bincount[WIDTH-2:0]^bincount[WIDTH-1:1]};endendmodule例4.18采用局部参数localparam的加法器moduleadd_local#(parameterMSB=15,LSB=0) //parameter参数定义(input[MSB:LSB]a,b,output[HSB:LSB]sum);localparamHSB=MSB+1; //localparam参数定义assignsum=a+b;endmodule4.9.2localparam局部参数按功能划分,包括:

算术操作符(ArithmeticOperators)

逻辑操作符(LogicalOperators)

关系操作符(RelationalOperators)

等式操作符(EqualityOperators)

缩减操作符(ReductionOperators)

条件操作符(ConditionalOperators)

位操作符(BitwiseOperators)

移位操作符(ShiftOperators)

指数操作符(PowerOperators)

拼接操作符(Concatenations)4.10操作符算术操作符属于双目操作符(有时也可用作单目操作符),包括:a+b //a加ba-b //a减ba*b //a乘ba/b //a除ba%b //取模(求余)a**b //a的b次幂4.10.1算术操作符关系操作符包含如下4种:a<b //a小于ba>b //a大于ba<=b //a小于等于ba>=b //a大于等于b4.10.2关系操作符a===b //全等操作符,a与b全等(需各位相同,包括为x和z的位)a!==b //a与b不全等a==b //相等操作符,a等于b(结果可以是x)a!=b //a不等于b(结果可以是x)属于双目操作符,得到的结果是1位的逻辑值声明的关系为真,结果为1;声明的关系为假,结果为04.10.3等式操作符算术操作符属于双目操作符(有时也可用作单目操作符),包括:a+b //a加ba-b //a减ba*b //a乘ba/b //a除ba%b //取模(求余)a**b //a的b次幂4.10.4逻辑操作符

~ 按位取反

& 按位与

| 按位或

^ 按位异或

^~,~^ 按位同或(符号^~与~^是等价的)4.10.5位操作符& 与

~& 与非

| 或

~| 或非

^ 异或

^~,~^ 同或缩减操作符与位操作符的逻辑运算法则一样,但缩减运算是对单个操作数进行与、或、非递推运算的,放在操作数的前面。缩减操作符可将一个矢量缩减为一个标量。例如:reg[3:0]a;b=&a; //等效于b=((a[0]&a[1])&a[2])&a[3];4.10.6缩减操作符

>> 逻辑右移

<< 逻辑左移

>>> 算术右移

<<< 算术左移用法为:A>>n或A<<n4.10.7移位操作符

>> 逻辑右移

<< 逻辑左移

>>> 算术右移

<<< 算术左移用法为:A>>n或A<<n4.10.7移位操作符

**执行指数运算,一般使用较多的是底数为2的指数运算,如

。例如:parameterWIDTH=16;parameterDEPTH=8;reg[WIDTH-1:0]mem[0:(2**DEPTH)-1];//存储器的深度用指数运算定义,该存储器容量(深度)为28(256)个单元4.10.8指数操作符

?:三目操作符,对三个操作数进行判断和处理,其用法如下:信号=条件?表达式1:表达式2;当条件成立(为1)时,信号取表达式1的值,条件不成立(为0)时取表达式2的值。4.10.9条件操作符

{}该操作符将两个或多个信号的某些位拼接起来。比如:{a,b[3:0],w,3'b101}{4{w}} //等同于{w,w,w,w}{b,{3{a,b}}} //等同于{b,a,b,a,b,a,b}res={b,b[2:0],2'b01,b[3],2{a}};4.10.10拼接操作符操作符的优先级在书写代码时,建议用括号()来控制运算的优先级

习题44-1用Verilog设计一个8位二进制加法计数器,带异步复位端口,进行综合和仿真。4-2用Verilog描述带同步置0/同步置1(低电平有效)端口的D触发器,进行综合和仿真。4-3用Verilog设计模60的8421BCD码计数器,进行综合和仿真。4-4下列标识符哪些是合法的、哪些是错误的?Cout,8sum,\a*b,_data,\wait,initial,$latch4-5下列数字的表示是否正确?6'd18,'Bx0,5'b0x110,'da30,10'd2,'hzF习题44-8能否对reg型变量用assign语句进行连续赋值操作?4-9用Verilog定义如下变量和常量:(a)定义一个名为count的整数;(b)定义一个名为ABUS的8位wire总线;(c)定义一个名为address的16位reg型变量,并将该变量的值赋为十进制数128;(d)定义一个名为sign_reg8的8位带符号reg型向量;(e)定义参数DELAY,参数值为8;(f)定义一个名为delay_time的时间变量;(g)定义一个容量为128位、字长为32位的存储器MYMEM。(h)定义一个2维(8×16)数组,其元素为8位wire型向量。4-10能否对存储器进行位选择和域选择?END数字系统设计与VerilogHDL(第9版)数字系统设计与VerilogHDL(第9版)第5章

Verilog行为描述5.1行为级建模5.2过程时序控制5.3过程赋值5.4过程连续赋值

5.5块语句5.6条件语句

5.7循环语句5.8任务5.9函数5.10automatic任务和函数5.11编译指令5.1行为级建模所谓行为级建模,或称为行为描述,是对设计实体的数学模型的描述,其抽象程度高于结构描述。行为描述类似于高级编程语言,当描述一个设计实体的行为时,无须知道其内部电路构成,只要描述清楚输入与输出信号的行为。VerilogHDL行为级建模是基于过程实现的,过程(procedure)包含以下4种:

initial;

always;

task;

function。5.1.1always过程语句always过程模板:always@(<敏感信号列表sensitivitylist>)begin//过程赋值//if-else,case选择语句//while,repeat,for循环语句//task,function调用end`defineadd 3'd0`defineminus 3'd1`defineband 3'd2`definebor 3'd3`definebnot 3'd4modulealu(input[2:0]opcode, //操作码input[7:0]a,b, //操作数outputreg[7:0]out);always@* //或写为always@(*)begincase(opcode)`add: out=a+b; //加操作`minus: out=a-b;//减操作`band: out=a&b; //按位与`bor: out=a|b; //按位或`bnot: out=~a; //按位取反default:out=8'hx;endcaseendendmoduleb)|(~(c&d)));endmodule例5.2指令译码电路示例5.1.2initial过程initial过程的使用格式:initialbegin

语句1;

语句2;…endinitial语句不带触发条件,过程中的块语句沿时间轴只执行一次。5.2过程时序控制VerilogHDL提供了两种时序控制方法,用于激活过程语句的执行:延时控制(用#表示)事件控制(用@表示)。5.2.1延时控制表示延时的方式:#10rega=regb; //一般延时rega=#10regb; //内嵌延时#drega=regb; //用参数表示延时#((d+e)/2)rega=regb; //用参数表示延时例5.3延时控制示例`timescale1ns/1nsmoduletest;rega;parameterDELY=10;//定义参数initialbegin a=0; //0ns,a=0#5a=1; //5ns,a=1,一般延时表示#DELY a=0;//15ns,a=0,用参数表示延时#(DELY/2) a=1;//20ns,a=1a=#10 0;//30ns,a=0,内嵌延时表示a=#5 1;//35ns,a=1#10$finish;endendmodule延时控制示例输出波形图5.2.2事件控制在VerilogHDL中,事件(event)是指某个reg型或wire型变量的值发生了变化。事件控制格式:@(event_expression)//event_expression可以是边沿、电平和命名事件1.一般事件控制对于时序电路,事件通常是由时钟边沿触发的。为表达边沿这个概念,VerilogHDL提供posedge和negedge两个关键字来描述。posedge是指从0到X、Z、1,以及从X、Z到1的正跳变(上升沿)negedge是指从1到X、Z、0,以及从X、Z到0的负跳变(下降沿)边沿触发示例。@(posedgeclock)//当clock的上升沿到来时@(negedgeclock)//当clock的下降沿到来时@(posedgeclkornegedgereset)对于组合电路,事件通常是输入变量的值发生了变化@(a) //当信号a的值发生改变@(aorb) //当信号a或信号b的值发生改变3.敏感信号列表当多个信号或事件中任意一个发生变化都能够触发语句的执行时,用关键字or连接多个事件或信号,这些事件或信号组成的列表称为“敏感列表”,也可以用逗号“,”代替or。示例:always@(a,b,c,d,e)//用逗号分隔敏感信号always@(posedgeclk,negedgerstn)//用逗号分隔敏感信号always@(aorb,c,dore)在RTL级的设计中,经常需要在敏感信号列表中列出所有的输入信号,采用隐式事件表达式来解决此一问题。示例:always@* //形式1always@(*) //形式25.3过程赋值过程赋值(proceduralassignment)必须置于always、initial、task和function过程内,属于“激活”类型的赋值,用于为reg、integer、time、real、realtime和存储器等数据类型的对象赋值。5.3.1variable型变量声明时赋值在variable型变量声明时可以为其赋初值,这可看作是过程赋值的一种特殊情况,variable型变量将会保持该值,直到遇到对该变量的下一条赋值语句。示例reg[3:0]a=4'h4;上面的语句等同于:reg[3:0]a;initiala=4'h4;5.3.2阻塞过程赋值VerilogHDL包含两种类型的过程赋值语句:阻塞(blocking)过程赋值语句;非阻塞(nonblocking)过程赋值语句。阻塞过程赋值符号为“=”示例b=a;5.3.3非阻塞过程赋值非阻塞过程赋值的符号为“<=”。b<=a;非阻塞过程赋值可以在同一时间为多个变量赋值,而不需考虑语句顺序或相互依赖性,非阻塞过程赋值语句是并发执行的(相互间无依赖关系),故其书写顺序对执行结果无影响。例5.5非阻塞过程赋值的示例`timescale1ns/1nsmoduleevaluate;rega,b,c;initialbegina=0;b=1;c=0;endalwaysc=#5~c;always@(posedgec)begina<=b;b<=a;#100$finish;endendmodule非阻塞过程赋值的执行结果5.4过程连续赋值过程连续赋值主要有两种:assign、deassignforce、release5.4.1assign和deassignassign(过程连续赋值操作)与deassign(取消过程连续赋值操作)的赋值对象只能是variable型变量,而不能是net型变量。赋值过程中对variable型变量连续赋值,该值将保持直到被重新赋值。例5.9用assign与deassign描述带异步复位和置位端的D触发器moduledff_assign(inputd,clock,inputclear,preset,outputregq);always@(clearorpreset)if(!clear)assignq=0;//assign语句赋值0elseif(!preset)assignq=1;//assign语句赋值1elsedeassignq;//q被deassign语句取消赋值always@(posedgeclock)q=d;endmodule5.4.2force和releaseforce(强制赋值)与release(取消强制赋值)也是过程连续赋值语句,其使用方法和效果与assign、deassign类似,但赋值对象可以是variable型变量,也可以是net型变量。因为是无条件强制赋值,一般多用于交互式调试过程,应避免在设计模块中使用。例5.10用force与release赋值`timescale1ns/1nsmoduletest_force;rega,b,c,d;wiree;andg1(e,a,b,c);initialbegin$monitor("%dd=%b,e=%b",$stime,d,e);assignd=a&b&c;a=1;b=0;c=1;#10;forced=(a|b|c); //force强制赋值forcee=(a|b|c);#10;released;//release取消强制赋值releasee;#10$finish;endendmodule

5.5块

句begin-end串行块中的语句按串行方式顺序执行。比如:beginregb=rega;regc=regb;end5.5.1串行块begin-end例5.11用begin-end串行块产生信号波形`timescale10ns/1nsmodulewave1;parameterCYCLE=10;regwave;initialbegin wave=0;#(CYCLE/2) wave=1;#(CYCLE/2) wave=0;#(CYCLE/2) wave=1;#(CYCLE/2) wave=0;#(CYCLE/2) wave=1;#(CYCLE/2) $stop;endinitial$monitor($time,,,"wave=%b",wave);endmodule例5.11描述的波形

5.5块

句并行块fork-join中的所有语句都是并发执行的。示例forkregb=rega;regc=regb;join5.5.2并行块fork-join例5.12用fork-join并行块产生信号波形。`timescale10ns/1ns

温馨提示

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

评论

0/150

提交评论