《硬件描述语言幻灯片.ppt》由会员分享,可在线阅读,更多相关《硬件描述语言幻灯片.ppt(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、硬件描述语言2023/4/13GUET School of Information&Communications1第1页,共34页,编辑于2022年,星期一第二讲Verilog语法Verilog模块moduleVerilog语法要素Verilog数据类型及逻辑系统第2页,共34页,编辑于2022年,星期一2.1 模块模块module 1.模块模块:是是verilog设计中的基本程序结构,定义设计的设计中的基本程序结构,定义设计的输入输入/出出端口,端口,I/O接口的接口的类型和数量类型和数量.module 模块名(端口列 表);端口声明端口声明,参数声明参数声明wire,reg和其它类型和其它
2、类型的变量声明的变量声明数据流语句数据流语句(assign)低层模块实例低层模块实例always和和initial块,所有块,所有行为语句都在块内行为语句都在块内任务和函数任务和函数endmodule必须出现必须出现可选可选第3页,共34页,编辑于2022年,星期一module能够表示:能够表示:物理块,如物理块,如IC或或ASIC单元单元逻辑块,如一个逻辑块,如一个CPU设计的设计的ALU部分部分整个系统整个系统每一个模块的描述从关键词每一个模块的描述从关键词module开始,有一个名称(如开始,有一个名称(如SN74LS74,DFF,ALU等等),由关键词等等),由关键词endmodule
3、结束结束。module内部的内部的5个部分:个部分:变量声明变量声明 数据流语句数据流语句 低层模块实例低层模块实例 行为描述块行为描述块 任务和任务和函数函数每一部分在每一部分在module内部出现的顺序是任意的。内部出现的顺序是任意的。一个一个verilog源文件中可以有多个模块,且对排列顺序不做源文件中可以有多个模块,且对排列顺序不做要求要求。第4页,共34页,编辑于2022年,星期一2.端口端口(Terminal)端口是模块与外界环境交互的接口例如IC芯片的输入、输出引脚就是它的端口。对于外部环境来讲,模块内部是不可见的,对模块的调模块内部是不可见的,对模块的调用用(实例引用实例引用)
4、只能通过其端口进行。只能通过其端口进行。这种特点为设计者提供了很大的灵活性:只要接口保持不变,模块内部的修改并不会影响到外部环境我们也常常将端口称为终端(Terminal)。模块端口等价于芯片的管脚(模块端口等价于芯片的管脚(pin)模块通过端口与外部通信模块通过端口与外部通信第5页,共34页,编辑于2022年,星期一l端口列表和端口声明端口列表和端口声明端口在模块名字后的端口在模块名字后的括号中列出括号中列出端口可以说明为端口可以说明为input,output及及inout端口等价于硬端口等价于硬件的引脚件的引脚(pin)input 输入端口输入端口output 输出端口输出端口inout
5、双向端口双向端口端口声明端口声明第6页,共34页,编辑于2022年,星期一module adder(cout,sum,a,b,cin);input 2:0 a,b;input cin;output cout;output 2:0 sum;assign cout,sum=a+b+cin;endmodule例设计三位全加器例设计三位全加器这个例子描述了一个三位的加法器。从例子中可以看出整个这个例子描述了一个三位的加法器。从例子中可以看出整个Verilog HDL程序是嵌套在程序是嵌套在module和和endmodule声明语句里的,只出声明语句里的,只出现了一个现了一个assign语句。语句。ad
6、deraddersum2:0a2:0a2:0b2:0b2:0cincincoutcout模块名模块名端口列表端口列表端口声明端口声明数据流语句数据流语句第7页,共34页,编辑于2022年,星期一例例SR触发器模块触发器模块/SR 触发器触发器module SR_FF(Q,Q_n,S,R);output Q,Q_n;/端口声明端口声明input S,R;nand n1(Q,S,Q_n);nand n2(Q_n,R,Q);endmodule模块中的模块中的5个部分并没全部出现,只个部分并没全部出现,只出现在低层次模块实例化出现在低层次模块实例化nand为为verilog中的与非中的与非门门级原语部
7、件门门级原语部件第8页,共34页,编辑于2022年,星期一D触发器模块触发器模块/D 触发器触发器module D_FF(d,clk,clr,q,qb);output q,qb;input d,clk,clr;reg q,qb;/输出端口输出端口q,qb值保存值保存always(posedge clk)beginif(clr)q=1b0;elseq=d;endnot(qb,q);endmodule 该模块内包括该模块内包括always行为块行为块语句语句always块行为描述语句块行为描述语句第9页,共34页,编辑于2022年,星期一高层次模块对低层次模块的高层次模块对低层次模块的调用调用称为
8、模块实例化。称为模块实例化。可以将模块的实例可以将模块的实例通过端口连接通过端口连接起来构成一个大的系统或元件。起来构成一个大的系统或元件。实例名实例名是每个对象唯一的标记,通过这个标记可以查看每个实例的内部。是每个对象唯一的标记,通过这个标记可以查看每个实例的内部。实例中端口的次序与模块定义的实例中端口的次序与模块定义的次序相同次序相同。模块模块实例化与调用程序不同实例化与调用程序不同。每个实例都是模块的一个完全的拷。每个实例都是模块的一个完全的拷贝,相互独立、并行。贝,相互独立、并行。3.模块实例化模块实例化(module instances)第10页,共34页,编辑于2022年,星期一在
9、调用模块时,可以用在调用模块时,可以用顺序连接顺序连接和和按名连接按名连接把模块定义的端口与外把模块定义的端口与外部信号连接起来部信号连接起来顺序连接:需要连接的顺序连接:需要连接的信号信号需要与模块声明的端口列表一致;需要与模块声明的端口列表一致;D_FF d0(d 0,clk,clr,q 0,qb 0);D_FF d1(d 1,clk,clr,q 1,qb 1);D_FF d2(d 2,clk,clr,q 2,qb 2);D_FF d3(d 3,clk,clr,q 3,qb 3);调用模块名调用模块名例化名例化名第11页,共34页,编辑于2022年,星期一当设计大规模系统时,端口太多,记住
10、端口顺序不大可能,可当设计大规模系统时,端口太多,记住端口顺序不大可能,可以采用按名连接方法。以采用按名连接方法。不需要连接的端口直接忽略掉即可不需要连接的端口直接忽略掉即可D_FF d0(.d(d 0),.clk(clk),.clr(clr),.q(q 0),.qb(qb 0);D_FF d0(.d(d 0),.clk(clk),.clr(clr),.q(q 0);第12页,共34页,编辑于2022年,星期一2.2 Verilog 语法要素标识符关键词空白和注释常量字符串延时操作符第13页,共34页,编辑于2022年,星期一1.标识符标识符(identifiers)标识符是用户在描述时给标识
11、符是用户在描述时给Verilog对象起的名字对象起的名字标识符必须以字母标识符必须以字母(a-z,A-Z)或或(_)开头,后面可以是字母、数字、开头,后面可以是字母、数字、($)或或(_)。最长可以是最长可以是1023个字符个字符标识符区分大小写,标识符区分大小写,sel和和SEL是不同的标识符是不同的标识符模块、端口和实例的名字都是标识符模块、端口和实例的名字都是标识符module MUX2_1(out,a,b,sel);output out;input a,b,sel;not not1(sel_,sel);and and1(a1,a,sel_);and and2(b1,b,sel);or
12、or1 (out,a1,b1);endmoduleVerilog标识符标识符第14页,共34页,编辑于2022年,星期一合法和非法标识符合法和非法标识符 合法的:合法的:shift_reg_a busa_index bus263非法的:非法的:34net 34net /不能用数字开头a*b_net a*b_net/不能含有非字母符号*n263 n263 /不能含有非字母符号1、用有意义的有效的名字如、用有意义的有效的名字如Sum、CPU_addr等。等。2、用下划线区分词。、用下划线区分词。3、采用一些前缀或后缀,如、采用一些前缀或后缀,如时钟采用时钟采用Clk 前缀:前缀:Clk_50,Cl
13、k_CPU;低电平采用低电平采用_n 后缀:后缀:Enable_n;4、统一一定的缩写如全局复位信号、统一一定的缩写如全局复位信号Rst。5、同一信号在不同层次保持一致性,如同一时钟信号必须在各模块保持一致。、同一信号在不同层次保持一致性,如同一时钟信号必须在各模块保持一致。6、参数采用大写,如、参数采用大写,如SIZE。标识符书写注意事项:标识符书写注意事项:第15页,共34页,编辑于2022年,星期一2.关键词关键词Verilog HDL 定义了一系列保留字,叫做关键词。注意只有小写的关键词才是保留字。例如,标识符always(这是个关键词)与标识符ALWAYS(非关键词)是不同的。alw
14、ays and assign begin buf buf if0 bufif1 case casex casez cmos deassign default defparam disable edge else end endcase endmodule endfunction endprimitive endspecify endtable endtask event for force forever fork function highz0 highz1 if ifnone initial inout input integer join large macrmodule medium
15、module nand negedge nmos nor not notif0 notif1 or output parameter pmos posedge primitive pull0 pull1 pullup pulldown rcmos real realtime reg release repeat rnmos rpmos rtran rtranif0 rtranif1 scalared small specify specparam strong0 strong1 supply0 supply1table task time trantranif0 tranif1 tri tri
16、0 tri1 triand trior trireg vectored wait wand weak0 weak1 while wire wor xnor xor第16页,共34页,编辑于2022年,星期一3.空白符和注释空白符和注释module MUX2_1(out,a,b,sel);/Port declarations output out;input sel,/control input b,/*data inputs*/a;/*The netlist logic selects input”a”when sel=0 and it selects”b”when sel=1.*/not(s
17、el_,sel);and(a1,a,sel_),(b1,b,sel);/What does this/line do?or(out,a1,b1);endmodule格式自由格式自由使用空白符提高可读性及代码组织。使用空白符提高可读性及代码组织。Verilog忽略空白符除非用于分开其它的忽略空白符除非用于分开其它的语言标记。语言标记。多行注释,在多行注释,在/*/内内单行注释单行注释到行末结束到行末结束第17页,共34页,编辑于2022年,星期一4.整数常量和实数常量整数常量和实数常量整数的大小可以定义也可以不定义。整数表示为:整数的大小可以定义也可以不定义。整数表示为:其中其中 size:大小
18、,由十进制数表示的位数大小,由十进制数表示的位数(bit)表示。缺省为表示。缺省为32位位 base:数基,可为数基,可为2(b)、8(o)、10(d)、16(h)进制。缺省为进制。缺省为10进制进制 value:是所选数基内任意有效数字,包括是所选数基内任意有效数字,包括X、Z。实数常量可以用十进制或科学表示法表示。实数常量可以用十进制或科学表示法表示。Verilog中,常量中,常量(literals)可是整数也可以是实数可是整数也可以是实数12 unsized decimal(zero-extended to 32 bits)H83a unsized hexadecimal(zero-ex
19、tended to 32 bits)8b1100_ 0001 8-bit binary64hff01 64-bit hexadecimal(zero-extended to 64 bits)9O17 9-bit octal32bz01x Z-extended to 32 bits3b1010_ 1101 3-bit number,truncated to 3b1016.3 decimal notation32e-4 scientific notation for 0.00324.1E3 scientific notation for 4100第18页,共34页,编辑于2022年,星期一5.字符
20、串(字符串(string)字符串要在一行中用双引号括起来,也就是不能跨行。字符串要在一行中用双引号括起来,也就是不能跨行。字符串中可以使用一些字符串中可以使用一些C语言转义语言转义(escape)符,如符,如t n可以使用一些可以使用一些C语言格式符语言格式符(如如%b)在仿真时产生格式化输出:在仿真时产生格式化输出:”This is a normal string”This string has a t tab and ends with a new linen”This string formats a value:val=%b”Verilog中,字符串大多用于显示信息的命令中。中,字符串
21、大多用于显示信息的命令中。Verilog没有字符串数没有字符串数据类型据类型第19页,共34页,编辑于2022年,星期一6.延时说明延时说明“#”用于说明过程用于说明过程(procedural)语句和门的实例的延时,但不能用于模块的实例语句和门的实例的延时,但不能用于模块的实例化。化。module MUX2_ 1(out,a,b,sel);output out;input a,b,sel;not#1 not1(sel_,sel);and#2 and1(a1,a,sel_);and#2 and2(b1,b,sel);or#1 or1(out,a1,b1);endmodule门延时有很多类名字:门
22、延时门延时有很多类名字:门延时(gate delay),传输延时,传输延时(propagation delay),固有延时,固有延时(intrinsic delay),对象内在延时,对象内在延时(intra-object delay)第20页,共34页,编辑于2022年,星期一7.操作符操作符对数据进行运算,可分为算术操作符关系操作符相等操作符逻辑操作符其它第21页,共34页,编辑于2022年,星期一2.3 Verilog的数据类型及逻辑系统的数据类型及逻辑系统学习学习Verilog逻辑值系统逻辑值系统学习学习Verilog中不同类的数据类型中不同类的数据类型理解每种数据类型的用途及用法理解每
23、种数据类型的用途及用法数据类型说明的语法数据类型说明的语法学习内容:学习内容:第22页,共34页,编辑于2022年,星期一1.Verilog采用的四值逻辑系统采用的四值逻辑系统0,Low,False,Logic Low,Ground,VSS,Negative Assertion1,High,True,Logic High,Power,VDD,VCC,Positive AssertionX Unknown:Occurs at Logical Which Cannot be Resolved ConflictHiZ,High Impedance,Tri-Stated,Disabled Driver
24、(Unknown)第23页,共34页,编辑于2022年,星期一2.主要数据类型主要数据类型Verilog主要有三类主要有三类(class)数据类型:数据类型:net(线网)(线网):表示器件之间的物理连接表示器件之间的物理连接register(寄存器)(寄存器):表示抽象存储元件表示抽象存储元件parameters(参数参数):运行时的常数运行时的常数(run-time constants)第24页,共34页,编辑于2022年,星期一(1)net类的类型(线网)类的类型(线网)wire类型是最常用的类型,表示物理连线,只有连接功能。类型是最常用的类型,表示物理连线,只有连接功能。wire和和t
25、ri类型有相同的功能。用户可根据需要将线网定义为类型有相同的功能。用户可根据需要将线网定义为wire或或tri以提高可读性。例如,可以用以提高可读性。例如,可以用tri类型表示一个类型表示一个net有多个驱动源。或者将一个有多个驱动源。或者将一个net声明为声明为tri以指示这个以指示这个net可以是可以是高阻态高阻态Z(hign-impedance)第25页,共34页,编辑于2022年,星期一net声明声明 range delay,net_name;net_type:net类型类型range:矢量范围,以矢量范围,以MSB:LSB格式格式delay:定义与定义与net相关的延时相关的延时ne
26、t_name:net名称,一次可定义多个名称,一次可定义多个net,用逗号分开。用逗号分开。举例:举例:wire a;tri 15:0 busa;/16位三态总线位三态总线wire 0:31 w1,w2;/两个两个32位位wire,MSB为为bit0第26页,共34页,编辑于2022年,星期一(2)寄存器类的类型寄存器类的类型寄存器类有四种数据类型寄存器类有四种数据类型寄存器类型 功能 reg 可定义的无符号整数变量,可以是标量(1位)或矢量,是 最常用的寄存器类型 integer 32位有符号整数变量,算术操作产生二进制补码形式的 结果。通常用作不会由硬件实现的的数据处理。real 双精度的
27、带符号浮点变量,用法与integer相同。time 64位无符号整数变量,用于仿真时间的保存与处理realtime 与real内容一致,但可以用作实数仿真时间的保存与 处理第27页,共34页,编辑于2022年,星期一Verilog中中register声明语法声明语法举例:举例:reg a;/一个标量寄存器一个标量寄存器reg 3:0 v;/从从MSB到到LSB的的4位寄存器向量位寄存器向量reg 7:0 m,n;/两个两个8位寄存器位寄存器 integer A,B,C;/3个整数型寄存器个整数型寄存器 寄存器声明寄存器声明 range,reg_name;reg_type:寄存器类型:寄存器类型
28、range:矢量范围,以矢量范围,以MSB:LSB格式。只对格式。只对reg类型有效类型有效reg_name:寄存器名称,一次可定义多个寄存器,用逗号分开:寄存器名称,一次可定义多个寄存器,用逗号分开第28页,共34页,编辑于2022年,星期一(3)Verilog中中net和和register区别区别l线网类型用于对结构化器件之间的物理连线的建模线网类型用于对结构化器件之间的物理连线的建模。线网类型主要有。线网类型主要有wire 和和tri 两种。两种。l由于线网类型代表的是物理连接线,因此它不存贮逻辑值,由于线网类型代表的是物理连接线,因此它不存贮逻辑值,必须由器件所驱动。必须由器件所驱动。
29、l当一个当一个wire 类型的信号类型的信号没有被驱动时,缺省值为没有被驱动时,缺省值为Z(高阻)(高阻)。l信号信号没有定义数据类型时,缺省为没有定义数据类型时,缺省为wire 类型。类型。线网(线网(net)第29页,共34页,编辑于2022年,星期一l寄存器类型寄存器类型通常用于对通常用于对存储单元的描述存储单元的描述,如,如D型触发器、型触发器、ROM等。存储器类型的信号当在等。存储器类型的信号当在某种触发机制下分配了一个值,在分配某种触发机制下分配了一个值,在分配下一个值之时保留原值下一个值之时保留原值。reg 是是最常用的寄存器类型,表示无符最常用的寄存器类型,表示无符号整数变量。
30、号整数变量。l但必须注意的是,但必须注意的是,reg 类型的变量,类型的变量,不一定都是存储单元不一定都是存储单元,如在,如在always 语句中进行描述的必须用语句中进行描述的必须用reg 类型的变量。类型的变量。l寄存器类型的值可取负数寄存器类型的值可取负数,但若该变量用于表达式的运算中,但若该变量用于表达式的运算中,则按无符号类型处理则按无符号类型处理寄存器(寄存器(Register)第30页,共34页,编辑于2022年,星期一(4)参数()参数(parameters)用参数声明一个可变常量,常用于定义延时及宽度变量。用参数声明一个可变常量,常用于定义延时及宽度变量。参数定义的语法:参数
31、定义的语法:parameter ;可一次定义多个参数,用逗号隔开。可一次定义多个参数,用逗号隔开。在使用文字在使用文字(literal)的地方都可以使用参数。的地方都可以使用参数。参数的定义是局部的,只在当前模块中有效。参数的定义是局部的,只在当前模块中有效。参数定义可使用以前定义的整数和实数参数。参数定义可使用以前定义的整数和实数参数。module mod1(out,in1,in2);.parameter cycle=20,prop_ del=3,setup=cycle/2-prop_del,p1=8,x_ word=16bx,file=/usr1/jdough/design/mem_ fi
32、le.dat;.wire p1:0 w1;/A wire declaration using parameter .endmodule注意注意:参数:参数file不是不是string,而,而是一个整数,其值是所有字是一个整数,其值是所有字母的扩展母的扩展ASCII值。若值。若file=“AB”,则,则file值为值为8h4142。用法:用法:$fopen(file);$display(“%s”,file);第31页,共34页,编辑于2022年,星期一(5)寄存器数组寄存器数组(Register Arrays)在在Verilog中可以说明一个寄存器数组。中可以说明一个寄存器数组。integer
33、NUMS 7:0;/包含包含8个整数数组变量个整数数组变量 time t_vals 3:0;/4个时间数组变量个时间数组变量reg类型的数组通常用于描述存储器类型的数组通常用于描述存储器 其语法为:其语法为:reg MSB:LSB first_addr:last_addr;MSB:LSB定义存储器字的位数定义存储器字的位数 first_addr:last_addr定义存储器的深度定义存储器的深度 例如:例如:reg 15:0 MEM 0:1023;/1K x 16存储器存储器 reg 7:0 PREP hFFFE:hFFFF;/2 x 8存储器存储器描述存储器时可以使用参数或任何合法表达式描述
34、存储器时可以使用参数或任何合法表达式 parameter wordsize=16;parameter memsize=1024;reg wordsize-1:0 MEM3 memsize-1:0;第32页,共34页,编辑于2022年,星期一例如:例如:reg 7:0 Areg;/8bit寄存器寄存器7Areg0reg Amem 7:0;/8X1存储器存储器Amem70reg 7:0 Cmem 0:3;/4X8存储器存储器Cmem0370第33页,共34页,编辑于2022年,星期一存储器寻址存储器寻址(Memory addressing)存储器元素可以通过存储器索引(存储器元素可以通过存储器索引
35、(index)寻址,也就是给出元素在存储器的位置寻址,也就是给出元素在存储器的位置来寻址。来寻址。mem_name addr_exprVerilog不支持多维数组。也就是说只能对存储器字进行寻址,而不能对存不支持多维数组。也就是说只能对存储器字进行寻址,而不能对存储器中一个字的位寻址。储器中一个字的位寻址。module mems;reg 8:1 mema 0:255;/declare memory called memareg 8:1 mem_word;/temp register called mem_ word.initial begin$displayb(mema5);/显示存储器中第显示存储器中第6个字的内容个字的内容 mem_word=mema5;$displayb(mem_word8);/显示第显示第6个字的最高有效位个字的最高有效位 endendmodule若要对存储器字的某些位存若要对存储器字的某些位存取,只能通过暂存器传递取,只能通过暂存器传递第34页,共34页,编辑于2022年,星期一