FPGA技术教程(通俗易懂)课件.ppt

上传人(卖家):晟晟文业 文档编号:4845498 上传时间:2023-01-17 格式:PPT 页数:167 大小:4.13MB
下载 相关 举报
FPGA技术教程(通俗易懂)课件.ppt_第1页
第1页 / 共167页
FPGA技术教程(通俗易懂)课件.ppt_第2页
第2页 / 共167页
FPGA技术教程(通俗易懂)课件.ppt_第3页
第3页 / 共167页
FPGA技术教程(通俗易懂)课件.ppt_第4页
第4页 / 共167页
FPGA技术教程(通俗易懂)课件.ppt_第5页
第5页 / 共167页
点击查看更多>>
资源描述

1、 早期FPGA现在 一、一、莱迪思)通用阵列逻辑 二维的逻辑块阵列,构成了二维的逻辑块阵列,构成了PLD器件的逻器件的逻辑组成核心。辑组成核心。输入输出块:输入输出块:连接逻辑块的互连资源连接逻辑块的互连资源连线资源:由各种长度的连线线段组成,其中也有连线资源:由各种长度的连线线段组成,其中也有 一一些可编程的连接开关,它们用于逻辑块之间、逻辑块些可编程的连接开关,它们用于逻辑块之间、逻辑块输入输出块之间的连接输入输出块之间的连接 这种这种FPGA的结构可分为三块:宏单元的结构可分为三块:宏单元(Macrocell)、可编程连线()、可编程连线(PIA)和)和I/O控制块。控制块。宏单元是器件

2、的基本结构,由它来实现基本的逻辑宏单元是器件的基本结构,由它来实现基本的逻辑功能;可编程连线负责信号传递,连接所有的宏单功能;可编程连线负责信号传递,连接所有的宏单元;元;I/O控制块负责输入输出的电气特性控制,比如控制块负责输入输出的电气特性控制,比如可以设定集电极开路输出,摆率控制,三态输出等。可以设定集电极开路输出,摆率控制,三态输出等。INPUT/GCLK1,INPUT/GCLRn,INPUT/OE1,INPUT/OE2是全局是全局时钟、清零和输出使能信号,这时钟、清零和输出使能信号,这几个信号有专用连线与器件中每几个信号有专用连线与器件中每个宏单元相连,信号到每个宏单个宏单元相连,信

3、号到每个宏单元的延时相同并且延时最短。元的延时相同并且延时最短。CPLD组合逻辑的功能很强,一个宏单元就可以组合逻辑的功能很强,一个宏单元就可以分解十几个甚至分解十几个甚至2030多个组合逻辑输入。而多个组合逻辑输入。而FPGA的一个的一个LUT只能处理只能处理4输入的组合逻辑,因此,输入的组合逻辑,因此,CPLD适合用于设计译码等复杂组合逻辑。适合用于设计译码等复杂组合逻辑。但但FPGA的制造工艺确定了的制造工艺确定了FPGA芯片中包含的芯片中包含的LUT和触发器和触发器的数量非常多,往往都是几千上万,的数量非常多,往往都是几千上万,CPLD一般只能一般只能做到做到512个逻辑单元,而且如果

4、用芯片价格除以逻辑个逻辑单元,而且如果用芯片价格除以逻辑单元数量,单元数量,FPGA的平均逻辑单元成本大大低于的平均逻辑单元成本大大低于CPLD。FPGA的常用设计方法包括的常用设计方法包括“自顶向下自顶向下”和和“自下而上自下而上”,目前大规模目前大规模FPGA设计一般选择设计一般选择“自顶向下自顶向下”的设计方法。的设计方法。所谓所谓“自顶向下自顶向下”设计方法设计方法,简单地说简单地说,就是采用可完全独立于芯片厂商及就是采用可完全独立于芯片厂商及其产品结构的描述语言其产品结构的描述语言,在功能级对设计产品进行定义在功能级对设计产品进行定义,并结合功能仿真技术并结合功能仿真技术,以以确保设

