版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数字电路的FPGA设计与实现——基于QuartusPrime和VerilogHDLFPGADesignandImplementationofDigitalCircuits——BasedonQuartusPrimeandVerilogHDL第1讲FPGA基础概念1第1讲-FPGA基础概念第2讲-FPGA开发平台和工具第3讲-VerilogHDL语法基础第4讲-集成逻辑门电路功能测试第5讲-基于原理图的简易数字系统设计第6讲-基于HDL的简易数字系统设计第7讲-编码器设计第8讲-译码器设计第9讲-加法器设计第10讲-比较器设计第11讲-数据选择器设计第12讲-触发器设计第13讲-同步时序逻辑电路分析与设计第14讲-异步时序逻辑电路分析与设计第15讲-计数器设计第16讲-移位寄存器设计第17讲-数模和模数转换实验全套可编辑PPT课件
什么是FPGAWhatisFPGA“
FPGA(FieldProgrammableGateArray)中文名称为现场可编程门阵列,是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物,是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数量有限的缺点。简而言之,FPGA就是一个可以通过编程来改变内部结构的芯片。1.12FPGA与MCU3读取指令分析指令执行指令程序程序指令MCUFPGA×N程序工作设计图纸外部配置FLASHFLASHSRAM应用场景4通信领域数字信号处理领域视频图像处理领域高速接口设计领域医学成像领域IC验证领域——实现无线通信中的高速数字信号处理、高速通信协议处理
——FIR等重复性数字滤波、高速并行的数字信号处理任务
——处理对图像稳定性、清晰度、亮度和颜色要求较高的图像数据——实现不同的接口逻辑,减少专用接口芯片数量
——超声、核磁共振等成像的高频采样、各种影像算法的处理——把IC的代码移植到FPGA上生成接近真实IC芯片的电路,验证IC设计FGPA基本结构BasicstructureofFGPA“
FPGA的基本结构包括可编程输入输出单元,基本可编程逻辑单元,布线资源,全局时钟资源,嵌入式块RAM,内嵌的底层功能单元,内嵌专用IP单元。1.25基本结构——可编程输入输出单元(IOB)6
可编程输入/输出单元(IOB)是芯片与外界电路的接口部分。为了便于管理和适应多种电器标准,FPGA的IOB被划分为若干个组(Bank),每个Bank的接口标准由其接口电压决定,一个I/OBankX只能有一种VCCIOX,但不同Bank的VCCIOX可以不同。目前大多数FPGA的I/O单元被设计为可编程模式,即通过软件的灵活配置,可适应不同的电器标准与I/O物理特性。基本结构——基本可编程逻辑单元(CLB)7
基本可编程逻辑单元主要由查找表和寄存器组成的。其中,查找表完成组合逻辑功能,寄存器可配置为带同步/异步复位和置位、时钟使能的触发器,也可以配置成为锁存器,用于完成时序逻辑功能。一般来说,比较经典的基本可编程单元的配置是一个寄存器加一个查找表,但不同厂商的寄存器和查找表的内部结构有一定的差异,组合模式也各不相同。基本结构——查找表(LUT)8
查找表(Look-Up-Table)简称为LUT,其本质上就是一个RAM。目前FPGA内部中多使用4输入的LUT,每一个LUT可以看成一个有4位地址线的RAM。当通过原理图或硬件描述语言设计了一个逻辑电路以后,FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(即结果)事先写入RAM中。这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查找表操作,通过地址找到对应的RAM中的结果,最后将其输出。基本结构——布线资源9
在FPGA芯片内部有着丰富的布线资源,连通了内部的所有单元,其长度和工艺决定着信号在连线上的驱动能力和传输速度。根据工艺、长度、宽度和分布位置的不同而划分为4类不同的类别:全局布线资源、长线资源、短线资源及分布式的布线资源。基本结构——全局时钟资源10
FPGA器件的时钟信号源一般来自外部,通常使用晶体振荡器(简称晶振)产生时钟信号。全局时钟是FPGA内的一种时钟网络,可以覆盖FPGA中各种资源的时钟输入,为其提供高频、低抖的时钟信号。
CycloneIVE器件提供了多达15个专用时钟管脚(CLK[15..1]),以用于驱动全局时钟(GCLKs)。这些时钟管脚能够驱动高达20个GCLK。基本结构——嵌入式块RAM(BRAM)11
块RAM是FPGA内部一种SRAM结构的块状存储器,以阵列的方式排布于FPGA的内部,是实现各种存储功能的主要部分,可被配置为ROM、RAM、内容地址存储器(CAM)以及FIFO等常用存储结构。使用BRAM时不会占用额外的逻辑资源,并且读写速度非常快,但是使用时消耗的BRAM资源只能是其块大小的整数倍,就算只存了1bit的数据也要占用一个块RAM的资源。在实际应用中,块RAM的数量也是选择芯片的一个重要因素。基本结构——内嵌专用IP单元12
内嵌专用IP单元指的是由FPGA厂商预先设计好,经过严格测试和优化过的软核IP和硬核IP。如DLL、PLL、DSP、CPU等通用程度较高的软核,以及专用乘法器、浮点运算单元、串并收发器等处理能力强大的专用硬核。这些丰富的内嵌专用IP单元,使得FPGA成为了系统级的设计工具,逐步具备了软硬件联合设计的能力,性能和应用场景得到了进一步的提升。基本结构13电源定义Definitionofpowersupply“
FPGA涉及的电源有很多,其中,数字电路实验用到的CycloneIVE芯片的电源主要有内核电源VCCINT,I/O供电电源VCCIO,PLL模拟电源VCCA和PLL数字电源VCCD_PLL这几部分,这里主要介绍内核电源和I/O供电电源。1.314内核电源VCCINTVCCINT是FPGA芯片的内核电压是用来给FPGA内部的逻辑门和触发器上的电压。即芯片的晶体管开关是由核心电压提供。当内部逻辑工作时钟速率越高使用逻辑资源越多,则核心电压供电电流会更大,可高达几安,此时芯片必然会发烫,需要散热装置辅助散热。随着FPGA的发展,核心电压可支持的电源输入从5V减小到了现在的1.2V,由核心电压引起的芯片发烫、功耗等也变的越来越低。15163I/O供电电源VCCIOVCCO用于FPGA驱动IO模块的电压,因为FPGA经常要与多种不同电平接口的芯片通信,所以都会支持非常多的电平标准,为此,VCCO通常以Bank为界,相互之间是独立的,即一个Bank块只能存在一种IO电压,每个I/OBnak可以与一种电平芯片通信,如VCCIO3接3V3的电源,与之对应的Bank3引脚便与3.3V电平的器件通信,
VCCIO4接1.5V,Bank4的引脚则与1.5V电平的器件通信。16数据存储及配置模式Datastorageandconfigurationmethods“1.417数据存储的载体
在FPGA内部,用来作为数据存储的载体主要有3种,分别是触发器、查找表和块RAM。触发器:可以在非时钟有效沿期间记忆并保持某个状态,主要用于时序逻辑电路中;查找表:也被称为分布式RAM,一般用于保存组合逻辑的真值表,实现组合逻辑的功能;块RAM:FPGA实现各种存储功能的主要部分,可以配置为ROM、RAM、FIFO以及STACK等常用存储结构。如果外部有大量数据交互时,就要通过增加外设来对数据进行暂时性的存储,如SDRAM存储器或者DDR3存储器,暂存在外设中的数据最终也要通过FPGA内部的RAM进行存储与处理。18编程数据的存储
FPGA的编程数据一般存储在块RAM中的SRAM单元里,在运行时,FPGA会将编程信息读出,根据信息配置好硬件资源后,FPGA便开始工作;由于SRAM掉电就会丢失内部数据,因此往往都会外接一个能够掉电保存数据的片外存储器以保存程序。这样一来,上电时FPGA便将外部存储器中的数据读入片内RAM以完成配置,对FPGA编程完成后便进入工作状态;掉电后FPGA内部SRAM中存储的数据丢失,逻辑清零。以这种方式配置FPGA不仅能反复使用,还无需重复的手动配置。完成一次主动配置之后每次上电便会自动的实现FPGA的内部编程。19配置模式
FPGA的配置方式灵活多样,根据芯片是否能够自己主动加载配置数据可分为主模式、从模式以及JTAG模式。主模式:由FPGA内部产生时钟,从片外FLASH中加载配置所需的比特流,读入到SRAM中,实现内部结构映射。从模式:FPGA作为从设备,微处理器控制器或或者其他终端提供配置所需的时序,实现配置数据的下载。JTAG模式:通过JTAG将PC中的比特文件流下载到FPGA中进行调试,断电即丢失。20开发流程Developmentprocess“1.521
FPGA的设计流程就是利用EDA开发软件和编程工具对FPGA芯片进行开发的过程。原理图和HDL(Hardwaredescriptionlanguage,硬件描述语言)是两种最常用的数字硬件电路描述方法。其中,运用HDL设计方法具有更好的移植性、通用性以及利于模块划分的特点,在工作学习中被广泛使用。HDL语言
HDL(HardwareDescripTIonLanguage)语言又称为硬件描述语言,是一种用文本的方式把硬件电路描述出来的语言。目前最主要的硬件描述语言是VHDL和VerilogHDL。VHDL发展的较早,语法严格,而VerilogHDL是在C语言的基础上发展起来的一种硬件描述语言,语法较自由。我们在阅读HDL程序的时候,在脑子里应该能反映出一个完整的硬件电路结构。也就是说,我们在编写HDL语言之前,就要对需要实现的电路有清晰的概念。所以HDL语言只是一个描述我们头脑中具体电路的工具,掌握FPGA的根本不是语言而是逻辑电路的设计。22基于HDL的开发流程
典型FPGA的开发流程一般先通过系统功能设计,然后通过VHDL/VerilogHDL硬件描述语言进行RTL级HDL设计,然后进行RTL级仿真、综合、门级仿真、布局布线和时序仿真等步骤,最后生成下载配置文件,下载到FPGA中进行板级调试。23第2讲-FPGA开发平台和工具24数字电路的FPGA设计与实现——基于QuartusPrime和VerilogHDLFPGADesignandImplementationofDigitalCircuits——BasedonQuartusPrimeandVerilogHDLEP4CE15F23C8N芯片介绍IntroductiontoEP4CE15F23C8N“2.125EP4CE15F23C8N芯片
EP4CE15F23C8N芯片是Altera的低成本、低功耗CycloneIV系列FPGA,它建立在成熟的60纳米低功耗工艺之上,只需要两路电源供电,简化了电源分配网络,降低电路板成本,减小了电路板面积,缩短了设计时间。
CycloneIV系列FPGA提供了从6272到114480逻辑单元的扩展密度,架构包括多达115K垂直排列的LE,4Mbit的嵌入式存储器(按9Kbit(M9K)块排列)以及266个18×18嵌入式乘法器。26FPGA高级开发系统FPGAAdvancedDevelopmentSystem“2.227LY-EP4CM型FPGA高级开发系统
LY-EP4CM型FPGA高级开发系统上的核心板通过两个连接器将148个可用I/O引出给平台上的外设使用,剩下的用于核心板上的外扩SDRAM、配置FLASH及JTAG下载等。28拨动开关电路
拨动开关电路在数字电路实验中主要用于作为二进制编码输入的控制,以SW0为例,SW0的公共端(2号引脚)经限流电阻后连接到SW0网络,当SW0上拨时,公共端与3号引脚的KEY_+3V3相连,SW0输出为高电平,同时,SW0又与芯片引脚相连,即引脚输入为1;反之,当SW0下拨时,公共端与1号引脚的GND相连,引脚输入为0,从而实现了数字电路0/1的编码输入控制。29LED电路
LED电路在数字电路实验中用于作为二进制编码输出的显示,以LED0为例,LED0的负极一端与GND相连,正极一端经过一个限流电阻后连接到LED0网络,而LED0网络又与芯片引脚相连,因此,当引脚输出为1时,LED0网络输入一个高电平,LED0便会被点亮;反之,当引脚输出为0时,LED0则会熄灭,从而利用LED实现了数字电路0/1的编码输出显示。30独立按键电路
独立按键电路在数字电路实验中的主要作用是作为系统按键来使用的,在数模和模数转换实验中主要用于设置波形。以KEY1为例,当KEY1未按下时,KEY1网络与高电平相连,芯片引脚为高电平;当KEY1按下时,KEY1网络与GND相连,引脚为低电平,由此便可以通过读取V5引脚的电平来判断按键是否按下。31七段数码管电路
七段数码管电路在数字电路中用于作为数字或简单字符的显示,以七段数码管U502的电路为例,U502是一个4位共阳型七段数码管,通过12个引脚可以控制数码管每一位的点亮与熄灭,其中,引脚6、8、9、12为位选引脚,分别用于控制SEL0~SEL3哪一位数码管点亮,其余8个数据引脚则用于控制数码管的哪一段被点亮。32D/A转换电路
D/A转换电路在数字电路实验中用于将并行二进制的数字量转换为连续变化的直流电压或直流电流,FPGA高级开发系统搭载了以数模转换芯片AD9708为核心的D/A转换电路。33A/D转换电路
A/D转换电路在数字电路实验中用于将连续变化的模拟信号转换为离散的并行二进制数字信号,FPGA高级开发系统搭载了以模数转换芯片AD9280为核心的A/D转换电路。34系统可开展的实验35序号实验名称序号实验名称1集成逻辑门电路功能测试8数据选择器设计2基于原理图的简易数字系统设计9触发器设计3基于HDL的简易数字系统设计10同步时序逻辑电路分析与设计4编码器设计11异步时序逻辑电路分析与设计5译码器设计12计数器设计6加法器设计13移位寄存器设计7比较器设计14数模和模数转换设计软件安装和配置SoftwareInstallationandConfiguration“2.336QuartusPrime简介37
QuartusPrime是Intel公司收购Altera公司后,为Intel可编程逻辑器件CPLD/FPGA开发推出的新版EDA工具,它集成了设计输入、逻辑综合、引脚分配、布局布线、时序仿真、器件编程等FPGA开发工具,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。安装与配置38QuartusPrime20.1的安装与配置安装USBBlaster驱动配置ModelSim第3讲VerilogHDL语法基础39数字电路的FPGA设计与实现——基于QuartusPrime和VerilogHDLFPGADesignandImplementationofDigitalCircuits——BasedonQuartusPrimeandVerilogHDLVerilog模块Verilogmodule“
VerilogHDL是被IEEE认定的国际标准硬件描述语言,模块(module)是VerilogHDL描述数字电路的基本单元,又称建模,它可以表示一个简单的门电路,也可以是功能复杂的电路或系统。每个模块(电路)的描述均以关键词module开始,以endmodule结束(后面不用加分号)3.140模块(module)语法结构module模块名(//端口列表——端口类型-信号类型-位宽-端口名input(输入)
信号类型(wire)
位宽
端口名,
output(输出)信号类型(wire/reg)位宽
端口名,inout(双向)信号类型(wire)
位宽
端口名);//端口定义//内部变量及参数声明;wire,reg,function,task,parameter,define等//功能定义(模块功能实现)数据流描述:assign结构化描述:门级描述或module例化
行为级描述:initial,alwaysendmodule41端口定义举例①moduleled(
inputwireclk_50mhz_i,//时钟输入,50MHz
inputwirerst_n_i,//复位输入,低电平有效
outputwire[3:0]led_o//led输出,共4位);……endmodule②moduleled(clk_50mhz_i,rst_n_i,led_o);
inputwireclk_50mhz_i;//时钟输入,50MHz
inputwirerst_n_i;//复位输入,低电平有效
outputwire[3:0]led_o;//led输出,共4位……endmodule42Verilog模块举例module
EasyDS(
);
endmodule43
inputwire
a_i,b_i,//2输入a_i,b_i
outputwire
x_o,y_o,z_o
//3输出x_o,y_o,z_o
EasyDSa_ib_ix_oz_oy_o
assignx_o=a_i;
assigny_o=~b_i;//取反
assignz_o=a_i&b_i;//相与标识符定义IdentifierDefinition“
标识符是用于定义常数、变量、信号、端口、子模块或参数名称,是一组由字母、数字、$和下划线任意组合的字符串,并且必须以字母或下划线开头。在VerilogHDL中,标识符对大小写敏感,也就是说大小写不同的标识符被视为不同的名称。此外,VerilogHDL中定义的关键词不能被用作标识符使用。3.244标识符举例①合法标识符:clk_50mhz_irst_n_iled_oLED_OFF//与led_off不同_bus3n$65745②不合法标识符:3sum//不允许数字开头ab@cd//不允许包含字符@a%b//不允许包含%not//关键字不允许做标识符input
//关键字wire
//关键字逻辑值集合Logicalvalueset“
在二进制计数中,单比特逻辑值只有0”和“1”两种状态,而在Verilog语言中,为了对电路了进行确的建模,又增加了两种逻辑态,即“X”和“Z”。其中,0表示逻辑低电平,1表示逻辑高电平,X表示未知或不确定的电平,Z表示高阻态,X和Z不区分大小写。3.346逻辑值47逻辑0:表示低电平,也就对应电路中的GND、VSS逻辑1:表示高电平,也就是对应电路中的VCC、VDD逻辑X:表示末知,有可能是高电平,也有可能是低电平逻辑Z:表示高阻态,当外部没有激励信号时,是一个悬空状态,通常用来对三态总线进行建模。常量Constant“在程序运行过程中,其值不能被改变的量称为常量(constants),VerilogHDL中主要有三种类型的常量:整数型常量、实数型常量和字符串型常量。其中,整数型常量是可以综合的,而实数型和字符串型常量是不可综合的。除此之外,还可以用参数的形式来表示常量,即参数型常量。3.448整数型常量
在VerilogHDL中,整数型常量有四种进制表示形式:二进制整数(b或B)、八进制整数(o或O)、十进制整数(d或D)、十六进制整数(h或H)。<符号><位宽>'<进制><数字>
符号为“+”时表示正数,符号项必须省略;位宽和进制是可选项。位宽是指该数据以二进制位计算时的数据长度,当省略位宽项时,表示采用默认位宽(由具体的计算机系统决定,至少32位);当省略进制项时,表示采用默认的十进制表示方式;数字则是基于该进制项时的数值,当值为x、z以及十六进制中的a到f时,不区分大小写。49整数型常量示例504'b1010
//位宽为4的二进制数10104'o7
//位宽为4的八进制数799
//十进制数99,位宽由计算机决定8'h4F
//位宽为8的十六进制数4F-8'd5
//位宽为8的十进制数-5(5的8位二进制补数)26'd49_999_999
//位宽为26的十进制数499999994'b11x0
//位宽为4的二进制数从低位数起第2位为不定值4'b101z
//位宽为4的二进制数从低位数起第1位为高阻值10'dz
//位宽为10的十进制数,其值为高阻值8'h4x
//位宽为8的十六进制数,其低4位值为不定值实数型常量
实数型常量采用十进制法或者科学计数法表示,这种类型用于存储非整数,即有小数部分的数字。实数型常量是不可综合的类型,通常只在VerilogHDL的测试文件中使用。实数型变量用关键字real来声明,声明时不能带有范围,默认值为0。如果将一个实数型常量或变量赋值给一个整数型变量,则该实数值会采用四舍五入的方式将整数部分会赋值给整数型变量。十进制法/科学计数法51实数型常量示例524.5
//十进制数表示4.53.8e-2
//科学计数法表示0.038reals_r=4.49;//声明一个实数型变量s_r,值为4.49,
赋值给整数型变量时为4wire[3:0]a=12.1;
//赋值后a值为12reg
[3:0]b=-12.5;
//赋值后b值为-13字符串型常量
一个字符串(strino)型常量是由英文双引号括起来并包含在一行中的字符序列,不能分成多行进行书写。在表达式和赋值中,用作操作数的字符被视为由8位ASCII值表示的无符号整数常量,每一个8位ASCII值表示一个字符。“字符串序列”53字符串型常量示例54“C”;//字符C“characterstring”;//字符串characterstring当字符串作为变量时,是wire/reg类型的变量,其宽度等于字符串中的字符数乘以8wire[8*14:1]stringvar;//定义了一个14个ASCII值的wire变量,[8*14-1:0]assignstringvar=“Helloworld!”;//字符串参数型常量
为提高程序的可读性和可维护性,在VerilogHDL中,通常使用关键词parameter来定义参数型常量,即用parameter来定义一个标识符代表一个常量,称为符号常量。parameter参数名=表达式;
表达式中只能包含已经定义的参数或者常量数字。55参数型常量示例56
parameterLED0_ON=8'b0001;//LED0点亮
parameterLED1_ON=8'b0010;//LED1点亮
parameterLED2_ON=8'b0100;//LED2点亮
parameterLED3_ON=8'b1000;//LED3点亮
parameterLED_OFF=8'b0000;//全部LED熄灭数据类型DataType“
Verilog中数据类型的作用是表示硬件中的数据存储和传输,总体上数据类型可以分为网络(net)和变量(variable)两类,代表不同的赋值方式和硬件结构。其中,网络表示不同结构实体之间的物理连接,其本身不能存储值,它的值由它的驱动器上的值决定,常用类型为wire型;变量则表示数据存储单元,对其赋值会改变物理上数据存储单元中的值,常用类型为reg型。3.557线网(wire)型
wire型数据常用来表示以assign关键字指定的组合逻辑信号。使用wire定义的变量,主要用于结构化器件之间物理连接建模,不存储逻辑值,必须由器件驱动,通常由assign进行赋值。当一个wire类型的信号没有被驱动时,缺省值为z(高阻)。wire信号名;
//定义一个1位的wire型数据wire[width-1:0]
信号名;
//定义一个位宽为width的wire型数据58wire型示例59outputwire[3:0]led_o;//4bit位宽的led_o,且为输出端口wires_clk_1hz;//1bit位宽的1Hz时钟信号wire[1:0]s_cnt;//2bit位宽的计数信号wire[0:2]s_data;//3bit位宽的数据信号wire
[8*14:1]stringvar;//定义了一个14个ASCII值的wire变量wire[3:-2]s_d;//6bit位宽的信号,s_d[3:0]和s_d[-1:-2]可以用于
表示不同的数据,提高程序的可读性寄存器(reg)型
寄存器是数据存储单元的抽象,寄存器数据类型的关键字为reg。通过赋值语句可以改变寄存器存储的值,其作用相当于改变触发器存储的值,可用于对存储单元如D触发器、ROM存储器的描述。reg 信号名;
//定义一个1位的wire型数据reg[width-1:0]信号名;//定义一个位宽为width的wire型数据注意,reg型数据常用来表示always块中的指定信号,常代表寄存器或触发器的输出,在always语句中进行描述的变量必须申明为reg类型。60reg型示例61outputreg
[3:0]led_o;//4bit位宽的led_o,且为输出端口regs_clk_1hz;//1Hz时钟信号reg[1:0]s_cnt;//计数信号,2位reg
[0:2]s_data;//3bit位宽的数据信号reg
[2:-3]s_d;//6bit位宽的信号,s_d[2:0]和s_d[-1:-3]可以用于
表示不同的数据,提高程序的可读性运算符Operator“
在Verilog中,运算符按所带操作数的个数来区分,可分为三类:只带一个操作数的单目运算符,可带两个操作数的双目运算符以及可带三个操作数的三目运算符。按功能则可分为算数运算符、关系运算符、赋值运算符、位运算符、逻辑运算符、位拼接运算符、条件运算符和移位运算符等。3.662算术运算符
算术运算符用来执行算术运算操作,在进行算术运算操作时,如果某一个操作数有不确定的值x,则整个结果也为不定值x。assignSum=A*8’b0110_11x0;//Sum=x63算术运算符描述+加,A+B-减,A-B*乘,A*B/除,A/B,结果只取整数部分%模除(求余),A%B关系运算符32<45
//结果为Ture(1)4’b1000>5’b10010
//等价于5’b01000>5’b10010,不等式不成立,返回结果为False(0)52<8’hxF
//结果为未知(x)64关系运算符描述(返回结果真/假/未知)==等于,A==B!=不等于,A!=B<小于,A<B>大于,A>B<=小于等于,A<=B>=大于等于,A>=B赋值运算符rega=1’d0;regb=1’d1;regd=1’d0;rege=1’d1;regc,f;assignled_o=0001;65赋值运算符描述=阻塞赋值,用于对参数赋值、赋初始值和在assign语句中赋值,常用于组合逻辑电路对信号进行赋值<=非阻塞赋值,常用于时序逻辑电路对信号进行赋值,常用于以always定义的块语句中。always@(posedgeclk_i)//时钟上升沿触发alwaysbeginb=a;c=b;e<=d;f<=e;
end
//always块结束后,b=c=0,e=0,f=1;位运算符wire[7:0]A=00111100;wire[7:0]B=00001101;assignY1=~B;//取反,Y1=11110010
assignY2=A&B;//与运算,Y2=00001100assignY3=A|B;//或运算,Y3=00111101assignY4=A^B;//异或,Y4=0011000166位运算符描述~按位非,~A&按位与,A&B|按位或,A|B^按位异或,A^B^~按位同或,A^~B逻辑运算符
逻辑运算符用来执行逻辑运算操作。操作数可以是reg和wire类型的数据,无论操作数有多少位,运算结果只有一位,值为0或者1。其中“&&”和“||”是双目运算符(即要求运算符两侧各有一个操作数),其优先级别低于关系运算符,而“!”高于算术运算符。assigny1=!a&&b;//a取反后与b相与
assigny2=!(a||b);//a和b相或的结果取反67逻辑运算符描述!逻辑非,!A&&逻辑与,A&&B||逻辑或,A||B位拼接运算符reg[3:0]x=4'b1100;reg[3:0]y=4'b0010;assignz1={x,y[3],y[2],y[1],y[0]};//z1=8'b11000100assignz2={1'b1,1'b1,1'b0,1'b0,1'b0,1'b0,1'b1,1'b0};//z2=8'b1100001068位拼接运算符描述{,,,}用于位的拼接,将小表达式合并形成大表达式条件运算符条件表达式?表达式1:表达式2//如果条件表达式成立,取值表达式1,否则取值表达式2例:assignz=(a>0)?x:y;//如果a>0,z=x,否则z=y69条件运算符描述?:能够根据条件表达式的值来选择表达式移位运算符70移位运算符描述<<左移,A<<n>>右移,A>>n
其中A代表要进行移位的操作数,n代表要移几位,这两种移位运算都用0来填补移出的空位。此外,左移和右移还可以用于实现乘以2n和除以2n的功能。wire[7:0]A=00111100;//60(D)assignY1=A<<2;//Y1=11110000(B)=240(D),相当于乘以4assignY2=A>>3;//Y2=00000111(B)=7((D),相当于除以8运算符优先级71名称运算符优先级求非、求反~,!高乘、除、取模*,/,%↓加、减+,-移位<<,>>关系<,<=,>,>=等式==,!=按位与&按位异或/同或^,^~按位或|逻辑与&&逻辑或||条件?:低常用语句UsefulSentences“
VerilogHDL语句包括过程语句、块语句、赋值语句、条件控制语句、循环控制语句、编译导向语句、实例引用语句等。其中,较为常用的有assign(赋值语句)、initial和always(过程语句)、if...else和case(条件控制语句)、for和while(循环控制语句)、模块例化(实例引用语句)等。3.772assign语句
assign语句用在数据流描述中,表示对信号赋值。assign相当于连线,将一个信号的值不间断地赋值给另一个信号,或将逻辑表达式赋值给信号变量。assign语句常用于组合逻辑电路的建模中,只能对线网型(wire型)信号变量赋值。assignwire型变量=表达式;当右边表达式的变量值或运算结果发生变化时,等式右边的值便会被更新赋值给左边的wire型变量,例如将产生的时钟信号s_clk赋值给时钟输出clk_o。assignclk_o=s_clk;//clk_o随s_clk的变化而变化73initial语句
initial语句主要用于VerilogHDL的测试文件中,用来产生测试环境和设置信号记录,如果在某一条语句前面存在延迟#<delay>,那么这条initial语句的仿真将会停顿下来,在经过指定时长的延迟之后再继续执行,延迟时长与timecale定义的时延单位有关,一个模块中可以有许多个initial块,它们都是并行运行的,且initial语句只执行一次。74initialbegin
语句1语句2…语句nend;initial语句示例75`timescale
1ns/1ps…//端口定义、信号定义等initialbegina=1'b1;#10
a=1'b0;//延迟10ns后a值由1变为0,即高电平信号持续了10nsendalways语句
always语句几乎在所有的时序逻辑设计中都会使用,“敏感事件列表”用于触发always语句的执行,符合触发条件便可以一直重复执行。只有reg类型数据能够在这种语句中被赋值,reg类型数据在被赋新值前保持原有值不变。一个模块可以包含多个always块,它们都是并行执行的。76always@(敏感事件列表)begin
代码部分(详细电路设计)end;always语句示例77
always@(posedges_clk_1hz)
//在s_clk_1hz的上升沿触发
begins_data<={s_rx_data,s_data[7:1]};//逻辑右移s_cnt<=s_cnt+1'b1;//计数end条件控制语句——if...else语句
if...else语句用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的几种操作之一。if...else语句是顺序执行语句,不能单独使用,需要在always块语句中才能使用。78if(表达式1)begin
逻辑电路1endelseif(表达式2)
begin
逻辑电路2end…elsebegin
逻辑电路nendif...else语句示例79always@(posedges_clk_1hzor
negedgerst_n_i)//在s_clk_1hz的上升沿和rst_n_i的下降沿触发beginif(rst_n_i==0)s_cnt<=
2'b0;elseif(s_cnt>=CNT_MAX)s_cnt<=2'b0;else
s_cnt<=s_cnt+1'b1;end条件控制语句——case语句
case语句是多分支选择语句,同样也是顺序执行语句,不能单独使用,要在always语句中使用。80case(控制表达式)分支表达式1:begin
逻辑电路1end分支表达式2:begin
逻辑电路2end
…default:begin
逻辑电路nendendcasecase语句示例81always@(s_cnt)begincase(s_cnt)
2'b00:led_o=LED3_ON;
2'b01:led_o=LED2_ON;
2'b10:led_o=LED1_ON;
2'b11:led_o=LED0_ON;
default:led_o=LED_OFF;endcaseend循环控制语句——for循环语句
for循环语句可以根据指定的条件执行代码块多次,从而大大提高了编程效率。for循环语句可以用来实现以下基本功能:a.重复执行特定的语句或者语句块;b.在满足特定条件时跳出循环;c.根据指定的步长迭代循环变量。for循环语句同样也是顺序执行语句,不能单独使用,要在always语句中使用。82for(初始条件;循环条件;步长)begin
循环体endfor循环语句示例83reg[7:0]s_data;reg[2:0]s_count;integeri;always@(s_data)begins_count=3’b000;for(i=0;i<8;i=i+1)beginif(s_data[i]==0)begin
s_count=s_count+1;endendend循环控制语句——while循环语句
while循环语句首先判断循环条件表达式是否为真,若为假,则其后的语句一次也不执行。在循环语句中,必须有一条改变循环执行条件表达式值的语句,类似于for循环语句中的步长部分。while语句同样不能单独使用,要在always语句中使用。84while(循环条件)begin
循环体endwhile循环语句示例85reg[7:0]s_data;reg[2:0]s_count;integeri;always@(s_data)begins_count=3’b000;i=0;while(i<8)
begin
if(s_data[i]==0)
begins_count=s_count+1;
endi=i+1;endend模块例化语句
FPGA逻辑设计中通常是一个大的模块中包含了一个或多个功能子模块,通过模块调用或称为模块实例化的方式来实现这些子模块与高层模块的连接有利于简化每一个模块的代码,易于维护和修改。Verilog模块的例化有两种方式,一种是基于端口位置来例化模块,另一种则是根据端口名称来例化。86模块名例化名(
.模块端口1(与端口1连接的信号1/留空),.模块端口2(与端口2连接的信号2/留空),....模块端口n(与端口n连接的信号n/留空));模块名例化名(信号1,信号2,...,信号n);//信号与该模块声明时对应位置的端口相连,未连接的端口则在两个逗号间加上空格模块例化语句示例87moduleclk_gen_1hz(
inputwireclk_i,//时钟输入,50MHz
inputwirerst_n_i,//复位输入,低电平有效
outputwireclk_o//时钟输出,1Hz);
......endmodule
//被调用的模块moduleled(
inputwireclk_50mhz_i,//时钟输入,50MHz
inputwirerst_n_i,//复位输入,低电平有效
outputreg[7:0]led_o//8位流水灯输出);
wires_clk_1hz;//1Hz时钟信号
reg[2:0]s_cnt=3'b000;//计数信号,3位,初始值为000clk_gen_1hzu_clk_gen_1hz(.clk_i(clk_50mhz_i),.rst_n_i(rst_n_i),.clk_o(s_clk_1hz));//clk_gen_1hzu_clk_gen_1hz(clk_50mhz_i,rst_n_i,s_clk_1hz);......endmodule描述方法DescriptionMethod“
VerilogHDL语句对电路功能的描述有三种方式,分别是数据流描述、结构化描述、行为级描述。三种描述方式抽象级别不同,各有优缺点,相辅相成,需要配合使用。下面以二选一数据选择器模块的实现来分别介绍三种不同的描述方法。3.888二选一数据选择器——真值表、逻辑表达式、电路图89输入输出SY0D01D1
数据流描述
数据流描述使用连续赋值语句(assign语句)对电路的逻辑功能进行描述,该描述方法用于组合逻辑电路的实现。组合逻辑电路的信号传输其实就类似于数据的流动,数据从中经过但是不会存储,一旦输入改变,输出随之改变。90modulemux2to1_dataflow(
inputwireD0,D1,//输入数据定义
inputwireS,//输入选择信号定义
outputwireY//输出信号定义);
//门电路逻辑表达式
assignY=((~S)&D0)|(S&D1);endmodule结构化描述——门级描述
结构化描述是在描述中按照层级电路的结构形式使用已有的或者已经写好的功能模块对电路进行描述。其中,使用门级原语描述的方式为门级描述,使用自定义功能模块描述的方式为结构级描述。91modulemux2to1_gatelevel(
inputD0,D1,S,//输入数据定义
outputY//输出信号定义);
wires_not,and1,and2;//定义内部信号notU1(s_not,S);//调用非门元件
andU2(and1,s_not,D0);//调用与门元件
andU3(and2,S,D1);
orU4(Y,and1,and2);//调用或门元件endmodule结构化描述——结构级描述92modulemux2to1_gatelevel(
inputD0,D1,S,//输入数据定义
outputY//输出信号定义);
wires_not,s_and1,s_and2;//定义内部信号
notA
U1(S,s_not);//调用非门元件
AandBU2(s_not,D0,s_and1);//调用与门元件
AandB
U3(S,D1,s_and2);
AorB
U4(s_and1,s_and2,Y);//调用或门元件endmodule//自定义非门模块module
notA(
input
wireA,
outputwireY);
assignY=~A;endmodule//自定义与门模块module
AandB(inputwireA,B,
outputwireY);
assignY=A&B;endmodule//自定义或门模块module
AorB(
inputwireA,B,
outputwireY);assignY=A|B;endmodule行为级描述
行为级(Behavioral)描述是最抽象的一种描述方法,也称寄存器传输级描述,使用always语句或initial语句对电路进行描述。93modulemux2to1_behave(
inputwire
D0,D1,S,//输入端口声明
outputregY//输出端口声明);
always@(S,D0,D1)
begin
if(S==1)Y=D1;
elseY=D0;
endendmodule抽象级别94结构化描述:抽象级别最低、最接近于实际硬件结构,可以通过Verilog的形式来描述电路都需要哪些元器件以及器件之间的连接关系数据流描述:比结构化描述抽象级别高、可以比较直观的表达底层逻辑的行为行为级描述:抽象级别最高、概括能力最强,规模稍大的设计往往都以行为级描述为主可综合与不可综合Comprehensiveandnocomprehensive“3.995综合的概念综合是根据Verilog描述的RTL级的电路模型构造出门级网表的过程。综合只是个中间步骤,综合后生成的网表文件,就是由导线相互连接的寄存器传输级功能块(像是触发器、算术逻辑单元和多路选择器等)组成的电路逻辑网络,将其烧录进FPGA后,可以找到与之对应的硬件元件。综合器就是能自动实现上述转换的软件工具,能将原理图或者HDL语言描述的电路功能转化为具体电路网表的工具。96什么是不可综合?
Verilog有不同的抽象层次,可以从门级、RTL级、行为级以及算法级进行建模。但并不是所有层次上的描述方式都可以被综合成想要的硬件元件,即有些语法是不可综合的。比如Verilog中存在一些用于仿真验证的子集,属于仿真验证语言,因为没有相应的硬件元件与其对应,故只能在仿真时候使用,不能被综合成电路。如延时语句#,initial语句等。97可综合语句98Verilog语句可综合性说明module语句√数据类型wire,reg,integer√parameter语句√端口声明input,output,inout√运算符大部分可综合
全等运算符(===,!==)不可综合
对于除法“/”
的运算,只有除数为2的指数时才可综合基本门元件√赋值语句(assign,=,<=)√条件语句(if-else,case)√循环语句
(for,while)只有当循环的次数在编译之前就已确定时可综合,动态改变循环次数的语句不可综合always语句√function语句√编译向导`define,`include等√不可综合语句99Verilog语句可综合性说明延时控制#xx×初始化语句initial×数据类型real×循环语句repeat,forever×字符串常量×全等运算符===,!==×与X,Z的比较把数据和X(或Z)进行比较是不可综合的敏感列表里一个信号同时带有posedge和negedge例always@(posedgeclkornegedgeclk)
这种always块是不可综合的建立可综合模型的原则100不使用initial语句、延时语句#以及循环次数不确定的循环语句尽量使用同步方式设计电路。除非关键路径的设计,一般不采用条用门级元件来描述,建议采用行为语句完成设计。所有的内部寄存器都应该能够被复位。对时序逻辑描述和建模,尽量使用非阻塞赋值方式。组合逻辑和时序逻辑实现的电路尽量分配到不同的always
块中。用always块描述组合逻辑时,应在敏感信号列表中列出所有的输入信号。不能在多个的always块中对同一个变量赋值;在同一个块中,不要同时用阻塞赋值(推荐)和非阻塞赋值。避免混合使用上升沿和下降沿触发的触发器。同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或不同的时钟沿)控制。避免在case语句的分支项中使用X值或Z值。资源占用Occupationofresources“
前面说过,FPGA是一种可编程逻辑器件,可以根据用户的需求进行逻辑电路的重新配置。在FPGA设计中,使用VerilogHDL语言编写的代码将在综合后变成逻辑电路,并且映射到FPGA的可编程逻辑资源上。因此,在资源不充足时,如何优化FPGA设计,提高资源的利用率也是需要考虑的一个问题。下面简单介绍一下Verilog中比较占用逻辑资源的语法。3.10101时序逻辑
在Verilog中,可以使用组合逻辑和时序逻辑来描述电路行为。组合逻辑仅基于输入信号的当前值,而时序逻辑还需要考虑输入信号的变化过程。因此,相比于组合逻辑,时序逻辑通常需要使用寄存器来存储状态信息,因此会占用更多的FPGA逻辑资源。102rega;always@(posedgeclk_50mhz_i)begina=b+1;
endwirea;assigna=b+1;寄存器
寄存器是时序逻辑的基本构建单元,用于存储状态信息。在Verilog中,寄存器占用的逻辑资源与其位宽和数量相关。较宽的寄存器和大量的寄存器会占用更多的FPGA逻辑资源,因此,设计电路时,一般不建议用Verilog语言去写一个数组,如果不能避免使用这种数据,最好使用带地址的RAM,而不用寄存器直接进行数据存储。103reg[8:0]
s_data[127:0];//128个8位宽的数据组成的数组多路选择器和复用器
多路选择器和复用器是常用的逻辑电路,可以将多个输入信号选择或复用到一个输出信号上。在Verilog中,多路选择器和复用器可以使用条件运算符
、case语句和if语句来实现,不同实现方式占用的资源数量也各不相同。条件运算语句主要用于组合逻辑电路中,资源占用相对较小;case语句和if语句则主要用于时序逻辑,其中,if语句可以处理更加复杂的判断条件,但在实际电路中占用的资源也会更多,因此,一般能用case语句实现的选择电路就不用if语句。104高层次抽象
Verilog中提供了一些高层次的抽象语法,如generate语句、函数和任务,这些抽象语法可以简化Verilog的设计和提高可读性。代价则是会导致更多的逻辑资源的占用,造成逻辑资源的浪费。因此,在使用这些抽象语句时,应当权衡其对逻辑资源的消耗和代码的可读性,避免资源的滥用。105算术运算和位操作在Veri1og中,算术运算和位操作是常见的操作。然而,一些复杂的算术运算(*,/,%)和位操作会占用更多的逻辑资源,在进行算术运算和位操作时,我们应该尽量使用简单的操作,避免过多的嵌套和复杂的逻辑。106reg[3:0]a;wire[1:0]y;assigny=(a[3]==1’b1)?2’b00:(a[2]==1’b1)?2’b01:
(a[1]==1’b1)?2’b10:
(a[0]==1’b1)?2’b11:3’b00;第4讲-集成逻辑门电路功能测试107数字电路的FPGA设计与实现——基于QuartusPrime和VerilogHDLFPGADesignandImplementationofDigitalCircuits——BasedonQuartusPrimeandVerilogHDL实验原理ExperimentalPrinciples“4.11084路2输入与非门的引脚排列与逻辑图
本实验基于7400和4011数字集成电路,二者均是4路2输入与非门,引脚排列和逻辑图如下图所示,其中的14号引脚为电源,7号引脚为地,其余引脚为4路2输入与非门的输入/输出引脚。109输入/输出逻辑电平参数110
数字集成电路有4个不同的输入/输出逻辑电平参数,分别如下:低电平输入电压UIL(max)高电平输入电压UIH(min)低电平输出电压UOL(max)高电平输出电压UOH(min)其中,当输入电平在UIL(max)和UIH(min)之间时,逻辑电路可能把它当作0,也可能把它当作1,而当逻辑电路因所接负载过多等原因不能正常工作时,高电平输出可能低于UOH(min),低电平输出可能高于UOL(max)。TTL和CMOS与非门的输入/输出逻辑电平参数111通常标准TTL电路的直流电源电压为5V,当其电源电压在4.5V~5.5V范围内时能正常工作。CMOS电路的直流电源电压范围为3V~18V,常用的有3.3V和5V两种,其中3.3V的CMOS电路当其电源电压在2V~3.6V范围内时能正常工作,5V的CMOS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业信息安全事件应对及处理方案
- 合规部的未来发展趋势和人才培养策略
- 电信行业数据分析师招聘面试技巧
- 大数据驱动的智能调度决策模型研究报告
- 城市社区服务创新与发展策略考试及答案
- 英语口语的演讲稿
- 新时代的政法人演讲稿
- 演讲稿互动内容小学生
- 职场演讲稿作文模板
- 2026年《视觉营销》考试复习题库(附答案)
- GB/T 25384-2018风力发电机组风轮叶片全尺寸结构试验
- GB/T 19215.1-2003电气安装用电缆槽管系统第1部分:通用要求
- GB/T 18271.3-2017过程测量和控制装置通用性能评定方法和程序第3部分:影响量影响的试验
- 群论及其在晶体学中的应用电子教案课件
- 法语学习《新大学法语三》课件
- 教学用薪酬管理三级0课件
- 淮阴侯列传(使用)课件
- 施工企业会计实务课件
- Q∕SY 1190-2013 事故状态下水体污染的预防与控制技术要求
- GB∕T 9790-2021 金属材料 金属及其他无机覆盖层的维氏和努氏显微硬度试验
- 经济法(第四版)全套教学课件
评论
0/150
提交评论