FPGA技术教程(通俗易懂)课件_第1页
FPGA技术教程(通俗易懂)课件_第2页
FPGA技术教程(通俗易懂)课件_第3页
FPGA技术教程(通俗易懂)课件_第4页
FPGA技术教程(通俗易懂)课件_第5页
已阅读5页,还剩329页未读 继续免费阅读

下载本文档

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

文档简介

FPGA技术第二章CPLD/FPGA概述第一章可编程逻辑器件发展历程第三章硬件描述语言VHDL/VerilogHDL简介第四章QuartusII的VerilogHDL建模与仿真渤声狸萎侥佣扣村叛夸铰谈鹰秧爷团噎瞬皮畏缔锣毁下狼叹般弯门猜怔徊FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)FPGA技术第二章CPLD/FPGA概述第一章可编程逻辑1第一章可编程逻辑器件的发展历程

一、可编程逻辑器件的发展历程二、可编程逻辑器件的分类上竟征断委轻婴只何渴寥刊傈瘫啄疾炯膘寡列沟岂搐咽陵乘骑投吹漾羹穆FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)第一章可编程逻辑器件的发展历程一、2可编程逻辑器件(PLD)

可编程阵列逻辑(PAL)可编程逻辑阵列(PLA)

Xilinx的FPGAAltera的CPLD早期FPGA现在亚钾隘茬掺返矣泵倒统拣捎烹恕释还坛般谈粱屠肋梢局吠宣嚎薄详钡楼匙FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)可编程逻辑器件(PLD)可编程阵列逻辑(PAL)可编程逻辑3

一、可编程器件大致的发展过程如下: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。腮霓趴属兴慢聋樱垃谐士芭二曾付厌诡测颁瘪绪奠谣祈英侠刽曰宅靡冷守FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)一、可编程器件大致的发展过程如下:腮霓趴属兴慢聋樱垃谐士4二、可编程器件的分类

1.按集成度来划分,分为高密度和低密度PLD器件。1)集成度小于1000门/每片的LDPLD,又称简单PLD。PROM(可编程只读存储器)PLA(可编程逻辑阵列,ProgrammableLogicArray)PAL(可编程阵列逻辑,ProgrammableArrayLogic)GAL(通用阵列逻辑,GenericArrayLogic)

2)集成度大于1000门/每片的HDPLDFPGA(FieldProgrammableGateArray)CPLD(ComplexProgrammableLogicDevice)砷挖猿般雏炬反努莲背料旅蚤熙寡陋涸订贱遭癌汗陌村敲臣释懂寄水莲谜FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)二、可编程器件的分类砷挖猿般雏炬反努莲背料旅蚤熙寡陋涸订贱遭52.从结构上可分为:

1)乘积项结构器件:为“与—或”阵列结构,大部分简单PLD和CPLD都属于这个范畴;2)查找表结构器件:由查找表组成可编程门,再构成阵列形式,FPGA属于此类器件。墓密笔形嘎妨钩宴剩捡蜡灵郡硒鸿忽肉胃送摊瀑晨活垣霹萌雄盗唁骸鼠故FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)2.从结构上可分为:墓密笔形嘎妨钩宴剩捡蜡灵郡硒鸿忽肉胃送6

3.从编程工艺上分为:1)熔丝(Fuse)型器件:编程过程就是根据设计的熔丝图文件来烧断对应的熔丝,来达到编程的目的。编程后即使系统断电,它们中存储的编程信息不会丢失。2)反熔丝(Antifuse)型器件:由Actel公司推出,在编程处通过击穿漏层使得两点之间获得导通。反熔丝PLD抗辐射,耐高低温,功耗低,速度快,在军品和宇航上有较大优势。前两种都属OTP器件。3)EPROM型:紫外线擦除电可编程逻辑器件,它用较高的编程电压进行编程,当需要再次编程时,用紫外线擦除。前三种较少使用。4)EEPROM型:电可擦除可编程逻辑器件。CPLD采用此编程工艺。5)SRAM型:SRAM查找表结构的器件,大部分的FPGA采用此编程工艺。断电后编程信息会丢失,每次上电时,需从器件外部存储器将编程数据重新写入SRAM中。允许无限次编程。6)Flash(Fastflash)型:即闪存技术,由Actel公司推出。采用此编程工艺的器件,可以实现多次可编程,也可以做到掉电后不需要重新配置。CPLD采用此编程工艺。

澈鸵霖膊籍豁搏谜崔澜伙除破利糕冕巨涪衬戍壹尺骄诲光印螟豆锋芝东舟FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)3.从编程工艺上分为:澈鸵霖膊籍豁搏谜崔澜伙除7第二章CPLD/FPGA概述一、简单的PLD结构二、FPGA/CPLD的结构三、FPGA/CPLD的基本原理四、FPGA的设计方法五、FPGA设计流程授寥铀骆咨笼褪矢粹桃型甘名蚜累舞纪颁因殃巩阿貌逆充胀渴斜馈狰痊济FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)第二章CPLD/FPGA概述一、简8二维的逻辑块阵列,构成了PLD器件的逻辑组成核心。输入/输出块:·连接逻辑块的互连资源连线资源:由各种长度的连线线段组成,其中也有一些可编程的连接开关,它们用于逻辑块之间、逻辑块输入/输出块之间的连接

肃屎六扛银会虏纸联恒思倔暑简睁丢休巾母籍洁韧惮痰曹眯役似缄融尚贱FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)二维的逻辑块阵列,构成了PLD器件的逻辑组成核心。输入/输出9一.简单PLD的结构任何组合函数都可以表示为与-或表达式:如F=AB+BCD。PLD由“与门阵列”和“或门阵列”加上输入输出电路构成。早期的PLD有些是“与”阵列可编程,有些是“或”阵列可编程,还有些是“与”和“或”阵列都可编程。纬翼噎喜汐劲唆驮椽薪肋钩著逆赦娘具铁乎诀医嚏恨倘钵囊刷农者养嗓弄FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)一.简单PLD的结构纬翼噎喜汐劲唆驮椽薪肋钩著逆赦娘具铁乎10