5、计的正确性确保设计的正确性,在功能定义完成后在功能定义完成后,利用逻辑综合技术利用逻辑综合技术,把功能描述转换成某把功能描述转换成某一具体结构芯片的网表文件一具体结构芯片的网表文件,输出给厂商的布局布线器进行布局布线。布局布输出给厂商的布局布线器进行布局布线。布局布线结果还可反标回同一仿真器线结果还可反标回同一仿真器,进行包括功能和时序的后验证进行包括功能和时序的后验证,以保证布局布线以保证布局布线所带来的门延时和线延时不会影响设计的性能。所带来的门延时和线延时不会影响设计的性能。RTL代码逻辑综合器调用模块的黑盒子接口设置综合目标和约束条件EDIF网表(netlist)HDL网表(netli

6、st)RTL代码代码逻辑仿真器逻辑仿真器(modelsim)调用模块的行为仿真模型测试数据测试数据测试程序测试程序(test bench)(1)设计定义)设计定义(2)设计输入)设计输入(3)功能仿真)功能仿真RTL代码中引用的由代码中引用的由厂家提供的宏模块厂家提供的宏模块/IP(4)逻辑综合)逻辑综合(5)前仿真)前仿真HDL网表(netlist)逻辑仿真器测试数据调用模块的行为仿真模型测试程序(test bench)(6)布局布线)布局布线EDIF网表(netlist)FPGA厂家工具调用模块的综合模型设置布局布线约束条件HDL网表(netlist)SDF文件(标准延时格式)下载/编程文

7、件(7)后仿真)后仿真HDL网表(netlist)SDF文件(标准延时格式)逻辑仿真器测试数据FPGA基本单元仿真模型测试程序(test bench)(8)静态时序分析)静态时序分析(9)在系统测试)在系统测试 设计的行为特性、设计的数据流特性、设计的结构组成以及 包含响应 监控和设计验证方面的时延和波形产生机制。提供 了编程语言接口,通过该接口可以在模拟、验证期间从设计 外部访问设计,包括模拟的具体控制和运行。u主要功能主要功能 基本逻辑门,例如and、or 和nand 等都内置在语言中 开关级基本结构模型,例如pmos 和nmos 等也被内置在语言中 可采用三种不同方式或混合方式对设计建模

8、 两类数据类型 能够描述层次设计,可使用模块实例结构描述任何层次 能够使用门和模块实例化语句在结构级进行结构描述 Verilog HDL程序设计由模块(module)构成的,设计模块的基本结构如图,一个完整的Verilog HDL设计模块包括端口定义、I/O声明、信号类型声明和功能描述4个部分。模块端口的定义模块端口的定义 模块端口定义用来声明电路设计模块 的输入/输出端口,端口定义格式如下:module 模块名模块名(端口(端口1,端口,端口2,端口,端口3,););在端口定义的括号中,是设计电路模块与外界联系的全部输入/输出端口信号或引脚,是设计实体对外的一个通信界面,是外界可以看到的部分

9、(不包含电源和接地端),多个端口之间用“,”分隔。例如1位全加器adder模块的端口定义为module adder(S,CO,A,B,CI);模块名adder 2 信号类型声明信号类型声明 信号类型声明是声明设计电路的功能描述中所用的信号的数据类型和函数。信号的数据类型主要有连线(wire)、寄存器(reg)、整型(integer)、实型(real)、和时间(time)等。信号声明格式如下:wire msb:lsb 端口1,端口2,端口3,;reg msb:lsb 端口1,端口2,端口3,;3 功能描述功能描述 功能描述是Verilog HDL程序设计中最主要的部分,用来描述设计模块的内部结构

10、和模块端口间的逻辑关系,在电路上相当于器件的内部电路结构。功能描述可以用assign语句、元件例化(instantiate)方式、always块语句、initial块语句等方法来实现,通常将设计模块描述的方法称为建模。用用assign语句建模语句建模 用assign语句建模的方法很简单,只需要在“assign”后面再加一个表达式。assign语句一般适合对组合逻辑进行赋值,称为连续赋值方式。例1 一位全加器的设计 1位全加器的逻辑符号:S是全加器的和输出端,CO是进位输出端,A和B是两个加数输入端,CI是低位进位输入端。全加器的Verilog HDL源程序如下:module adder1(S,

11、CO,A,B,CI);input A,B,CI;output S,CO;wire S,CO,A,B,CI;assign CO,S=A+B+CI;endmodule “assign CO,S=A+B+CI;”语句实现1位全加器的进位输出CO与和输出S的建模。在语句表达式中,用拼接运算符“”将CO、S这两个1位操作数拼接为一个2位操作数。用元件例化(用元件例化(instantiate)方式建模)方式建模 元件例化方式建模是利用Verilog HDL提供的元件库实现的。例如,用与门例化元件定义一个三输入端与门可以写为 and myand3(y,a,b,c);and是Verilog HDL元件库中与门

