第2章FPGA设计基础重点VerilogHDL基础知识嵌入式处理器介绍FPGA设计流程概述HDL(HardwareDescriptionLanguage)是一种用形式化方法来描述数字电路和数字逻辑系统的硬件描述语言。有两种类型:VHDL和VerilogHDL。2.1VerilogHDL基础知识VerilogHDL语言具有这样的描述能力:设计的行为特性、设计的数据流特性、设计的结构组成,以及包含响应监控与设计验证方面的时延和波形产生机制。Verilog与C语言的比较(1)Verilog是一种硬件语言,最终是为了产生实际的硬件电路或对硬件电路进行仿真;而C语言是一种软件语言,是控制硬件来实现某些功能的语言。(2)C语言只要是语法正确,都可以编译执行;而Verilog语言有可综合的限制,即在所有的Verilog语句中,只有一部分可以被综合,而另外的部分则不能被综合,只能用来仿真。(3)C语言是一种软件编程语言,其基本思想是语句的循序执行;而Verilog语言的基本思想是模块的并行执行。(4)利用Verilog编程时,要时刻记得Verilog是硬件语言,要时刻将Verilog与硬件电路对应起来。C语言Verilog语言sub-functionmodule,function,taskif-then-elseif-then-elseCaseCase{,}begin,endForForWhileWhileBreakDisableDefineDefineIntIntPrintfmonitor,display,strobe常用的C语言与Verilog语言相对应的关键字与控制结构常用的C语言与Verilog语言相对应的运算符C语言Verilog语言功能**乘//除++加--减%%取模!!反逻辑&&&&逻辑且||||逻辑或大于小于==大于等于==小于等于====等于!=!=不等于~~位反相&&按位逻辑与||按位逻辑或^^按位逻辑异或~^~^按位逻辑同或右移左移?:?:同等于if-else敘述自顶向下的设计方法通过自顶向下的设计方法,可以实现设计的结构化,可以使一个复杂的系统设计由多个设计者分工合作,还可以实现层次化的管理。模块模块(module)是Verilog的基本描述单位,用于描述某个设计的功能或结构以及与其他模块通信的外部端口。例3位加法器的形成语言为moduleaddr(a,b,cin,count,sum);//模块名及输入输出端口列表input[2:0]a;//定义信号流向及位宽input[2:0]b;inputcin;outputcount;output[2:0]sum;assign{count,sum}=a+b+cin;//功能描述endmoduleVerilogHDL基本语法VerilogHDL中的标识符可以是任意一组字母、数字、$符号和_(下划线)符号的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。1.标识符例CountCOUNT//与Count不同R56_68FIVE$alwaysandassignbegincasedefaultdisableedgeelseendendcaseendmoduleendfunctionendprimitiveendspecifyendtableendtaskeventforforeverforkfunctionifinitialinoutinputintegerjoinlargemodulenegedgenornotoroutputVerilogHDL定义的一些常用的关键词2.注释VerilogHDL中有两种注释方式,一种是以“/*”符号开始,“*/”结束,在两个符号之间的语句都是注释语句,因此可扩展到多行。例/*statement1,statement2,……statementn*/另一种是以//开头的语句,它表示以//开始到本行结束都属于注释语句。3.格式VerilogHDL是区分大小写的,即大小写不同的标识符是不同的。另外其书写格式自由,即一条语句可多行书写,一行可写多个语句。空白(新行、制表符、空格)没有特殊意义。例inputA;inputB;与inputA;inputB;是一样的。4.数字值集合(1)值集合VerilogHDL中规定了四种基本的值类型,这四类基本值组成了VerilogHDL中的常量,即0:逻辑0或“假”;1:逻辑1或“真”;X:未知值;Z:高阻。注意,这四种值的解释都内置于语言中。如一个为z的值总是意味着高阻抗,一个为0的值通常是指逻辑0;在门的输入或一个表达式中为“z”的值通常解释成“x”。此外,x值和z值都是不分大小写的,也就是说,值0x1z与值0X1Z相同。(2)常量VerilogHDL中有三种常量:整型、实型和字符串型。下划线符号(_)可以随意用在整数或实数中,它们就数量本身没有意义,可用来提高易读性,唯一的限制是下划线符号不能用做首字符。整型数可以按如下两种方式书写:十进制形式整数的例子:32十进制数32-15十进制数-15基数表示形式整数的例子:5'O375位八进制数(二进制11111)4'D24位十进制数(二进制0011)4'B1x_014位二进制数7'Hx7位x(扩展的x),即xxxxxxx4'hZ4位z(扩展的z),即zzzz4'd-4非法:数值不能为负8‘h2A在位长和字符之间,以及基数和数值之间允许出现空格3'b001非法:`和基数b之间不允许出现空格(2+3)'b10非法:位长不能够为表达式实型数可以用下列两种形式定义:①十进制计数法2.05.67811572.120.12.//非法:小数点两侧必须有1位数字②科学计数法23_5.1e2其值为23510.0;忽略下划线3.6E2其值为360.0(e与E相同)5E-4其值为0.0005字符串是双引号内的字符序列字符串不能分成多行书写INTERNALERRORREACHED-HERE用8位ASCII值表示的字符可看做是无符号整数,因此字符串是8位ASCII值的序列。为存储字符串“INTERNALERROR”,变量需要8*14位:reg[1:8*14]Message;……Message=INTERNALERROR5.数据类型VerilogHDL主要包括两种数据类型:线网类型(nettype)寄存器类型(regtype)(1)线网类型线网类型主要有wire和tri两种。线网类型用于对结构化器件之间的物理连线进行建模,如器件的管脚、内部器件如与门的输出等。线网类型代表的是物理连接线,因此它不存贮逻辑值,必须由器件所驱动,通常由assign进行赋值,如assignA=B^C。reg是最常用的寄存器类型,寄存器类型通常用于对存储单元进行描述,如D触发器、ROM等。(2)寄存器类型寄存器类型的存储单元建模举例用寄存器类型来构建两位D触发器如下:reg[1:0]Dout;……always@(posedgeClk)Dout=Din;……6.运算符和表达式常用的算术运算符主要有加法(二元运算符):“+”减法(二元运算符):“-”乘法(二元运算符):“*”(1)算术操作结果的位数长度算术表达式结果的长度由最长的操作数决定。在赋值语句中,算术操作结果的长度由操作符左端目标长度决定。reg[3:0]Arc,Bar,Crt;reg[5:0]Frx;……Arc=Bar+Crt;Frx=Bar+Crt;第一个加法操作的长度由Bar,Crt和Arc的长度决定,长度为4位。第二个加法操作的长度由Frx的长度决定(Frx,Bat和Crt中的最长长度),长度为6位。例如(2)关系运算符关系操作符的结果为真(1)或假(0)。如果操作数中有一位为X或Z,那么结果为X。例如:2345结果为假(0)528'hxFF结果为x如果操作数长度不同,长度较短的操作数在最重要的位方向(左方)添0补齐。例如,'b1000='b01110等价于'b01000='b01110结果为假(0)?(大于)?(小于)?=(不小于)?=(不大于)==(逻辑相等)!=(逻辑不等)(3)逻辑运算符这些运算符在逻辑值0(假)或1(真)上操作。逻辑运算的结果为0或1,例如:假定Crd='b0;//0为假Dgs='b1;//1为真那么Crd&&Dgs的结果为0(假)Crd||Dgs的结果为1(真)!Dgs的结果为0(假)&&(逻辑与)||(逻辑或)!(逻辑非)用法为:(表达式1)逻辑运算符(表达式2)……这些操作符在输入操作数的对应位上按位操作,并产生向量结果。例如:假定A='b0110,B='b0100;那么A|B的结果为0110,A&B的结果为0100。如果操作数长度不相等,长度较小的操作数在最左侧添0补位,例如:'b0110^'b10000与下面的操作相同'b00110^'b10000结果为'b10110(4)按位逻辑运算符?~(一元非):(相当于非门运算)?&(二元与):(相当于与门运算)?|(二元或):(相当于或门运算)?^(二元异或):(相当于异或门运算)?~^,^~(二元异或非即同或):(相当于同或门运算)(5)条件运算符如果cond_expr为真(即值为1),选择expr1;如果cond_expr为假(值为0),选择expr2。如果cond_expr为x或z,结果将是按以下逻辑expr1和expr2按位操作的值:0与0得0,1与1得1,其余情况为x。条件操作符根据条件表达式的值选择表达式,形式如下:cond_expr?expr1:expr2(5)连接运算符例如:wire[7:0]Dbus;assignDbus[7:4]={Dbus[0],Dbus[1],Dbus[2],Dbus[3]};//以反转的顺序将低端4位赋给高端4位assignDbus={Dbus[3:0],Dbus[7:4]};//高4位与低4位交换由于非定长常数的长度未知,不允许连接非定长常数。例如,下列式子非法:{Dbus,5}//不允许连接操作非定长常数连接操作是将小表达式合并形成大表达式的操作。形式如下:{expr1,expr2,…,exprN}(7)条件语句如果对condition_1求值的结果为非零值,那么procedural_statement_1被执行;如果condition_1的值为0,x或z,那么procedural_statement_1不执行。如果存在一个else分支,那么这个分支被执行。if语句的语法如下:if(condition_1)procedural_statement_1{elseif(condition_2)procedural_statement_2}{elseprocedural_statement_3}例如if(Sum60)beginGrade=C;Total_C=Total_c+1;endelseif(Sum75)beginGrade=B;Total_B=Total_B+1;endelsebeginGrade=A;Total_A=Total_A+1;end注意,条件表达式必须总是被括起来的。(8)case语句case语句首先对条件表达式case_expr求值,然后依次对各分支项求值并进行比较,第一个与条件表达式值相匹配的分支中的语句被执行。可以在1个分支中定义多个分支项;这些值不需要互斥,缺省分支覆盖所有没有被分支表达式覆盖的其他分支。case语句是一个多路条件分支形式,其语法如下:case(case_expr)case_item_expr{,case_item_expr}:procedural_statement……[default:procedural_statement]endcase例如case(HEX)4'b0001:LED=7'b1111001;//14'b0010:LED=7'b0100100;//24'b0011:LED=7'b0110000;//34'b0100:LED=7'b0011001;//44'b0101:LED=7'b0