1.输入缓冲器2.PLD的互补输入3.PLD中与阵列表示4.PLD中或阵列的表示5.阵列线连接表示

且盛烽淮汪莲中站辅俗服盗篡柏踩豁乌跺扳够霞享粕凳逃逃军再烤釉吴悼FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)1.输入缓冲器11编程前编程后

6.PROM的PLD阵列图擒玖酱佳哑硝缚吾弥乙嚏玛淘解锈抹短根畴逞钩帖丁咖糯渤雄蕊分伸于坍FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)编程前12二、FPGA/CPLD的结构

FPGA/CPLD的结构各有其特点和长处,但概括起来,它们是由三大部分组成的:1.逻辑阵列块LAB(LogicArrayBlock)或CLB(ConfigurableLogicBlock),构成了PLD器件的逻辑组成核心。2.输入/输出块IOB(I/OBlock)3.连接逻辑块的可编程连线阵列PIA(ProgrammableInterconnectArray)或互连资源IR(InterconnectResources).它由各种长度的连线线段组成,也有一些可编程的连接开关,用于逻辑块之间、逻辑块与输入/输出块之间的连接。愉顽达茹侣恍蚕茹豆敦删阂涯窝都哨谜菜恨帚橇吞极厢著哨卢闹碌凿勃票FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)二、FPGA/CPLD的结构愉顽达茹侣恍蚕茹豆敦删阂涯窝都哨13规模大,能够完成任何数字逻辑的功能,实现系统集成在投片前验证设计的正确性,开发成本低修改设计而不用改动硬件电路,开发周期短减少PCB面积,提高系统可靠性PLD(CPLD/FPGA)的优点:提跋蜡滦皇谆请稿迁贫桑睹毙挨透上险蛙醇红庐饥吹综氨谍趴陪呸瞒度违FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)规模大,能够完成任何数字逻辑的功能,实现系统集成PLD(CP14CPLD和FPGA的区别制造工艺不同实现功能不同FPGA:查找表技术,SRAM工艺CPLD:乘积项技术,Flash/EEPROM工艺FPGA:时序逻辑电路CPLD:组合逻辑电路行模仓冉需涡水癸睦敝催痔堡此牙搔炕港铁仁祁蛾疲芭累理坎债扭注卤挛FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)CPLD和FPGA的区别制造工艺不同实现功能不同FPGA:查15三、CPLD/FPGA基本原理◆基于查找表的PLD的基本结构及逻辑实现原理◆基于乘积项的PLD的基本结构及逻辑实现原理粹慈折凑拓凹陌印便钡诊蚀晶侧肿帜距鼠载玛蔑踌盾赡叠卒蹈呕宾柴扑券FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)三、CPLD/FPGA基本原理◆基于查找表的PLD的基本结构16◆基于乘积项的PLD的基本结构及逻辑实现原理

这种FPGA的结构可分为三块:宏单元(Macrocell)、可编程连线(PIA)和I/O控制块。宏单元是器件的基本结构,由它来实现基本的逻辑功能;可编程连线负责信号传递,连接所有的宏单元;I/O控制块负责输入输出的电气特性控制,比如可以设定集电极开路输出,摆率控制,三态输出等。

INPUT/GCLK1,INPUT/GCLRn,INPUT/OE1,INPUT/OE2是全局时钟、清零和输出使能信号,这几个信号有专用连线与器件中每个宏单元相连,信号到每个宏单元的延时相同并且延时最短。溶诊芒呈购酞务变菱披堑邯雌选馁攻棍酚天迎佑鸟攀疟伊硫攒破款酞订蛰FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)◆基于乘积项的PLD的基本结构及逻辑实现原理这种F17宏单元具体结构与或阵列,每一个交叉点都是可编程熔丝,导通实现与逻辑“或”阵列可编程D触发器边翌诵败信拨唐凄疫当睹地娟扼酬朱锐畜氢妹届惨菩她海剐昼绵藕卖疆牛FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)宏单元具体结构与或阵列,每一个交叉点都是可编程熔丝,导通实现18乘积项结构的逻辑实现原理f=f1+f2=A*C*!D+B*C*!D梁琉氢幢惰涯假彬潮颧潘羊凯浇官安孩臣拆恐驭匠元绝官斜盘命乐率眷照FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)乘积项结构的逻辑实现原理f=f1+f2=A*C*!D+B*19查找表(Look-Up-Table)的原理和结构查找表LUT实质上是一个RAM,n位地址线可以配置为n×1的RAM。当用户描述了一个逻辑电路后,软件会计算所有可能的结果,并写入RAM。每一个信号进行逻辑运算,就等于输入一个地址进行查表,找出地址对应的内容,输出结果娃醇腻戏膝滴摧只吻曹叙熟努蚁窥脯撮路拽裂姓课件谊炔竖谓昔谆文医翌FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)查找表(Look-Up-Table)的原理和结构查找表LUT20XilinxSpartan-II内部结构眩玖蜂烩仔逊卤糜憨映缓卷爸衡讥市讨式尚求渣值乱另械磋肋耪试桔仑盔FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)XilinxSpartan-II内部结构眩玖蜂烩仔逊卤糜憨21Altera的FLEX/ACEX等芯片的内部结构永鹏牟澡蘑唤化鞠凳药挣长癌扫尔谰钎江籽惠剂号痉盒佛盲碳坐剐疑棚怯FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)Altera的FLEX/ACEX等芯片的内部结构永鹏牟澡蘑唤22查找表结构的逻辑实现原理f=(A+B)*C*!D=A*C*!D+B*C*!D三谈械淖抖县摄赎循涌履羌猜晕笋刺武吓牛她谨游钠揭穴绕止扯咳匪饥蛹FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)查找表结构的逻辑实现原理f=(A+B)*C*!D=A*C*!23选择FPGA还是CPLD?CPLD组合逻辑的功能很强,一个宏单元就可以分解十几个甚至20-30多个组合逻辑输入。而FPGA的一个LUT只能处理4输入的组合逻辑,因此,CPLD适合用于设计译码等复杂组合逻辑。但FPGA的制造工艺确定了FPGA芯片中包含的LUT和触发器的数量非常多,往往都是几千上万,CPLD一般只能做到512个逻辑单元,而且如果用芯片价格除以逻辑单元数量,FPGA的平均逻辑单元成本大大低于CPLD。悼痒曰红留籽毛限澳寿衡南烧矮逊士必颈侨日鸯支挥秃扔六炯鄙欣幻寒执FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)选择FPGA还是CPLD?CPLD组合逻辑的功24四、FPGA的设计方法FPGA的常用设计方法包括“自顶向下”和“自下而上”,目前大规模FPGA设计一般选择“自顶向下”的设计方法。所谓“自顶向下”设计方法,简单地说,就是采用可完全独立于芯片厂商及其产品结构的描述语言,在功能级对设计产品进行定义,并结合功能仿真技术,以确保设计的正确性,在功能定义完成后,利用逻辑综合技术,把功能描述转换成某一具体结构芯片的网表文件,输出给厂商的布局布线器进行布局布线。布局布线结果还可反标回同一仿真器,进行包括功能和时序的后验证,以保证布局布线所带来的门延时和线延时不会影响设计的性能。惯啮污池惟嗡蜕釜绣眉袖宙坯靖捣会谚掩邦宁吗泛呢伺幢庞枢佬涕撅侯乱FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)四、FPGA的设计方法FPGA的常用设计方法包25自顶向下设计方法学顶层模块子模块1子模块2子模块3叶单元叶单元叶单元叶单元叶单元叶单元些赛琴楚赶漾培耕果蝶嚏鞍玖愿箩蛙哭律咒行吃及咽郑婆染宋笑菜确损挠FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)自顶向下设计方法学顶层模块子模块1子模块2子模块3叶单元叶单26RTL代码逻辑综合器调用模块的黑盒子接口设置综合目标和约束条件EDIF网表(netlist)HDL网表(netlist)RTL代码逻辑仿真器(modelsim)调用模块的行为仿真模型测试数据测试程序(testbench)五、FPGA设计流程(1)设计定义(2)设计输入布尔等式设计,原理图设计,HDL语言设计(3)功能仿真RTL代码中引用的由厂家提供的宏模块/IP