12、元件名,myand3是例化出的三输入端与门名,y是与门输出端,a、b、c是输入端。用用always块语句建模块语句建模 always块语句可以产生各种逻辑,常用于时序逻辑的功能描述。一个程序设计模块中,可以包含一个或多个always语句。程序运行中,在某种条件满足时,就重复执行一遍always结构中的语句。例2 8位二进制加法计数器的设计 8位二进制加法计数器的逻辑符号如图。OUT是8位二进制计数器的输出端(8位向量);COUT是进位输出端(1位);DATA是并行数据输入端(8位向量);LOAD是计数器的预置控制输入端,当LOAD=1时,OUT=DATA;CLK是时钟控制输入端,上升沿为有效边

13、沿;CLR是同步复位输入端,当CLK的上升沿到来时且CLR=1,则计数器被复位,OUT=00000000。(逻辑符号图是由计算机对计数器电路的(逻辑符号图是由计算机对计数器电路的Verilog HDL源代码源代码编译后产生的元件符号,图中的输入编译后产生的元件符号,图中的输入/输出标识符自动被改为大输出标识符自动被改为大写,而源程序中的标识符都是小写。)写,而源程序中的标识符都是小写。)8位二进制加法计数器的Verilog HDL 源程序如下:module cnt8(out,cout,data,load,cin,clk,clr);input 7:0 data;input load,cin,cl

14、k,clr output 7:0 out;output cout;reg 7:0 out;always (posedge clk)begin if(load)out=data;else if(clr)out=b00000000;else out=out+1;end assign cout=&out;endmodule 用always块语句实现8位二进制加法计数器的建模。(posedge clk)是时间控制敏感函数,表示clk上升沿到来的敏感时刻。每当clk的上升沿到来时,always块语句中的全部语句就执行一遍。“assign cout=&out;”语句产生进位输出cout,在语句中“&out

15、”是与的缩减运算式,只有out中数字全为1时,结果才为1。用用initial块语句建模块语句建模 Initial块语句与always语句类似,不过在程序中它只执行1次就结束了。Initial块语句的使用格式:Initial Begin 语句语句1;语句语句2;:end 例3 用Initial过程语句对测试变量赋值 initial begin for(addr=0;addr 大于大于=大于等于大于等于 右移右移4 结果结果A=8b00001101而而A4 结果结果A=8b00010000。条件条件操作操作符符?:操作数操作数=条件?表达式条件?表达式1:表:表达式达式2;当条件为真(值为当条件为

16、真(值为1)时,操)时,操作数作数=表达式表达式1;为假(值为为假(值为0)时,操作数)时,操作数=表达式表达式2。三元操作符,即条件操作符有三个操作数。三元操作符,即条件操作符有三个操作数。例如例如 a?b:c若条件操作数若条件操作数a是逻辑是逻辑1,则算子返回表达式,则算子返回表达式1操操作数作数b;若若a是逻辑是逻辑0,则算子返回表达式,则算子返回表达式2操作数操作数c。并接并接操作操作符符,例如例如 a,2a,b 等价于等价于a,a,b,a,b。将将1位全加器的进位位全加器的进位cout和和sum并接,表达式为并接,表达式为将两个或两个以上用逗号分隔的表达式按位连将两个或两个以上用逗号

17、分隔的表达式按位连接在一起。还可以用常数来指定重复的次数。接在一起。还可以用常数来指定重复的次数。cout,sum=ina+inb+cin;同其他高级语言类似,各类操作符号之间有优先级之分,如下表:同其他高级语言类似,各类操作符号之间有优先级之分,如下表:优先级序号优先级序号操作符操作符操作符名称操作符名称!、逻辑非、按位取反逻辑非、按位取反*、/、%乘、除、求余乘、除、求余+、-加、减加、减左移、右移左移、右移、=小于、小于等于、大于、大于等于小于、小于等于、大于、大于等于=、!=、=、!=等于、不等于、全等、不全等等于、不等于、全等、不全等&、&缩减与、缩减与非缩减与、缩减与非、缩减异或、

18、缩减同或缩减异或、缩减同或|、|缩减或、缩减或非缩减或、缩减或非&逻辑与逻辑与|逻辑或逻辑或?:条件操作符条件操作符 (3)数值常量)数值常量 Verilog HDL中的数值常量有整型和实型两大类,分为十进制、十六进制、八进制或二进制。若在前面加上一个正“+”或负“”号就表示有符号数,否则所代表的就是无符号数。在数值常量的任意位置可以随意插入下划线“_”以提高可读性。常量定义格式为:parameter 常量名常量名1=表达式,常量名表达式,常量名2=表达式,表达式,常量名,常量名n=表达式;表达式;parameter是常量定义关键字,常量名是用户定义的标识符,表达式为常量赋值。例如 param

