EDA数字系统设计3_第1页
EDA数字系统设计3_第2页
EDA数字系统设计3_第3页
EDA数字系统设计3_第4页
EDA数字系统设计3_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、EDA数字系统设计数字系统设计第二章 Verilog HDL语言(基础) 介绍Verilog HDL, 内容包括:HDL 概述Verilog HDL基本结构语言要素与语法规则Verilog HDL建模方法Verilog HDL组合逻辑和时序逻辑语句结构Verilog HDL 程序设计中需要注意的问题第二讲 Verilog HDL基本结构语言要素与语法规则 Verilog模块module Verilog语法要素 Verilog数据类型及逻辑系统2.1 模块module模块是verilog设计中的基本功能块,在第一讲有简单交待,这里详细介绍模块内部构成module 模块名 ( 端口列 表 );端口

2、声明端口声明, ,参数声明参数声明wire,reg和其它类型的变量声明数据流语句(ssign)低层模块实例lwys和initil块,所有行为语句都在块内任务和函数endmodule必须出现必须出现可选可选module能够表示:能够表示:物理块,如物理块,如IC或或ASIC单元单元逻辑块,如一个逻辑块,如一个CPU设计的设计的ALU部分部分整个系统整个系统每一个模块的描述从关键词每一个模块的描述从关键词module开始,有一个名称(如开始,有一个名称(如SN74LS74,DFF,ALU等等),由关键词等等),由关键词endmodule结束结束。 module内部的组成: 输入/输出说明:inpu