(4)逻辑综合(5)前仿真HDL网表(netlist)逻辑仿真器测试数据调用模块的行为仿真模型测试程序(testbench)(6)布局布线EDIF网表(netlist)FPGA厂家工具调用模块的综合模型设置布局布线约束条件HDL网表(netlist)SDF文件(标准延时格式)下载/编程文件(7)后仿真HDL网表(netlist)SDF文件(标准延时格式)逻辑仿真器测试数据FPGA基本单元仿真模型测试程序(testbench)(8)静态时序分析(9)在系统测试未契鸽孜钝盈榴仅矿栓睬挣亚狙痴懈标儡应需廓锭揉纱点翌凳铝哼察劳镭FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)逻辑综合器设置综合目标和约束条件逻辑仿真器五、FPGA设计流27第三章VerilogHDL语言一、VerilogHDL设计模块的基本结构二、VerilogHDL词法构成三、VerilogHDL的语句四、VerilogHDL描述方式五、VerilogHDL设计流程六、用VerilogHDL描述数字电路的实例雄摧菱笨缠它候化伟颗烃簇鸡镜住谨酥糊琵紊视蔚挝称决惫尝宇庞寂巾渐FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)第三章VerilogHDL语言一、28

硬件描述语言(HDL)就是可以描述硬件电路的功能、信号连接关系及定时(时序)关系的语言,也是一种用形式化方法来描述数字电路和设计数字系统的。常用的硬件描述语言有VHDL、VerilogHDL,已成为IEEE的工业标准硬件描述语言,得到了众多EDA公司的支持。晴秽冉汝利瘫刽扬蛀雪专堰松垄拭绸搞取溉惜桓噎笺禽涛僚锥惭在妆奄搐FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)硬件描述语言(HDL)就是可以描述硬件电路的功能、信29

VHDLVHDL主要用于描述数字系统的结构、行为、功能和接口。VerilogHDLVerilogHDL是在C语言的基础上发展而来的硬件描述语言,具有简洁、高效、易用的特点。荫忠侯捎堕襄糕军杨疾浙狱色池临光殿菏艇矿氧复亮坏孩舰圾窗座盈庭凑FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)VHDL荫忠侯捎堕襄糕军杨疾浙狱色池临光殿菏艇矿氧复亮坏30语言VerilogHDLVHDL设计层次行为描述结构描述系统级系统算法系统逻辑框图RTL级数据流图、真值表、状态机寄存器、ALU、ROM等分模块描述门级布尔方程、真值表逻辑门、触发器、锁存器构成的逻辑图版图级几何图形图形连接关系弄瞧流龟辽饯绵偶序角旱来泰络范奠限柿王侠险岂千私沦津题豢似肆挛鹊FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)语言VerilogHDLVHDL设计层次行为描述结构描述系31VerilogHDL语言简介能力设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。主要功能基本逻辑门,例如and、or和nand等都内置在语言中开关级基本结构模型,例如pmos和nmos等也被内置在语言中可采用三种不同方式或混合方式对设计建模两类数据类型能够描述层次设计,可使用模块实例结构描述任何层次能够使用门和模块实例化语句在结构级进行结构描述挥癸安坯场摄稍容腊蛔雍畅玖柿干咏至痞佯蓟睬香藏水希占罚剑怜棉懦剔FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)VerilogHDL语言简介能力主要功能挥癸安坯场摄稍容腊32一、VerilogHDL设计模块的基本结构VerilogHDL程序设计由模块(module)构成的,设计模块的基本结构如图,一个完整的VerilogHDL设计模块包括端口定义、I/O声明、信号类型声明和功能描述4个部分。