19、eter Vcc=5,fbus=8b11010001;Verilog HDL中的整型数值常量就是整数,有两种书写格式:一种是无位宽的十进制表示法,如-132。第二种是定义位宽和进制的表示法,这种表示方法通常是无符号数。常数书写格式是:sizebase value 其中size是位宽,定义了数值常量的位数(长度);base 代表这个数据的进制,取值范围和相应的进制如下表;value是一个数值常量的值,书写格式与进制base相对应。例如 16h6a8c,表示一个4位十六进制数。8hf5 等于8b11110101;8b1111xxxx 等价2hfx;8b1101zzzz 等价8hdz。base进制代

20、码取值进制代码取值对应的进制对应的进制b或或B二进制二进制o或或O八进制八进制d或或D十进制十进制h或或H十六进制十六进制 Verilog HDL中的实型数值常量就是浮点数,可以用十进制与科学计数法两中的实型数值常量就是浮点数,可以用十进制与科学计数法两种形式书写。如果采用十进制格式,小数点两边必须都有数字。种形式书写。如果采用十进制格式,小数点两边必须都有数字。Verilog HDL的编程最终是与硬件相对应的。由于硬件电路中信号的逻辑的编程最终是与硬件相对应的。由于硬件电路中信号的逻辑状态具有特殊性,即不仅有状态具有特殊性,即不仅有0(低电平)和(低电平)和1(高电平),还有可能是(高电平)

21、,还有可能是X(未知(未知状态)和状态)和Z(高阻态),因此(高阻态),因此Verilog HDL数值集合有四个基本值:数值集合有四个基本值:0:逻辑:逻辑0或假状态;或假状态;1:逻辑:逻辑1或真状态;或真状态;X:逻辑不确定;:逻辑不确定;Z:高阻态。:高阻态。(4)字符串字符串是双引号“”括起来的字符序列,必须包含在同 一行中,不能多行书写。在表达式或赋值语句中作为操作数的字符串被看作ASCII值序列,即一个字符串中的每一个字符对应一个8位ASCII值。(5)标识符标识符是模块、寄存器、端口、连线、示例和begin-end块等元素的名称,是赋给对象的唯一的名称。标识符可以是字母、数字、$

22、符和下划线“_”字符的任意组合序列。定义标识符规则:首字符不能是数字,必须以字母或下划线“_”开头。字符数不能多于1024。标识符区分大小写。不要与关键字同名。例如 ina、inb、adder、adder8、name_adder是正确的,而1a?b是错误的。(6)关键字关键字是Verilog HDL预先定义的专用词。在IEEE标准Verilog HDL 1364-1995中规定了102个关键词,都采用小写形式。关键词有其特定和专有的语法作用,用户不能再对它们做新的定义。关键字关键字AlwaysandAssignattributeBeginBufBufif0Bufif1CaseCasexCase

23、zCmosDeassignDefaultdefparamDisableedgeelseendendattributeendcaseendfunctionendmoduleendprimitiveendspecifyendtableendtaskeventforforceforeverforkfunctionhighz0 highzlifinitialinoutinputintegerjoinlargemacromodulemediummodulenandnegedgenmosnornotnotif0 notifloroutputparameterpmosposedgeprimitivepull