3、t、output 变量声明 (功能描述方法): 数据流语句 低层模块实例 行为描述块 任务和函数 每一部分在module内部出现的顺序是任意的。 一个verilog源文件中可以有多个模块,且对排列顺序不做要求。l端口(Terminal) 端口是模块与外界环境交互的接口例如IC芯片的输入、输出引脚就是它的端口。对于外部环境来讲,模块内部是不可见的,对模块的调用(实例引用)只能通过其端口进行。这种特点为设计者提供了很大的灵活性:只要接口保持不变,模块内部的修改并不会影响到外部环境我们也常常将端口称为终端(Terminl)。模块端口等价于芯片的管脚(模块端口等价于芯片的管脚(pin)模块通过端口与外

4、部通信模块通过端口与外部通信l端口列表和端口声明端口列表和端口声明端口在模块名字后的括号中列出端口可以说明为input, output及inout端口等价于硬件的引脚(pin)input 输入端口输入端口output 输出端口输出端口inout 双向端口双向端口端口声明也可以采用类似也可以采用类似ANSIC格式来声明端口格式来声明端口/D 触发器触发器module D_FF (input d, clk, clr, output reg q,qb);endmodulemodule adder ( cout,sum,a,b,cin ); input 2:0 a,b; input cin; outp

5、ut cout; output 2:0 sum; assign cout,sum=a+b+cin;endmodule例设计三位全加器这个例子描述了一个三位的加法器。从例子中可以看出整个Verilog HDL程序是嵌套在module和endmodule声明语句里的,只出现了一个ssign语句。adderaddersum2:0a2:0a2:0b2:0b2:0cincincoutcout模块名端口列表端口声明数据流语句例SR触发器模块/SR 触发器触发器module SR_FF (Q, Q_n,S,R);output Q, Q_n; /端口声明端口声明input S,R;nand n1(Q, S,Q

6、_n);nand n2(Q_n,R,Q);endmodule 模块中的5个部分并没全部出现,只出现在低层次模块实例化nnd为verilog中的与非门门级原语部件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 该模块内包括lwys行为块语句lwys块行为描述语句4位寄存器设计module

7、D_ (d, clk, clr, q, qb); .endmodulemodule REG4( d, clk, clr, q, qb); output 3: 0 q, qb; input 3: 0 d; input clk, clr; D_ d0 (d 0, clk, clr, q 0, qb 0); D_ d1 (d 1, clk, clr, q 1, qb 1); D_ d2 (d 2, clk, clr, q 2, qb 2); D_ d3 (d 3, clk, clr, q 3, qb 3);endmodule 模块中只出现在低层次模块实例化可以将模块的实例通过端口连接起来构成一个大的

8、系可以将模块的实例通过端口连接起来构成一个大的系统或元件。统或元件。在上面的例子中,在上面的例子中,REG4有模块有模块DFF的四个实例。注的四个实例。注意,每个实例都有自己的名字意,每个实例都有自己的名字(d0, d1, d2, d3)。实例。实例名是每个对象唯一的标记,通过这个标记可以查看每名是每个对象唯一的标记,通过这个标记可以查看每个实例的内部。个实例的内部。实例中端口的次序与模块定义的次序相同。实例中端口的次序与模块定义的次序相同。模块实例化与调用程序不同。每个实例都是模块的一模块实例化与调用程序不同。每个实例都是模块的一个完全的拷贝,相互独立、并行。个完全的拷贝,相互独立、并行。模

9、块实例化(module instnces).端口与外部信号的连接端口与外部信号的连接在调用模块时,可以用在调用模块时,可以用顺序连接顺序连接和和按名连接按名连接把模块定义的把模块定义的端口与外部信号连接起来端口与外部信号连接起来顺序连接:需要连接的顺序连接:需要连接的信号信号需要与模块声明的端口列表一致;需要与模块声明的端口列表一致;按名连接:端口和外部信号按名字连接在一起按名连接:端口和外部信号按名字连接在一起. D_ d0 (d 0, clk, clr, q 0, qb 0); D_ d1 (d 1, clk, clr, q 1, qb 1); D_ d2 (d 2, clk, clr,

10、q 2, qb 2); D_ d3 (d 3, clk, clr, q 3, qb 3);当设计大规模系统时,端口太多,记住端口顺序不大可当设计大规模系统时,端口太多,记住端口顺序不大可能,可以采用按名连接方法。能,可以采用按名连接方法。 不需要连接的端口直接忽略掉即可D_ d0 (.d(d 0), .clk(clk), .clr(clr), .q(q 0), .qb(qb 0); D_ d0 (.d(d 0), .clk(clk), .clr(clr), .q(q 0); 2.2 Verilog 语法要素 标识符 关键词 空白和注释 常量 字符串 延时 操作符1.标识符标识符(identif

11、iers)标识符是用户在描述时给标识符是用户在描述时给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 and

12、1 (a1, a, sel_); and and2 (b1, b, sel); or or1 (out, a1, b1);endmoduleVerilog标识符合法和非法标识符合法和非法标识符 合法的:合法的: shift_reg_a busa_index bus263非法的:34net /不能用数字开头*b_net /不能含有非字母符号*n263 /不能含有非字母符号1、大小写区分2、用有意义的有效的名字如Sum 、CPU_ddr等。3、用下划线区分词。4、采用一些前缀或后缀,如时钟采用Clk 前缀:Clk_50,Clk_CPU;低电平采用_n 后缀:Enble_n;5、统一一定的缩写如全局

13、复位信号Rst。6、同一信号在不同层次保持一致性,如同一时钟信号必须在各模块保持一致。7、参数采用大写,如SIZE 。标识符书写注意事项: Verilog HDL 定义了一系列保留字,叫做关键词。注意只有小写的关键词才是保留字。例如,标识符lwys (这是个关键词)与标识符LWYS(非关键词)是不同的。lwys nd ssign begin bu bu i0 bui1 cse csex csez cmos dessign deult deprm disble edge else end endcse endmodule endunction endprimitive endspeciy end

14、tble endtsk event or orce orever ork unction highz0 highz1 i inone initil inout input integer join lrge mcrmodule medium module nnd negedge nmos nor not noti0 noti1 or output prmeter pmos posedge primitive pull0 pull1 pullup pulldown rcmos rel reltime reg relese repet rnmos rpmos rtrn rtrni0 rtrni1

15、sclred smll speciy specprm strong0 strong1 supply0 supply1tble tsk time trntrni0 trni1 tri tri0 tri1 trind trior trireg vectored wit wnd wek0 wek1 while wire wor xnor xormodule MUX2_1 (out, , b, sel); / Port declrtions output out; input sel, / control input b, /* dt inputs */ ;/* The netlist logic s

16、elects input ” when sel = 0 nd it selects ”b” when sel = 1.*/ not (sel_, sel); nd (1, , sel_), (b1, b, sel); / Wht does this / line do? or (out, 1, b1);endmodule格式自由使用空白符提高可读性及代码组织。Verilog忽略空白符除非用于分开其它的语言标记。多行注释,在/* */内单行注释单行注释到行末结束到行末结束整数的大小可以定义也可以不定义。整数表示为:整数的大小可以定义也可以不定义。整数表示为: 其中其中 size :大小,由十进制

17、数表示的位数大小,由十进制数表示的位数(bit)表示。缺省为表示。缺省为32位位 base:数基,可为数基,可为2(b)、8(o)、10(d)、16(h)进制。缺省为进制。缺省为10进制进制 value:是所选数基内任意有效数字,包括是所选数基内任意有效数字,包括X、Z。实数常量可以用十进制或科学表示法表示。实数常量可以用十进制或科学表示法表示。 Verilog中,常量(literls)可是整数也可以是实数12 unsized decimal (zero-extended to 32 bits)H83a unsized hexadecimal (zero- extended to 32 bit

18、s)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整数常量和实数常量整数常量和实数常量整数的大小可以定义也可以不定义。整数表示

19、为:整数的大小可以定义也可以不定义。整数表示为:数字中(数字中(_)忽略,便于查看)忽略,便于查看没有定义大小没有定义大小(size)整数缺省为整数缺省为32位位缺省数基为十进制缺省数基为十进制数基数基(base)和数字和数字(16进制进制)中的字母无大小写之分中的字母无大小写之分当数值当数值value大于指定的大小时,截去高位。如大于指定的大小时,截去高位。如 2b1101表表示的是示的是2b01实数常量实数常量实数可用科学表示法或十进制表示实数可用科学表示法或十进制表示科学表示法表示方式:科学表示法表示方式: , 表示:表示: 尾数尾数10指数指数5.字符串(字符串(string)字符串要

20、在一行中用双引号括起来,也就是不能跨行。字符串要在一行中用双引号括起来,也就是不能跨行。字符串中可以使用一些字符串中可以使用一些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中,字符串大多用于显示信息的命令中。Verilog没有字符串数据

21、类型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 门延时有很多类名字:门延时门延时有很多类名字:门延时(gate delay),传输延时

22、,传输延时(propagation delay),固有延时,固有延时(intrinsic delay),对象内在延,对象内在延时时(intra-object delay)7. 操作符操作符 对数据进行运算,可分为算术操作符关系操作符相等操作符逻辑操作符其它算术操作符算术操作符 加减乘除:+, -, *, / 取模:% 算术操作结果的长度由最长的操作数决定关系操作符 大于: 小于: 不大于:=相等关系操作符相等关系操作符 逻辑相等:= 逻辑不等:!= 全等:=z, x等位严格相等 非全等:!= 例:对于A=2b1x和 B=2b1x,则 A=B结果为x, A=B结果为1逻辑操作符逻辑操作符 逻辑与

23、:& 逻辑或:| 逻辑非:! 逻辑操作的最终结果为1或0 对于向量操作,非0向量作为1处理 例:A=3b110, B=3b0 A|B 结果为1按位操作符按位操作符 一元非: 二元与:& 二元或:| 二元异或: 二元同或:归约操作符 归约与:& 归约与非:& 归约或:| 归约或非:| 归约异或: 归约同或: 例:=b1010,则 &=0, |=1, =1移位操作符 左移: 右移:2为4b0001, A2为4b1100条件操作符 根据条件表达式的值选择表达式 例:wire Result=ddr?Code:CodeB; 当ddr为1时,Result=Code

24、当ddr为0时,Result=CodeB连接和复制操作连接和复制操作 连接:将小表达式连接为大表达式 例:wire 7:0 Dbus;assign Dbus=Dbus3:0, Dbus7:4/将Dbus的低4位和高4位互换 Verilog的数据类型及逻辑系统的数据类型及逻辑系统 学习学习Verilog逻辑值系统逻辑值系统 学习学习Verilog中不同类的数据类型中不同类的数据类型 理解每种数据类型的用途及用法理解每种数据类型的用途及用法 数据类型说明的语法数据类型说明的语法学习内容:0, Low, lse, Logic Low, Ground,VSS, Negtive ssertion1, H

25、igh, True, Logic High, Power,VDD, VCC, Positive ssertionX Unknown: Occurs t Logicl Which Cnnot be Resolved ConlictHiZ, High Impednce, Tri- Stted,Disbled Driver (Unknown)Verilog主要有三类(clss)数据类型: net (线网)(线网) : 表示器件之间的物理连接表示器件之间的物理连接 register (寄存器)(寄存器) :表示抽象存储元件表示抽象存储元件 parameters(参数参数) : 运行时的常数运行时的常数

26、(run-time constants)(1)net(线网)(线网)net需要被持续的驱动,驱动它的可以是门和模块。 当net驱动器的值发生变化时, Verilog自动的将新值传送到net上。在例子中,线网out由or门驱动。当or门的输入信号变化时将传输到线网net上。net类的类型(线网)类的类型(线网) 有多种有多种net类型用于设计类型用于设计(design-specific)建模和工艺建模和工艺(technology-specific)建模建模 没有声明的没有声明的net的缺省类型为的缺省类型为 1 位位(标量标量)wire类型。但类型。但这个缺省类型可由下面的编译指导改变:这个缺省

27、类型可由下面的编译指导改变: default_nettype net类型类型功功 能能wire, trisupply1, supply0wor, triorwand, triandtriregtri1, tri0标准内部连接线标准内部连接线(缺省缺省)电源和地电源和地多驱动源线或多驱动源线或多驱动源线与多驱动源线与能保存电荷的能保存电荷的net无驱动时上拉无驱动时上拉/下拉下拉综合编译综合编译器不支持器不支持的的net类型类型net类的类型(线网)类的类型(线网)wire类型是最常用的类型,只有连接功能。类型是最常用的类型,只有连接功能。wire和和tri类型有相同的功能。用户可根据需要将线网

28、定义为类型有相同的功能。用户可根据需要将线网定义为wire或或tri以以提高可读性。例如,可以用提高可读性。例如,可以用tri类型表示一个类型表示一个net有多个驱动源。或者将一有多个驱动源。或者将一个个net声明为声明为tri以指示这个以指示这个net可以是高阻态可以是高阻态Z(hign-impedance)。可推。可推广至广至wand和和triand、wor和和triorwand、wor有线逻辑功能;与有线逻辑功能;与wire的区别见下页的表。的区别见下页的表。trireg类型很象类型很象wire类型,但类型,但trireg类型在没有驱动时保持以前的值。这类型在没有驱动时保持以前的值。这个

29、值的强度随时间减弱。个值的强度随时间减弱。修改修改net缺省类型的编译指导:缺省类型的编译指导: default_nettype nettype不能是不能是supply1和和supply0。net类在发生逻辑冲突时的决断类在发生逻辑冲突时的决断 Verilog有预定义的决断函数有预定义的决断函数 支持与工艺无关的逻辑冲突决断支持与工艺无关的逻辑冲突决断wire-and用于集电极开路电路用于集电极开路电路wire-or用于射极耦合电路用于射极耦合电路(2)寄存器类寄存器类 (register) 寄存器类型在赋新值以前保持原值寄存器类型在赋新值以前保持原值 寄存器类型大量应用于行为模型描述及激励描

30、述。在下面的例子寄存器类型大量应用于行为模型描述及激励描述。在下面的例子中,中,reg_a、reg_b、reg_sel用于施加激励给用于施加激励给2:1多路器。多路器。 用行为描述结构给寄存器类型赋值。给用行为描述结构给寄存器类型赋值。给reg类型赋值是在过程块中。类型赋值是在过程块中。寄存器类的类型寄存器类的类型 寄存器类有四种数据类型寄存器类有四种数据类型寄存器类型 功能 reg 可定义的无符号整数变量,可以是标量(1位)或矢量,是 最常用的寄存器类型 integer 32位有符号整数变量,算术操作产生二进制补码形式的 结果。通常用作不会由硬件实现的的数据处理。real 双精度的带符号浮点

31、变量,用法与integer相同。time 64位无符号整数变量,用于仿真时间的保存与处理realtime 与real内容一致,但可以用作实数仿真时间的保存与 处理不要混淆寄存器数据类型与结构级存储元件,如udp_d(3)Verilog中中net和和register区别区别线网类型用于对结构化器件之间的物理连线的建模。线网类型主要有wire 和tri 两种。由于线网类型代表的是物理连接线,因此它不存贮逻辑值,必须由器件所驱动。当一个wire 类型的信号没有被驱动时,缺省值为Z(高阻)。信号没有定义数据类型时,缺省为wire 类型。线网(net)寄存器类型通常用于对存储单元的描述,如D型触发器、R

32、OM等。存储器类型的信号当在某种触发机制下分配了一个值,在分配下一个值之时保留原值。 reg 是最常用的寄存器类型,表示无符号整数变量。但必须注意的是,reg 类型的变量,不一定都是存储单元,如在lwys 语句中进行描述的必须用reg 类型的变量。寄存器类型的值可取负数,但若该变量用于表达式的运算中,则按无符号类型处理寄存器(Register)(4)Verilog中中net和和register声明语法声明语法 net声明声明 range delay , net_name;net_type: net类型类型range: 矢量范围,以矢量范围,以MSB:LSB格式格式delay: 定义与定义与ne

33、t相关的延时相关的延时net_name: net名称,一次可定义多个名称,一次可定义多个net, 用逗号分开。用逗号分开。 举例:wire ; wnd w; / 一个标量wnd类型net tri 15: 0 bus; / 16位三态总线wire 0: 31 w1, w2; / 两个32位wire,MSB为bit0Verilog中中net和和register声明语法声明语法 举例:举例:reg a; /一个标量寄存器一个标量寄存器reg 3: 0 v; / 从从MSB到到LSB的的4位寄存器向量位寄存器向量reg 7: 0 m, n; / 两个两个8位寄存器位寄存器 integer A, B,C

34、;/3个整数型寄存器个整数型寄存器寄存器声明 rnge , reg_nme;reg_type:寄存器类型rnge: 矢量范围,以MSB:LSB格式。只对reg类型有效reg_nme :寄存器名称,一次可定义多个寄存器,用逗号分开(5)端口的数据类型选择端口的数据类型选择module top;wire y; reg a, b;DUT u1 (y, a, b) ;initial begina = 0; b = 0; #5 a = 1; endendmodulemodule DUT (Y, , B);output Y;input , B;wire Y, , B;nd (Y, , B) ;endmod

35、ule输入端口可以由net/register驱动,但输入端口只能是net输出端口可以是net/register类型,输出端口只能驱动net在过程块中只能给register类型赋值若Y,B说明为reg则会产生错误。in1in2OBY双向端口输入/输出只能是net类型从模块内部来讲,输入端口必须为线网从模块内部来讲,输入端口必须为线网(net)数据类型;数据类型;从模块外部来看,输入端口可以连接到线网从模块外部来看,输入端口可以连接到线网(net)或或reg数据类型的变量。数据类型的变量。 从模块内部来讲,输出端口可以为线网(net)或reg数据类型; 从模块外部来看,输出端口必须连接到线网(ne

36、t)数据类型的变量。 从模块内部来讲,输入/输出端口必须为线网(net)数据类型; 从模块外部来看,输入/输出端口必须连接线网(net)数据类型的变量。 在进行调试或模块调用时,verilog允许模块内、外位宽不同,一般情况下编译器会给出警告。 Verilog允许模块实例端口保持未连接状态。 选择数据类型注意事项选择数据类型注意事项模块的输入只能是模块的输入只能是net型型元件间的连接使用元件间的连接使用net型型在过程中的赋值的变量只能是在过程中的赋值的变量只能是reg型。型。net型可由型可由net、reg型驱动,型驱动,reg型不能驱动型不能驱动reg型型/D 触发器触发器module

37、Top reg s1,s2,a,b;wire c;/调用调用D_FF模块,这里命模块,这里命名为名为dff0D_FF dff0 (a, b,c,s1,s2);endmodule例端口的互连例端口的互连 /D 触发器 module Top reg ,b; wire c,s1,s2; /调用D_模块,这里命名为d0 D_ d0 (, b,c,s1,s2); endmodule /D 触发器 module D_ (d, clk,clr,q,qb); output q, qb; input d,clk,clr; reg q, qb;/输出端口q, qb值保存 . . . endmodule4.参数(参数(parameters) 用参数声明一个可变常量,常用于定义延时及宽度变量。用参数声明一个可变常量,常用于定义延时及宽度变量。 参数定义的语法:参数定义的语法:parameter ; 可一次定义多个参数,用逗号隔开。可一次定义多个参数,用逗号隔开。 在使用文字在使用文字(literal)的地方都可以使用参数。的地方都可以使用参数。 参数的定义是局部的,只在当前模块中有效。参数的定义是局部的,只在当前模块中有效。 参数定义可使用以前定义的整数和实数参数。参数定义可使用以前定义的整数和实数参数。module mod1( out, in1, in2); . . .prmeter cyc

温馨提示

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

评论

0/150

提交评论