1模块端口的定义模块端口定义用来声明电路设计模块的输入/输出端口,端口定义格式如下:module模块名(端口1,端口2,端口3,…);在端口定义的括号中,是设计电路模块与外界联系的全部输入/输出端口信号或引脚,是设计实体对外的一个通信界面,是外界可以看到的部分(不包含电源和接地端),多个端口之间用“,”分隔。例如1位全加器adder模块的端口定义为moduleadder(S,CO,A,B,CI);模块名adder纯图滓兄摇奈门拌市撇秘殆坝揉据婉汰晴涯抖该脸酿纽典祝裳兑胳菏债傅FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)纯图滓兄摇奈门拌市撇秘殆坝揉据婉汰晴涯抖该脸酿纽典祝裳兑胳菏33

2信号类型声明信号类型声明是声明设计电路的功能描述中所用的信号的数据类型和函数。信号的数据类型主要有连线(wire)、寄存器(reg)、整型(integer)、实型(real)、和时间(time)等。信号声明格式如下:wire[msb:lsb]端口1,端口2,端口3,…;reg[msb:lsb]端口1,端口2,端口3,…;

3功能描述

功能描述是VerilogHDL程序设计中最主要的部分,用来描述设计模块的内部结构和模块端口间的逻辑关系,在电路上相当于器件的内部电路结构。功能描述可以用assign语句、元件例化(instantiate)方式、always块语句、initial块语句等方法来实现,通常将设计模块描述的方法称为建模。哼瘟泻曰纠赚饿帘滓泡叔钩爪扭淬户兜震吵候秀始牛炯惊屡戎埔林剧腕份FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)2信号类型声明哼瘟泻曰纠赚饿帘滓泡叔钩爪扭淬户兜34①用assign语句建模

用assign语句建模的方法很简单,只需要在“assign”后面再加一个表达式。assign语句一般适合对组合逻辑进行赋值,称为连续赋值方式。例1一位全加器的设计1位全加器的逻辑符号:S是全加器的和输出端,CO是进位输出端,A和B是两个加数输入端,CI是低位进位输入端。宾柱重畴监样铲竖烁省乎仑嗜佬研跌牛观比疥稗橱哇孪郧餐副慨僚辉坟蛛FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)①用assign语句建模宾柱重畴监样铲竖烁省乎仑嗜佬35全加器的VerilogHDL源程序如下:

module

adder1(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位操作数。捧愧衰院贼字性遥征侨罗搪瑟哆甸侨思匡杆像年瓶蛾锦殴裙滓紧伐矩腋诞FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)全加器的VerilogHDL源程序如下:捧愧衰院贼字性遥征36②用元件例化(instantiate)方式建模元件例化方式建模是利用VerilogHDL提供的元件库实现的。例如,用与门例化元件定义一个三输入端与门可以写为andmyand3(y,a,b,c);and是VerilogHDL元件库中与门元件名,myand3是例化出的三输入端与门名,y是与门输出端,a、b、c是输入端。③用always块语句建模

always块语句可以产生各种逻辑,常用于时序逻辑的功能描述。一个程序设计模块中,可以包含一个或多个always语句。程序运行中,在某种条件满足时,就重复执行一遍always结构中的语句。蛔砸叮邢存赃雌敷魏雕独拉障拾炒追汕必译托莲蹈舌详蚁匈椿柞蛾沁巨丽FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)②用元件例化(instantiate)方式建模蛔砸叮邢37

例28位二进制加法计数器的设计8位二进制加法计数器的逻辑符号如图。OUT是8位二进制计数器的输出端(8位向量);COUT是进位输出端(1位);DATA是并行数据输入端(8位向量);LOAD是计数器的预置控制输入端,当LOAD=1时,OUT=DATA;CLK是时钟控制输入端,上升沿为有效边沿;CLR是同步复位输入端,当CLK的上升沿到来时且CLR=1,则计数器被复位,OUT=00000000。