24、0pull1pulldownpulluprcmosrealrealtimeregreleaserepeat rtraniflscalaredsignedsmallspecifyspecpramstrengthstrong0strong1supply0supply1tabletasktimetrantranif0tranif1 tritri0tri1triandtriortritegunsignedvectoredwaitwandweak0weak1whilewireworxnorxor (7)变量变量是在程序运行时其值可以改变的量。在Verilog HDL中,变量分为网络型(nets type

25、)和寄存器型(register type)两种。网络型变量nets型变量是输出值始终根据输入变化而更新的变量,一般用来定义硬件电路中的各种物理连线。Verilog HDL提供了多种nets型变量。常见的nets型变量及说明类型类型功能说明功能说明wire、tri连线类型(两者功能完全相同)连线类型(两者功能完全相同)wor、trior具有线或特性的连线(两者功能一致)具有线或特性的连线(两者功能一致)wand、triand具有线与特性的连线(两者功能一致)具有线与特性的连线(两者功能一致)tri1、tri0分别为上拉电阻和下拉电阻分别为上拉电阻和下拉电阻supply1、supply0分别为电源

26、(逻辑分别为电源(逻辑1)和地(逻辑)和地(逻辑0)寄存器型变量 register型变量是用来描述硬件系统的基本数据对象。作为一种数值容器,可以容纳当前值,也可以保持历史值。与寄存器的记忆功能相对应,可以作为模块各器件间的信息传递通道。register型变量与wire型变量的区别在于register型变量需要被明确的赋值,并且在重新赋值前一直保持原值。register型变量是在always、initial等过程语句种定义,并通过过程语句赋值。常见的register型变量及说明类型类型功能说明功能说明reg常用的寄存器型变量常用的寄存器型变量integer32位带符号整数型变量位带符号整数型变量

27、real64位带符号实数型变量位带符号实数型变量time无符号时间型变量无符号时间型变量 Verilog HDL的语句包括赋值语句、条件语句、循环语句、结构声明语句和编译预处理语句等类型,每一类语句又包括几种不同的语句。在这些语句中,有些语句属于顺序执行语句,有些语句属于并行执行语句。(1)赋值语句 在Verilog HDL中,赋值语句常用于描述硬件设计电路输出与输入之间的信息传送,改变输出结果。Verilog HDL有4种赋值方法:门基元、连续赋值、过程赋值和非阻塞赋值。门基元赋值语句 门基元赋值语句的格式为:基本逻辑门关键字基本逻辑门关键字 (门输出,门输入(门输出,门输入1,门输入,门输

28、入2,门,门输入输入n););例如例如 4输入与非门的门基元赋值语句为输入与非门的门基元赋值语句为 nand(y,a,b,c,d);/与语句与语句assign y=(a&b&c&d)等效等效 连续赋值语句 连续赋值语句的关键字assign,赋值符号是“=”,赋值语句的格式为 assign 赋值变量赋值变量=表达式;表达式;例如 assign y=(a&b&c&d);连续赋值语句的“=”两边的变量都应该是wire型变量。在执行中,输出y的变化跟随输入a、b、c、d的变化而变化,反映了信息传送的连续性。连续赋值语句用于逻辑门和组合逻辑电路的描述。例1 四输入端与非门的Verilog HDL源程序

29、module example1(y,a,b,c,d);output y;input a,b,c,d;assign#1 y=(a&b&c&d);/#1表示输出与输入信号之间具有1个单位的时间延迟 endmodule 过程赋值语句 过程赋值语句出现在initial和always块语句中,赋值符号是“=”,语句格式为:赋值变量赋值变量=表达式;表达式;过程赋值语句“=”左边的赋值变量必须是(寄存器)reg型变量,其值在该语句结束时即可得到。如果一个块语句中包含若干条过程赋值语句,按顺序一条一条执行,前面的语句没完成,后面的语句就不能执行。因此,过程赋值语句也称为阻塞赋值语句。非阻塞赋值语句非阻塞赋值

30、语句也是出现在initial和always块语句中,赋值符号是“=”,语句格式为:赋值变量赋值变量=表达式;表达式;非阻塞赋值语句“=”左边的赋值变量必须是(寄存器)reg型变量,其值在块语句结束时才可得到,与过程赋值语句不同。例如 下面的块语句包含4条赋值语句 always (posedge clock)begin m=3;n=75;n=m;r=n;end语句执行结束后,r的值是75,而不是3,因为第3行是非阻塞赋值语句“n=m”,该语句要等到本块语句结束时,n的值才能改变。块语句的“(posedge clock)”是定时控制敏感寒暑,表示时钟信号clock的上升沿到来的敏感时刻。例2 上升

31、沿触发的D触发器的Verilog HDL源程序 module D_FF(q,d,clock);input d,clock;/属于wire型变量 output q;/属于reg型变量 reg q;always (posedge clock)q=d;endmodule(2)条件语句条件语句包含if语句和case语句,它们都是顺序语句,应放在always块中。if语句完整的Verilog HDL的if语句结构如下:if(表达式)begin 语句;end else if(表达式)begin 语句;end else begin 语句;end在if语句中,“表达式”是逻辑表达式或关系表达式,也可以是位宽为

32、1位的变量。系统对表达式的值进行判断,若为0,x,z按“假”处理;若为1,按“真”处理,执行指定的语句。例3 8线-3线优先编码器的设计8线-3线优先编码器的功能表 module code(y,a);input7:0 a;output2:0 y;reg2:0 y;always (a)begin if(a7)y=3b111;else if(a6)y=3b110;else if(a5)y=3b101;else if(a4)y=3b100;else if(a3)y=3b011;else if(a2)y=3b010;else if(a1)y=3b001;else y=3b000;end endmodu

33、le输入输入输出输出in0 in1 in2 in3 in4 in5 in6 in7out2 out1 out0 x x x x x x x 0 x x x x x x 0 1 x x x x x 0 1 1 x x x x 0 1 1 1 x x x 0 1 1 1 1 x x 0 1 1 1 1 1 x 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 case语句 case语句是一种多分支的条件语句,case语句的格式为:case(表达式)选择值1:语句1;选择值2:语句2;选择值n:

34、语句n;default:语句n+1 endcase 执行case语句时,首先计算表达式的值,然后执行条件句中相应的“选择值”的语句。当所有的条件句的“选择值”与表达式的值不同时,则执行“default”后的语句。default可以省略。case语句多用于数字系统中的译码器、数据选择器、状态机及微处理器的指令译码器等电路的描述。例4:用case语句描述4选1数据选择器 控制信号s1,s2有4种组合,控制a,b,c,d中的一个数据送到输出端。4选1数据选择器Verilog HDL的描述如下:module mux41(z,a,b,c,d,s1,s2);input s1,s2;input a,b,c,

35、d;output z;reg z;always (a,b,c,d,s1,s2)begin case(s1,s2)2b00:z=a;2b01:z=b;2b10:z=c;2b11:z=d;endcase end endmodule case语句还有两种变体形式,casez和casex语句。与case语句的区别是不考虑语句中的高阻z和未知x的那些位,只关注其他位的比较结果。s1 s2z0 00 11 01 1abcd (3)循环语句)循环语句循环语句包含for语句、repeat语句、while语句和forever语句4种。for语句for语句的格式为:for(循环指针(循环指针=初值;循环指针初值;

36、循环指针 终值;循环指针终值;循环指针=循环指针循环指针+步长值)步长值)begin 语句;endfor语句可以是一组语句重复执行,语句中的参数一般属于整型变量或常量。语句重复执行的次数由语句中的参数确定。即 循环重复次数循环重复次数=(终值(终值-初值)初值)/步长值步长值 例5:8位奇偶校验器的描述用a表示输入信号,长度为8位的向量。在程序中,用for语句对a的值,逐位进行模2加运算(即异或XOR),循环指针变量n控制模2加的次数。11100110 奇数个奇数个1循环变量的初值为0,终值为8,因此,控制循环共执行了8次。例5 用Verilog HDL对8位奇偶校验器的描述如下:module

37、 test8(a,out);input7:0 a;output out;reg out;integer n;always (a)begin out=0;for(n=0;n=b)max=a;else max=b;end endfunction 函数调用的格式如下 函数名函数名(关联参数表);(关联参数表);函数调用一般是出现在模块、任务或函数语句中。通过函数的调用来完成摹写数据的运算或转换。例如,调用上例中求最大值函数的语句为 z=max(x,y);其中,x和y是与函数定义的两个参数a、b相关联的关联参数。通过函数的调用,求出x和y中的最大值,并用函数名max返回。函数和任务存在以下几处区别:函

38、数和任务存在以下几处区别:(1)任务可以有任意不同类型输入/输出参数,函数不能将inout类型作为输出。(2)任务只可以在过程语句中调用,不能在连续赋值语句assign中调用;函数可以作为表达式中的一个操作数,在过程赋值语句和连续赋值语句中调用。(3)任务可以调用其他任务或函数;函数可以调用其他函数,但不能调用任务。(4)任务不向表达式返回值,函数向调用它的表达式返回一个值。(5)语句的顺序执行与并行执行Verilog HDL中有顺序执行语句和并行执行语句之分。always块语句中的语句是顺序语句,按照程序书写的顺序执行。always块本身确是并行语句,它与其他always语句及assign语