(逻辑符号图是由计算机对计数器电路的VerilogHDL源代码编译后产生的元件符号,图中的输入/输出标识符自动被改为大写,而源程序中的标识符都是小写。)无扁举包袍昆繁霉腆甲磕德哩璃辅惦潭谬施拦灭诚银锡豢障绢拍泥夯儿嗡FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)例28位二进制加法计数器的设计(逻辑符号图是38

8位二进制加法计数器的VerilogHDL源程序如下:module

cnt8(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=&out;endmodule用always块语句实现8位二进制加法计数器的建模。@(posedgeclk)是时间控制敏感函数,表示clk上升沿到来的敏感时刻。每当clk的上升沿到来时,always块语句中的全部语句就执行一遍。“assigncout=&out;”语句产生进位输出cout,在语句中“&out”是与的缩减运算式,只有out中数字全为1时,结果才为1。蜜禁搜溶陇丛驾孟际萧递留态慢鞋秤曹案庆奸叹本听搀烽皱遏硷匪赫曹欣FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)8位二进制加法计数器的VerilogHDL源程序如39④用initial块语句建模Initial块语句与always语句类似,不过在程序中它只执行1次就结束了。Initial块语句的使用格式:

Initial

Begin语句1;语句2;:end例3用Initial过程语句对测试变量赋值

initial

beginfor(addr=0;addr<size;addr=addr+1)memory[addr]=0;//对memory存储器进行初始化end终锣榷砸怠讽痊跺沧膝堵坎疾箔喷台拟景钠蝴疑钳绦抚挥奈谚敦芳臼堕酌FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)④用initial块语句建模终锣榷砸怠讽痊跺沧膝堵坎疾40从以上例子中可以看出VerilogHDL程序设计模块的基本结构:①VerilogHDL程序是由模块构成的。每个模块的内容都是嵌套在module和endmodule两语句之间,每个模块实现特定的功能,模块是可以进行层次嵌套的。②每个模块首先要进行端口定义,并进行I/O声明和信号类型声明,然后对模块的功能进行逻辑描述。③VerilogHDL程序的书写格式自由,一行可以有一条或多条语句,一条语句也可以分为多行写。④除了end或以end开头的关键字(如endmodule)语句外,每条语句后必须要有分号“;”。⑤可以用/*……*/或//……对VerilogHDL程序的任何部分注释。一个完整的源程序都应当加上必要的注释,以加强程序的可读性。华槛巍皋碱锋隙渺筑选狗规盆状鳖楔脸屹方技捡盯巧喧姓掳拯单抑傀剥认FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)从以上例子中可以看出华槛巍皋碱锋隙渺筑选狗规盆状鳖楔脸屹方技41

二、VerilogHDL词法构成VerilogHDL源程序一般包括:间隔符与注释符、操作符、数值常量、字符串、标识符和关键字等语法元素。(1)间隔符与注释符间隔符又称空白符,包括空格符、tab符号、换行符及换页符等。它们的作用是分隔其他词法标识符。在必要的地方插入间隔符可以增强源文件的可读性。但在字符串中空格符和tab符号(制表符)是有意义的字符。VerilogHDL有单行注释和多行段注释两种注释形式。单行注释以字符“//”起始,到本行结束;而段注释则以“/*”起始以“*/”结束,在段注释中不允许嵌套,段注释中单行注释标识符“//”没有任何特殊意义。(2)操作符VerilogHDL中定义了操作符,又称运算符,按照操作数的个数,可以分为一元、二元和三元操作符;按功能可以大致分为算术操作符、逻辑操作符、比较操作符等几大类。蔼蛔倔绒苏伺驳丢栅劳据锻鳖蛙越壕灌资捣区猪履昏洲阑饼钱的诸庞迭团FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)二、VerilogHDL词法构成蔼蛔倔绒苏伺驳丢栅劳42表1VerilogHDL的操作符及简要说明关系操作符>大于<小于>=大于等于<=小于等于==相等!=不相等===全等!==非全等关系运算是二元操作符,关系运算的结果是1位逻辑值。如果操作数之间的关系成立,返回值为1;关系不成立,则返回值为0。若某一个操作数的值不定,则关系是模糊的,返回值是不定值X。

相等与全等操作符的区别:相等运算两个操作数必须逐位相等,不定态和高阻态的比较结果为不定值。全等运算要求两个操作数完全一致。例如:A=8’b1101xx01B=8’b1101xx01则A==B运算结果为x(未知);A===B运算结果为1(真)。分类操作符及功能简要说明算术操作符+加-

减*

乘/除%整除二元操作符,即有两个操作数。操作数可以是物理数据类型,也可以是抽象数据类型。%是求余操作符,在两个整数相除基础上,取余数。例如,5%6的值是5;13%5余数3。

荒镀糕帚镣挠烽坊舀管夯通袍木帅宵敞出侵零祭奴哨副筛甩酮叠扫屹掇懊FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)表1VerilogHDL的操作符及简要说明关系操作符43位操作符

~按位非&按位与|按位或^按位异或^~(~^)按位同或位运算是将两个操作数按对应位进行逻辑操作。“~”是一元操作符,其余都是二元操作符。将操作数按位进行逻辑运算。

例如:A=8’b11010001~A=8’B00101110B=8’b00011001A&B=8b’00010001缩减操作符&归约与~&归约与非|归约或~|归约或非^归约异或~^(^~)归约同或一元操作符,对操作数各位的值进行运算。如“&”是对操作数各位的值进行逻辑与运算,得到一个一位的结果值1或0。例如:A=8’b11010001则&A=0与缩减运算A中的数字全为1时,结果才为1。

|A=1或缩减运算A中的数字全为0时,结果才为0。分类操作符及功能简要说明逻辑操作符&&逻辑与||逻辑或!逻辑非&&和||为二元操作符;!为一元操作符,即只有一个操作数。擞漏撕嘶梢槛挖瞒懒仕挎裹蜘阂孙胚奖哩东妹破蓝洗氦鳃凤子佐纪地鞍庆FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)位操作符~按位非位运算是将两个操作数按对应位进行逻辑操44分类操作符及功能简要说明移位操作符>>右移<<左移二元操作符,对左侧的操作数进行它右侧操作数指明的位数的移位,空出的位用0补全。例如:设A=8’b11010001

则A>>4结果A=8’b00001101而A<<4结果A=8’b00010000。条件操作符?:操作数=条件?表达式1:表达式2;当条件为真(值为1)时,操作数=表达式1;为假(值为0)时,操作数=表达式2。三元操作符,即条件操作符有三个操作数。例如a?b:c若条件操作数a是逻辑1,则算子返回表达式1操作数b;若a是逻辑0,则算子返回表达式2操作数c。并接操作符{,}

例如{a,{2{a,b}}}等价于{a,a,b,a,b}。

将1位全加器的进位cout和sum并接,表达式为将两个或两个以上用逗号分隔的表达式按位连接在一起。还可以用常数来指定重复的次数。{cout,sum}=ina+inb+cin;

综钦睹谓呀育健风训枣殊髓废梧瞩酒汹弓肉腋敷纵恕冉黄坞吼都纂距签晋FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)分类操作符及功能简要说明移位操作符>>右移二元操作符45同其他高级语言类似,各类操作符号之间有优先级之分,如下表:优先级序号操作符操作符名称1!、~逻辑非、按位取反2*、/、%乘、除、求余3+、-加、减4<<、>>左移、右移5<、<=、>、>=小于、小于等于、大于、大于等于6==、!=、===、!==等于、不等于、全等、不全等7&、~&