39、句、元件例化语句的执行都是同时(即并行)的。例9 同步清除十进制加法计数器的描述同步清0是在时钟信号作用下,计数器的状态被clr清0,清0信号clr高电平有效;时钟信号clk上升沿触发。计数器计数状态从4b0000到4b1001循环。module cnt10(clr,clk,q,co);input clr,clk;output3:0 q;output co;reg 3:0 q;reg co;always (posedge clk)begin if(clr)begin co=0;q=4b0000;end else if(q=4b1001)begin q=4b0000;co=1;end else

40、begin co=0;q=q+1;end end endmodule 五、五、Verilog HDL的描述方式(建模方法)的描述方式(建模方法)系统级(system):用高级语言结构实现设计模块的外部性能的模型。算法级(algorithmic):用高级语言结构实现设计算法的模型。RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型。门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。逻辑级 电路级 系统级 算法级 算法级 RTL 级 RT

41、L 级 门级 门级 开关级 VHDL Verilog HDL 行为级 描述方式:1、结构描述:描述元器件间连接关系:例化2、数据流描述:描述电路数据流行为:assign3、行为描述:描述功能:always4、混合描述:Verilog允许多描述方式共存于同一模块。751 1 结构描述结构描述1)基于库元件的结构描述 门级描述即直接调用门原语进行逻辑的结构描述。以门级为基础的结构描述所建立的硬件模型不仅是可仿真的,也是可综合的;一个逻辑网络由许多逻辑门和开关组成,用逻辑门的模型来描述逻辑网络最直观!门类型的关键字有26个,常用的有9个:not,and,nand,or,nor,xor,xnor,bu

42、f,bufif1,bufif0,notif1,notif0(各种三态门)调用门原语的句法注1:在 端口列表中输出信号列在最前面;注2:门级描述不适于描述复杂的系统!例:采用结构描述方式描述硬件电路module example_4_11(y,a,b,c);input a,b,c;output y;wire s1,s2,s3;not (s1,a);nand (s2,c,s1);nand (s3,a,b);nand (y,s2,s3);endmodule 2)基于设计模块的结构描述)基于设计模块的结构描述 任何用Verilog HDL描述的电路设计模块(module),均可用模块例化语句,例化一个元

43、件,来实现电路系统的设计。模块例化语句格式与逻辑门例化语句格式相同,具体格式:设计模块名设计模块名 (端口列表);(端口列表);其中,“例化电路名”是用户为系统设计定义的标识符,相当于系统电路板上为插入设计模块元件的插座,而端口列表相当于插座上引脚名表,应与设计模块的输入/输出端口一一对应。用模块例化方式设计1位全加器。在1位全加器设计中,需要事先设计一个半加器,然后用例化方式将两个半加器和一个或门连接成全加器。使用两个半加器模块构造全加器module HA(A,B,S,C);input A,B;output S,C;assign S=A B;assign C=A&B;endmodulemod

44、ule FA(P,Q,Cin,Sum,Cout);input P,Q,Cin;output Sum,Cout;wire S1,C1,C2;HA h1(P,Q,S1,C1);/通过位置关联。HA h2(.A(Cin),.S(Sum),.B(S1),.C(C2);/通过端口与信号的名字关联。or O1(Cout,C1,C2);/或门实例语句endmodule 位置关联法:位置关联法要求端口列表中的端口列表中的引脚明称与设计模块的输入、输出端口一一引脚明称与设计模块的输入、输出端口一一对应。对应。名称关联法:名称名称关联法的格式如下:(.设计模块端口名(连接实体端口名),连接实体端口名),);端口列

45、表端口列表中的位置可以是任意的。中的位置可以是任意的。例:用模块例化方式设计例:用模块例化方式设计8位计数译码器电路位计数译码器电路系统。系统。在8位计数译码系统电路设计中,需要事先设计一个4位二进制加法计数器cnt4e模块和一个七段数码显示器的译码器Dec7s模块,然后用例化方式将这两种模块组成计数译码系统电路。4位二进制加法计数器的设计4位二进制加法计数器的符号如图,CLK是时钟输入端;CLR复位控制输入端,当CLR=1时计数器被复位,输出Q3.0=0000;ENA 是使能控制输入端,当ENA=1时,计数器才能工作;COUT是进位输出端,当输出Q3.0=1111时,COUT=1。modul

46、e cnt4e(clk,clr,ena,cout,q);input clk,clr,ena;output 3:0 q;output cout;reg 3:0 q;always (posedge clr or posedge clk)begin if(clr)q=b0000;else if(ena)q=q+1;end assign cout=&q;endmodule七段数码显示器的译码器七段数码显示器的译码器 Dec7s的元件符号如图的元件符号如图A3.0是是4数据输入端,将接至数据输入端,将接至cnt4e的输出端的输出端Q3.0;Q7.0是译码器的输出端,提供七是译码器的输出端,提供七段数码显

47、示数据。段数码显示数据。module Dec7s(a,q);output7:0 q;input3:0 a;reg7:0 q;always (a)begin case(a)0:q=8b00111111;1:q=8b00000110;2:q=8b01011011;3:q=8b01001111;4:q=8b01100110;5:q=8b01101101;6:q=8b01111101;7:q=8b00000111;8:q=8b01111111;9:q=8b01101111;10:q=8b01110111;11:q=8b01111100;12:q=8b00111001;13:q=8b01011110;1

48、4:q=8b01111001;15:q=8b01110001;endcase endendmodule 计数译码系统电路的设计计数译码系统电路的设计 计数译码系统电路是用Quartus II的图形编辑方式设计出来的。用模块例化方式将用模块例化方式将cnt4e和和dec7s两种模块组成计数译码系统电路两种模块组成计数译码系统电路cnt_dec7s的源程序:的源程序:module cnt_Dec_v(clk,clr,ena,cout,q);input clk,clr,ena;output 15:0 q;output cout;reg 15:0 q;wire 3:0 q1,q2;wire x;cnt

49、4e u1(clk,clr,ena,x,q1);cnt4e u2(clk,clr,x,cout,q2);dec7s u3(q1,q7:0);dec7s u4(q2,q15:8);endmodule2 数据流建模例:数据流描述的一位全加器module FA_Df(A,B,Cin,Sum,Cout);input A,B,Cin;output Sum,Cout;assign Sum=AB Cin;assign Cout=(A&Cin)|(B&Cin)|(A&B);endmodule1)assign语句之间是并发的,与其书写的顺序无关;2)线网的赋值可以在声明时赋值,例如wire Sum=AB Cin

50、;数据流建模的时延assign#2 Sum=A B Cin;#2表示右侧表达式的值延迟两个时间单位赋给Sum;时间单位是多少?由谁来决定?timescale 1ns/100ps FPGA设计中的时延仅在功能仿真时有效,不影响实际电路生成。数据流建模注意事项:1)wire型变量如果不赋值,默认值为z;2)数据流建模没有存储功能,不能保存数据;3)wire型变量只能在声明时赋值或者assing语句赋值;4)assign语句并发执行,实际的延迟又物理芯片的布线结果决定。三、三、Verilog HDL行为描述行为描述 Verilog HDL行为描述方式是通过行为语句来描述电路要实现的功能,表示输入输出

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(FPGA技术教程(通俗易懂)课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|