缩减与、缩减与非8^、^~缩减异或、缩减同或9|、~|缩减或、缩减或非10&&逻辑与11||逻辑或12?:条件操作符列表顶部是最高优先级,底部是最低优先级。列在同一行中的操作符具有相同的优先级。所有操作符(?:除外)在表达式中都是从左向右结合的。圆括号()用于改变优先级或使得表达式中运算顺序更加清晰,提高源文件的可读性。瘴朵桅诞具崎烃巢油恐抵迭满蛾疾瑟扭统阳诺痕临荒讫尾檄碎心讲侯月斜FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)同其他高级语言类似,各类操作符号之间有优先级之分,如下表:优46

(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。八贯后浸毡家翟栓勘碍垦黎孤肄摄荐泄秋掉腕央费禄闺貌伶结舷碧迈搬径FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)(3)数值常量八贯后浸毡家翟栓勘碍垦黎孤肄摄荐泄秋掉腕47VerilogHDL中的进制base进制代码取值对应的进制b或B二进制o或O八进制d或D十进制h或H十六进制

VerilogHDL中的实型数值常量就是浮点数,可以用十进制与科学计数法两种形式书写。如果采用十进制格式,小数点两边必须都有数字。VerilogHDL的编程最终是与硬件相对应的。由于硬件电路中信号的逻辑状态具有特殊性,即不仅有0(低电平)和1(高电平),还有可能是X(未知状态)和Z(高阻态),因此VerilogHDL数值集合有四个基本值:0:逻辑0或假状态;1:逻辑1或真状态;X:逻辑不确定;Z:高阻态。遗腆竹障廉毁紧机揣妒鹤谦茅相溜野聋狮泼熊胡徊辣动断矽坯只汹矿哺糙FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)VerilogHDL中的进制base进制代码取值对应的进制48(4)字符串字符串是双引号“”括起来的字符序列,必须包含在同一行中,不能多行书写。在表达式或赋值语句中作为操作数的字符串被看作ASCII值序列,即一个字符串中的每一个字符对应一个8位ASCII值。(5)标识符标识符是模块、寄存器、端口、连线、示例和begin-end块等元素的名称,是赋给对象的唯一的名称。标识符可以是字母、数字、$符和下划线“_”字符的任意组合序列。定义标识符规则:①首字符不能是数字,必须以字母或下划线“_”开头。②字符数不能多于1024。③标识符区分大小写。④不要与关键字同名。例如ina、inb、adder、adder8、name_adder是正确的,而1a?b是错误的。(6)关键字关键字是VerilogHDL预先定义的专用词。在IEEE标准——VerilogHDL1364-1995中规定了102个关键词,都采用小写形式。关键词有其特定和专有的语法作用,用户不能再对它们做新的定义。滑睹复胯挂肪黄探哲镍馋尚茁基助啤余踊半整储恕娃着冤质维颇眠筐账辖FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)(4)字符串滑睹复胯挂肪黄探哲镍馋尚茁基助啤余踊半整储恕娃着49关键字AlwaysandAssignattributeBeginBufBufif0Bufif1CaseCasexCasezCmosDeassignDefaultdefparamDisableedgeelseendendattributeendcaseendfunctionendmoduleendprimitiveendspecifyendtableendtaskeventforforceforeverforkfunctionhighz0highzlifinitialinoutinputintegerjoinlargemacromodulemediummodulenandnegedgenmosnornotnotif0notifloroutputparameterpmosposedgeprimitivepull0pull1pulldownpulluprcmosrealrealtimeregreleaserepeatrtraniflscalaredsignedsmallspecifyspecpramstrengthstrong0strong1supply0supply1tabletasktimetrantranif0tranif1tritri0tri1triandtriortritegunsignedvectoredwaitwandweak0weak1whilewireworxnorxor植累萌画擞绚港卫框斌撰鸿匆狭扩鞭蛊苍姑酝项偷谎厄婴娄丽硷者狞生藤FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)关键字Alwaysandelsehighzlnotiflrt50

(7)变量变量是在程序运行时其值可以改变的量。在VerilogHDL中,变量分为网络型(netstype)和寄存器型(registertype)两种。①网络型变量nets型变量是输出值始终根据输入变化而更新的变量,一般用来定义硬件电路中的各种物理连线。VerilogHDL提供了多种nets型变量。常见的nets型变量及说明类型功能说明wire、tri连线类型(两者功能完全相同)wor、trior具有线或特性的连线(两者功能一致)wand、triand具有线与特性的连线(两者功能一致)tri1、tri0分别为上拉电阻和下拉电阻supply1、supply0分别为电源(逻辑1)和地(逻辑0)s1s2s3谋许贫储种潮郡沦绝履牲壕车戎淫佯串态塘贿丈达熏迈扶肉美忠障搪扔盯FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)(7)变量类型功能说明wire、tri连线类型(两者功51

②寄存器型变量register型变量是用来描述硬件系统的基本数据对象。作为一种数值容器,可以容纳当前值,也可以保持历史值。与寄存器的记忆功能相对应,可以作为模块各器件间的信息传递通道。register型变量与wire型变量的区别在于register型变量需要被明确的赋值,并且在重新赋值前一直保持原值。register型变量是在always、initial等过程语句种定义,并通过过程语句赋值。常见的register型变量及说明类型功能说明reg常用的寄存器型变量integer32位带符号整数型变量real64位带符号实数型变量time无符号时间型变量谭卜搅樱申麓胰命毋葵疆介恫返萨才哗簇驳起柏层予市扮弱恫俗蛹伯哆裤FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)②寄存器型变量类型功能说明reg常用的寄存器型变量i52三、VerilogHDL的语句VerilogHDL的语句包括赋值语句、条件语句、循环语句、结构声明语句和编译预处理语句等类型,每一类语句又包括几种不同的语句。在这些语句中,有些语句属于顺序执行语句,有些语句属于并行执行语句。(1)赋值语句在VerilogHDL中,赋值语句常用于描述硬件设计电路输出与输入之间的信息传送,改变输出结果。VerilogHDL有4种赋值方法:门基元、连续赋值、过程赋值和非阻塞赋值。①门基元赋值语句门基元赋值语句的格式为:基本逻辑门关键字(门输出,门输入1,门输入2,…,门输入n);例如4输入与非门的门基元赋值语句为

nand(y,a,b,c,d);//与语句assigny=~(a&b&c&d)等效挺贞剪杂狄真耻尤尼阁蒋供坑髓渡肆仿钻阳斧效诬果霉垒商卵孔扬块钒俱FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)三、VerilogHDL的语句挺贞剪杂狄真耻尤尼阁蒋供坑53

②连续赋值语句连续赋值语句的关键字assign,赋值符号是“=”,赋值语句的格式为

assign赋值变量=表达式;例如

assigny=~(a&b&c&d);连续赋值语句的“=”两边的变量都应该是wire型变量。在执行中,输出y的变化跟随输入a、b、c、d的变化而变化,反映了信息传送的连续性。连续赋值语句用于逻辑门和组合逻辑电路的描述。例1四输入端与非门的VerilogHDL源程序module

example1(y,a,b,c,d);outputy;inputa,b,c,d;assign#1y=~(a&b&c&d);

//#1表示输出与输入信号之间具有1个单位的时间延迟

endmodule奄沛失擒锚补抠疑鄙狙隙舆制坐纳赞衰熊黎壤猖桌芦范柞丸叙再腆胃操触FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)②连续赋值语句奄沛失擒锚补抠疑鄙狙隙舆制坐纳赞衰熊黎壤猖54

③过程赋值语句过程赋值语句出现在initial和always块语句中,赋值符号是“=”,语句格式为:

赋值变量=表达式;过程赋值语句“=”左边的赋值变量必须是(寄存器)reg型变量,其值在该语句结束时即可得到。如果一个块语句中包含若干条过程赋值语句,按顺序一条一条执行,前面的语句没完成,后面的语句就不能执行。因此,过程赋值语句也称为阻塞赋值语句。菲评系凹校蚂褂格搁罢贪佯荡沼琢核御阀硼灵允针揩奖术苯侵舰其坟晃凰FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)③过程赋值语句菲评系凹校蚂褂格搁罢贪佯荡沼琢核御阀硼灵允55

④非阻塞赋值语句非阻塞赋值语句也是出现在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源程序

module

D_FF(q,d,clock);inputd,clock;//属于wire型变量outputq;//属于reg型变量regq;always@(posedgeclock)q<=d;

endmodule危跃井悸椒珊甫拢溢药晋丫钳念曙檬滴甭筏幸青置乍舷罕陀瘸淀汾檀晌绦FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)④非阻塞赋值语句危跃井悸椒珊甫拢溢药晋丫钳念曙檬滴甭筏幸56

(2)条件语句条件语句包含if语句和case语句,它们都是顺序语句,应放在always块中。①if语句完整的VerilogHDL的if语句结构如下:if(表达式)begin语句;endelseif(表达式)begin语句;endelsebegin语句;end在if语句中,“表达式”是逻辑表达式或关系表达式,也可以是位宽为1位的变量。系统对表达式的值进行判断,若为0,x,z按“假”处理;若为1,按“真”处理,执行指定的语句。纬存鲍秧绽霓姿恳劲仆躇喧酱分稼元痔孺榨庐进然宋砚共掩远理颈宽蘸每FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)(2)条件语句纬存鲍秧绽霓姿恳劲仆躇喧酱分稼元痔孺榨庐进然57

例38线-3线优先编码器的设计8线-3线优先编码器的功能表

module

code(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;end

endmodule输入输出in0in1in2in3in4in5in6in7out2out1out0xxxxxxx0xxxxxx01xxxxx011xxxx0111xxx01111xx011111x011111101111111111110101100011010001000燎艘臆凭湃蛋接候课江渭峰彪鹃兽抚粱一辖匈扔蚕掣蔑砸潦章飘国猫红属FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)例38线-3线优先编码器的设计输入输出in0in158

②case语句case语句是一种多分支的条件语句,case语句的格式为:

case(表达式)选择值1:语句1;选择值2:语句2;…选择值n:语句n;default:语句n+1

endcase执行case语句时,首先计算表达式的值,然后执行条件句中相应的“选择值”的语句。当所有的条件句的“选择值”与表达式的值不同时,则执行“default”后的语句。default可以省略。case语句多用于数字系统中的译码器、数据选择器、状态机及微处理器的指令译码器等电路的描述。辅挺她波叔姆膏呻家噎戈胆弯别彦巾颖虎湃儿侣纬丫哉坚捂昭嗜蛰近斩葫FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)②case语句辅挺她波叔姆膏呻家噎戈胆弯别彦巾颖虎湃59

例4:用case语句描述4选1数据选择器控制信号s1,s2有4种组合,控制a,b,c,d中的一个数据送到输出端。4选1数据选择器VerilogHDL的描述如下:

module

mux41(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;endcaseend

endmodulecase语句还有两种变体形式,casez和casex语句。与case语句的区别是不考虑语句中的高阻z和未知x的那些位,只关注其他位的比较结果。s1s2z00011011abcd4选1数据选择器功能表楞茎扣呼况蓑谤骨衔女重衣尿搀巢暗达檄烛夺荔兢秧馈厉端太组瑶叛婆铣FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)例4:用case语句描述4选1数据选择器s1s2z60

(3)循环语句循环语句包含for语句、repeat语句、while语句和forever语句4种。①for语句for语句的格式为:

for(循环指针=初值;循环指针<终值;循环指针=循环指针+步长值)begin语句;endfor语句可以是一组语句重复执行,语句中的参数一般属于整型变量或常量。语句重复执行的次数由语句中的参数确定。即

循环重复次数=(终值-初值)/步长值蕴伪氮馒拣通革拟搂卤罢宁尹畸嫁担潮茨狈医路雕旷取埋参咱仿臻及邢绒FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)(3)循环语句蕴伪氮馒拣通革拟搂卤罢宁尹畸嫁担潮茨狈医路61

例5:8位奇偶校验器的描述用a表示输入信号,长度为8位的向量。在程序中,用for语句对a的值,逐位进行模2加运算(即异或XOR),循环指针变量n控制模2加的次数。11100110奇数个1循环变量的初值为0,终值为8,因此,控制循环共执行了8次。例5用VerilogHDL对8位奇偶校验器的描述如下:

module

test8(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];//异或end

endmodule蹄驻坍傻赴涕擂塞炯猛寝此卒粱遭柠赏颠诱豢葛虹郧栈得闲爱拨仍冰堂佳FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)例5:8位奇偶校验器的描述蹄驻坍傻赴涕擂塞炯猛寝此卒62

②repeat语句repeat语句的语法格式为:

repeat(循环次数表达式)语句;例6用repeat语句实现8位奇偶校验器的描述如下:

module

test8_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;endend

endmodule

//MAX+plusII软件不支持repeat语句,但synplify软件支持。淑爹您岔庄鸿苛咆挟翟轧瘴扩猜穆蕊盆嘲湖纬稽鸟咏烁八粗硅冗修湃愉惠FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)②repeat语句淑爹您岔庄鸿苛咆挟翟轧瘴扩猜穆蕊盆63

③while语句while语句的语法格式为:

while(循环执行条件表达式)begin重复执行语句;修改循环条件语句;endwhile语句在执行时,首先判断循环执行条件表达式是否为真。若为真,则执行其后面的语句;若为假,则不执行,表示循环结束。为了使语句能够结束,在循环执行的语句中必须包含一条能改变循环条件的语句。④forever语句forever语句的语法格式为:

foreverbegin语句;endforever是一种无穷循环控制语句,它不断地执行其后的语句或语句块,永远不会结束。Forever语句常用来产生周期性的波形,作为仿真激励信号。例如产生时钟clk的语句为:

#10forever#10clk=!clk;

//#10表示输出与输入信号之间具有10个单位的时间延迟,!clk取非派港耗斤盔棍茅全理涧攻乳瞪举铝甲梭妓肠棕醇方尼枫比哀径佬阉妙板荆FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)③while语句派港耗斤盔棍茅全理涧攻乳瞪举铝甲梭妓64

(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的下降沿触发的。冗官习绷绣争医核罐皮椒杆蚂溶潜扰园损霖贼苦很惶室罚敲独伺岭谍排屋FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)(4)结构声明语句冗官习绷绣争医核罐皮椒杆蚂溶潜扰园65

②initial语句initial语句的语法格式为:

initialbegin语句1;语句2;…;endinitial语句的使用次数是不受限制的,但块内的语句仅执行一次,因此initial语句常用于仿真中的初始化。凑搬热斑袜赊自丁丢抡欠肛陆垒馒健咱匿聋澡镑尚摔礼涩咽粘斌绞妇奥胳FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)②initial语句凑搬热斑袜赊自丁丢抡欠肛陆垒馒健66

③task语句在VerilogHDL模块中,task语句用来定义任务。任务类似高级语言中的子程序,用来单独完成某项具体任务,并可以被模块或其他任务调用。利用任务可以把一个大的程序模块分解成为若干小的任务,使程序清晰易懂。可以被调用的任务必须事先用task语句定义,定义格式如下:

task

任务名;端口声明语句;类型声明语句;begin语句end

endtask任务定义与模块(module)定义的格式相同,区别在于任务是用task-endtask语句来定义,而且没有端口名列表。例如,8位加法器的任务定义如下:

task

adder8output[7:0]sum;outputcout;input[7:0]ina,inb;inputcin;assign{cout,sum}=ina+inb+cin;

endtask驾吐彩撇丰培茹由釉袄出插禽尽拓娃填伐讥喜戚焊擅很烹镣津糖恰先舱霖FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)③task语句驾吐彩撇丰培茹由釉袄出插禽尽拓娃填伐67任务调用的格式如下:

任务名(端口名列表);例如8位加法器任务调用

adder8(tsum,tcout,tina,tinb);使用任务时,需要注意几点:(1)任务的定义和调用必须在同一个module模块内。(2)定义任务时,没有端口名列表,但要进行端口和数据的声明。(3)当任务调用时,任务被激活。任务调用与模块调用一样,通过任务名实现,调用时需列出端口名列表,端口名和类型必须与任务定义的排序和类型一致。例如8位加法器任务调用时的端口名列表中的tsum、tcout、tina、tinb端口,与任务定义中的端口sum、cout、ina、inb排序和类型保持一致。(4)一个任务可以调用别的任务或函数,可调用的任务和函数的个数不受限制。蒸蛛硼答惋纤熟车挎满逗拣甸镁耗础忿艰客粹首托掣伍灾崩诚拎谦书眷悄FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)任务调用的格式如下:蒸蛛硼答惋纤熟车挎满逗拣甸镁耗础忿艰客粹68

④function语句在VerilogHDL模块中,function语句用来定义函数。函数类似高级语言中的函数,用来单独完成某项具体操作,并可以作为表达式中的一个操作数,被模块或任务及其他函数调用,函数调用时返回一个用于表达式的值。可以被调用的函数必须事先定义,函数定义格式如下:

function[最高有效位:最低有效位]函数名;

端口声明语句;类型声明语句;begin语句;end

endfunction在函数定义语句中,“[最高有效位:最低有效位]”是函数调用返回值位宽或类型声明。完骸每绪设蛔彭误般裤介糟馆坊欣津奥辖足嘿潍炭葛甸疥无荔丙以像狄醇FPGA技术教程(通俗易懂)FPGA技术教程(通俗易懂)④function语句完骸每绪设蛔彭误般裤介糟馆坊欣津69

例8求最大值的函数

function[7:0]max;input[7:0]a,b;beginif(a>=b)max=a;elsemax=b;end

endfunction函数调用的格式如下

函数名(关联参数表);函数调用一般是出现在模块、任务或函数语句中。通过函数的调用来完成摹写数据的运算

温馨提示

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

评论

0/150

提交评论