收藏 分享(赏)

Verilog语法介绍.pptx

上传人:scg750829 文档编号:8176621 上传时间:2019-06-12 格式:PPTX 页数:60 大小:484.96KB
下载 相关 举报
Verilog语法介绍.pptx_第1页
第1页 / 共60页
Verilog语法介绍.pptx_第2页
第2页 / 共60页
Verilog语法介绍.pptx_第3页
第3页 / 共60页
Verilog语法介绍.pptx_第4页
第4页 / 共60页
Verilog语法介绍.pptx_第5页
第5页 / 共60页
点击查看更多>>
资源描述

1、Verilog HDL,Verilog语法中采用模块化结构,数据类型和变量、基本的运算符号等基本的语法,这些内容看起来比较简单,有许多语法对象和C语言也很类似,但是,有许多地方则是完全不同的,所以在学习Verilog语言时要特别注意不同点,并且学习Verilog语言要与硬件结构、模块联系起来,通过理解物理意义,牢牢掌握Verilog的语法。,Verilog语言简介,1. Verilog 模块结构 1 模块的定义 2 模块内容 3 变量定义 4 逻辑功能定义 2. Verilog 基本语法 1 标识符,运算符和关键字 2 常用数据类型 3 常用行为语句 4 时延 3. Verilog行为逻辑描述

2、方式,概 要,1. Verilog 模块结构,简单的Verilog HDL例子 例 8位全加器module adder8 ( cout,sum,a,b,cin ); input 7:0 a,b; / 输入端口声明input cin; output cout; / 输出端口声明output 7:0 sum; assign cout,sum=a+b+cin; endmodule assign语句:无论右边表达式操作数何时发生变化,右边表达式都会重新计算,并且在指定的延迟后给左边表达式赋值。,端口定义,功能描述,模块名(文件名),模块,a,b,cout,sum,cin,Verilog的基本设计单元是

3、“模块”(block)。一个模块是由两部分组成的,一部分是描述接口,另一部分是描述逻辑功能,即定义输入是如何影响输出的。,一、模块的定义,模块的端口声明了模块的输入输出口,其格式如下:module 模块名(口 1,口 2,口 3,口 4,); 模块的端口表示的是模块的输入还是输出口名。,1. Verilog 模块结构,6,二、模块内容,模块的内容包括 I/O说明,内容信号声明和功能定义。 1、I/O说明的格式输入口: input信号位宽-1:0端口名;输出口: output信号位宽-1:0端口名 ;输入输出口: (双向)inout 信号位宽-1:0 端口名;,I/O说明也可以写在端口声明语句里

4、。其格式如下:module module_name(input port1,input2,output port1,output port2);,两种声明方式是等价的!,内部信号说明在模块内用到的和与端口有关的变量类型有二种wire和reg。如: regwidth-1:0 R变量1, R变量2;wire width-1 :0 W变量1,W变量2; reg型数据用来表示“always”模块内的指定信号,例如触发器。 wire型数据用来表示“assign”关键字指定的组合逻辑信号。,若不指定变量类型,默认为wire!,Reg & Wire 应用举例,wire: 描述组合逻辑硬件连线reg: 寄存器

5、,wire a, b, c; assign a = b ,a,b,c,没有存储功能,如何实现诸如计数器功能?,clk,posedge 上升沿,reg 7 : 0 count;always (posedge clk)count = count + 1;,八位reg型,可以保存之前的值,实现x(t) = x(t-1)+1,8位计数器,8,四、逻辑功能定义 在Verilog 模块中有3种方法可以描述电路的逻辑功能: (1)用assign 语句assign x = ( b & c );,连续赋值语句,常用于描述组合逻辑,门元件例化,模块元件例化,例化元件名,门元件关键字,(2)用元件例化(instan

6、tiate)and myand3( f,a,b,c);,注1:元件例化即是调用Verilog HDL提供的元件; 注2:元件例化包括门元件例化和模块元件例化; 注3:每个实例元件的名字必须唯一!以避免与其它调用元件的实例相混淆。 注4:例化元件名也可以省略!,1. Verilog 模块结构,9,(3)用 “always” 块语句always (posedge clk) / 每当时钟上升沿到来时执行一遍块内语句beginif(load)out = data; / 同步预置数据elseout = data + 1 + cin; / 加1计数end,结构说明语句,注1:“always” 块语句常用于

7、描述时序逻辑,也可描述组合逻辑。 注2:“always” 块可用多种手段来表达逻辑关系,如用if-else语句或case语句。 注3: “always” 块语句与assign语句是并发执行的, assign语句一定要放在“always” 块语句之外!,1. Verilog 模块结构,10,Verilog 的初学者一定要记住以下四点:,1. 在Verilog 模块中所有过程块(如: initial块、always块)、连续赋值语句、实例引用都是并行的;,2. 它们表示的是一种通过变量名互相连接的关系;,3. 在同一模块中这三者出现的先后顺序没有关系;,4. 只有连续赋值语句assign和实例引用

8、语句可以独立于过程块而存在于模块的功能定义部分。,以上四点与C语言有很大的不同,许多与C语言类上的语句只能出现在过程块中(即initial和always块),而不能出现在模块功能定义的范围内。,2. Verilog 基本语法,1. 标识符,运算符和关键字 2. 常用数据类型 2.1 常量 2.2 变量 3. 常用行为语句 3.1 赋值语句 3.2 条件语句 3.3 循环语句 3.4 结构说明语句,一、关键字,2.1标识符,运算符和关键字,关键字事先定义好的确认符,用来组织语言结构;或者用于定义Verilog HDL提供的门元件(如and,not,or,buf)。 用小写字母定义!如always

9、,assign,begin,case,casex,else,end,for,function,if,input,output,repeat,table,time,while,wire,2.1标识符,运算符和关键字,二、标识符 任何用Verilog HDL语言描述的“东西”都通过其名字来识别,这个名字被称为标识符。 如源文件名、模块名、端口名、变量名、常量名、实例名等。 标识符可由字母、数字、下划线和$符号构成;但第一个字符必须是字母或下划线,不能是数字或$符号! 在Verilog HDL中变量名是区分大小写的! 合法的名字: A_99_Z Reset _54MHz_Clock$ Module,

10、不合法的名字: 123a $data module 7seg.v,标识符不能与关键字同名!,三、运算符,2.1标识符,运算符和关键字,Verilog HDL语言的运算符范围很广,其运算符按其功能可分为以下及类:(1) 算术运算符(= ,-, *, /,% );(2) 赋值运算符(=,=,=);(4) 逻辑运算符(5) 其他。,15,一、常量 (1)整数。在Verilog HDL中,整型常量即整常数有以下种进制表示形式:1) 二进制整数(b或B);2) 十进制整数(d或D);3) 十六进制整数(h或H);4) 八进制整数(o或O);,Verilog HDL中共有19种数据类型,数据类型是用来表示

11、数字电路硬件中的数据储存和传送元素的。,2.2 常用数据类型,16,1) ,这是一种全面的描述方式。 2) 在 这种描述方式中,数字的位宽采用缺省位宽(这由具体的机器系统决定,但至少32位)。 3) 在这种描述方式中,采用缺省进制(十进制)。 在表达式中,位宽指明了数字的精确位数。 例: b10101100 /位宽为8的二进制表示,b表示二进制。ha2 /位宽为8的十六进制表示,h表示十六进制。,数字表达方式有以下种:,2.2 常用数据类型,17,(2) x和z的值。在数字电路中,x代表不定值,z代表高阻值。如果十六进制数表示,x用来定义位二进制的状态、八进制数代表3位二进制的状态、二进制数代

12、表1位二进制的状态。z的表示方式同x类似。z还有一种表达方式是可以写作“?”。,例: 4b10x0 /位宽为4的二进制数,从低位数起第2位为不定值。4b101z /位宽为4的二进制数,从低位数起第1位为高值值。12dz /位宽为12的十进制数,其值为高阻值。12d? /位宽为12的十进制数,其值为高阻值。8h4x /位宽为8的十六进制数,其低4位值为不定值。,2.2 常用数据类型,18,(3) 负数。一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字表达式的最前面。 例: -8d5 /这个表达式代表5的补数(用八位二进制数表示)8d-5 /非法表示格式 (4) 下画线。下

13、画线可以用来分隔数的表达式以提高程序可读性,但不可以用在位宽和进制处,只能用在具体的数字之间。 例: 16b1010_1011_1111_1010 /合法格式8b_0011_1010 /非法格式但常量不说明位数时,默认值是32位。例: 10=32d10=32b1010 -1= -32d1=32hFFFFFFFF,2.2 常用数据类型,19,变量即在程序运行过程中其值可以改变的量。在Verilog HDL中变量的数据类型有很多种,介绍常用的几种。网络数据类型表示结构实体(例如门)之间的 物理连接。网络类型的变量不能储存值,而且它必须受到驱动器的驱动。常用的网络数据类型包括wire型和 tri型.

14、 wire型变量通常是用来表示单个门驱动或连续赋值语句驱动的网络型数据,tri型变量则用来表示多驱动器驱动的网络型数据。,二、变量,2.2 常用数据类型,20,wire型 wire型数据常用来表示以assign关键字指定的组合逻辑信号。 wire型信号格式如下: wiren-1:0 数据名 1,数据名2,数据名i;/共有i条总线,每条总线内有n条线路,或数据名 1,数据名2,数据名。,wire是wire型数据的确认符; n-1:0和 n:1 代表该数据的位宽,最后跟着的是数据的名字。如果一次定义多个数据,数据名之间用逗号隔开。声明语句的最后要用分号表示语句结束。,例: wire a; /定义了

15、一个1位的wire 型数据a Wire 7:0 b; /定义了一个8位的wire 型数据b,不可写作0:7,21,2. reg型寄存器是数据储存单元。寄存器数据类型的关键字reg。通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。reg型数据常用来表示“always”模块内的 指定信号,常代表触发器。reg型数据的格式如下:reg n-1:0 数据名1,数据名2,数据名i; 或 reg n:1 数据名1,数据名2,数据名i;,如下面的例子: reg rega;/定义了一个1位的名为rega的reg型数据 reg 3:0 regb;/定义了一个1位的名为regb的reg型数据

16、reg 4:1 regc,regd;/定义了一个1位的名为regc和regd的reg型数据 对于reg 型数据,其赋值语句的作用就如同改变一组触发器的存储器单元的值。reg 型数据的缺省初始值是不定值。可以赋正值,也可以赋负值。但当一个reg 型数据是一个表达式中的操作数时,它的值被当作是无符号的值,即正值。,22,reg n-1:0 存储器名m-1:0; 或 reg n-1:0 存储器名m:1;在这里,reg n-1:0定义了存储器中每一个存储单元的大小,即该存储器是一个位的寄存器;存储器名后的m-1:0或m:1则定义了该存储器中有多少个这样的寄存器,最后用分号结束。另外,在同一个数据类型声

17、明语句里,可以同时定义存储器型数据和reg 型数据。如下; parameter wordwize=16, /定义两个参数memsize=256; regwordsize-1:0 memmemsize-1:0,writereg,readreg;尽管memory型数据和reg型数据的定义格式很相似,但要注意不同之处。如一个由n个1位寄存器构成的存储器组是不同于一个n位的寄存器的。如下:,3.Memory型 menory型数据是通过扩展reg型数据的地址范围来生成的。其格式如下:,23,Regn-1:0 rega; /一个n位的寄存器Reg mema n-1;0; /一个由n个1位的寄存器构成的存储

18、器组一个由位的寄存器可以在一条赋值语句里进行赋值,而一个完整的 存储器则不行。如下:Rega=0; / 合法赋值语句Reg meman-1:0 / 非法赋值语句如果想对memory中的存储器单元进行读写操作 必须指定该单元在存储器中的地址。下面的写法是正确的。mema3=0 /给memory中的第3个存储单元赋值为0,2.3 常用行为语句,一、赋值语句 分为两类: (1)连续赋值语句assign语句,用于对wire型变量赋值,是描述组合逻辑最常用的方法之一。例 assign c=a /a、b、c均为wire型变量(2)过程赋值语句用于对reg型变量赋值,有两种方式: 非阻塞(non-block

19、ing)赋值方式:赋值符号为=,如 b = a ; 阻塞(blocking)赋值方式:赋值符号为=,如 b = a ;,25,非阻塞赋值与阻塞赋值的区别 1. 非阻塞赋值方式always (posedge clk) begin b = a ; c = b;end,非阻塞赋值在块结束时才完成赋值操作!,注:c的值比b的值落后一个时钟周期!,2.3 常用行为语句,26,2. 阻塞赋值方式always (posedge clk) begin b = a ; c = b;end,阻塞赋值在该语句结束时就完成赋值操作!,注:在一个块语句中,如果有多条阻塞赋值语句,在前面的赋值语句没有完成之前,后面的语句

20、就不能被执行,就像被阻塞了一样,因此称为阻塞赋值方式。这里c的值与b的值一样 !,2.3 常用行为语句,非阻塞赋值与阻塞赋值方式的主要区别,1. 非阻塞赋值方式always (posedge clk) begin b = a ; c = b;end,2. 阻塞赋值方式always (posedge clk) begin b = a ; c = b;end,clk,a,b,c,clk,a,b,c,应理解为: b(t) = a(t-1); c(t) = b(t-1);,28,非阻塞(non-blocking)赋值方式 ( b= a): b的值被赋成新值a的操作, 并不是立刻完成的,而是在块结束时才

21、完成; 块内的多条赋值语句在块结束时同时赋值; 硬件有对应的电路。 阻塞(blocking)赋值方式 ( b = a): b的值立刻被赋成新值a; 完成该赋值语句后才能执行下一句的操作; 硬件没有对应的电路,因而综合结果未知。,非阻塞赋值与阻塞赋值方式的主要区别,建议在初学时只使用一种方式,不要混用! 建议在可综合风格的模块中使用非阻塞赋值!,2.3 常用行为语句,二、条件语句,Verilog语法中几种条件语句和循环语句的写法,这些语句和C语言很类似。容易理解,但也有个别地方与C语言不同,如casex和casez和for循环变量的增加等。,if_else语句if语句是用来判定所给的条件是否满足

22、,根据判定的结果(真或假)决定执行给出的两种操作之一。 Verilog HDL语言提供三种形式的if语句。,30,例如:if(ab) out1=int1; else if (a=b) out1=int2; else out1=int3; 5点说明: (1) 3种形式的if语句在if后面有“表达式”,一般为逻辑表达式和关系表达式,系统对表达式的值进行判断,若为0,x,y,按假处理;若为1,按真处理,执行指定的语句; (2) 第(2)(3)种形式的if语句,在每个else前面有一个分号,整个语句结束处有一个分号,例如: if (ab) out1=int1; else out1=int2;,各有一个

23、分号;,(3) 在if和else后面可以包含一个内嵌的操作语句,也可以有多个操作语句,此时可用begin和end这两个关健词将几个语句包含起来成为一个复合块语句。,例如: if (ab)beginout1 = int1;out2 = int2;endelsebeginout1 = int2;out2 = int1;end,注意:在end后不需要加分号,因为begin_end是一个复合句。,(4) 允许一定形式的表达式简写方式,例: if (expression) 等同与 if (expression = = 1)if (! expression) 等同与 if (expression ! =

24、1),32,(5) if语句的嵌套。在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:,if (expression1) if (expression2) 语句1;( 内嵌if)else 语句2elseif (expression3) 语句3 (内嵌if)else 语句4,应当注意if与else的配对关系,else总是在它上面的最近if配对。,如果if与else的数目不一样,为了实现程序设计者的企图,可以用begin-end块语句来确定配对关系。例如: if ( ) begin if( ) 语句1 (内嵌if) end else 语句2,33,case语句,Case语句是一

25、种多分支选择语句,if语句只有两个分支可供选择,而实际应用中往往需要用到多支选择,verilog语言提供的 case语句直接处理多分支选择。Case语句通常用于微处理器的指令译码,它的一般形式如下: (1) case (表达式) endcase (2 )casez (表达式)endcase (3) casex (表达式)endcase case 分支项的一般格式如下: 分支表达式: 语句; 默认项(default 项):语句;,34,说明: (1 )case括号内的表达式为控制表达式,case分支项中的表达式称为分支表达式。控制表达式通常表示为控制信号的某些位,分支表达式则用这些控制信号的具体

26、状态值来表示,因此分支表达式又可以称为常量表达式。 (2) 当控制表达式的值与分支表达式的值相等时,就执行分支表达式后面的语句。如果所有分支表达式的值没有与控制表达式的值相匹配,就执行default项。,(3) default项可有可无,一个case语句只准有一个default项。下面使用case语句的例子,该例子中对寄存器rega译码,以确定result的值。,35,reg15:0 rega; reg9:0 result; case(rega) 16d0: result = 10b0111111111; 16d1: result = 10b1011111111; 16d2: result =

27、 10b1101111111; 16d3: result = 10b1110111111; 16d4: result = 10b1111011111; 16d5: result = 10b1111101111; 16d6: result = 10b1111110111; 16d7: result = 10b1111111011; 16d8: result = 10b1111111101; 16d9: result = 10b1111111110; Default: result = 10bx; end case,36,(4) 每个case分项的分支表达式的值必须互不相同,否则就会出现矛盾。,(

28、5) 执行完case分项后的语句,则跳出该case语句结构,终止case语句的执行。,(6) 在用case语句表达式进行比较的过程中,只有当信号的对应位的值能明确进行比较时,比较才能成功,要注意case分项的分支表达式的值。,(7) case语句的所有表达式值的位宽必须相等,只有这样,控制表达式和分支表达式才能进行对应位的比较。一个经常犯的错误是用bx,bz来代替nbx,nbz,这样写是不对的,因为信号x,z的默认宽度是机器的字节宽度,通常是32位(此处n是case控制表达式的位宽)。,比较 case,casez,casex,case(a) 2b1x : out = 1; /只有a=1x ca

29、sez(a) 2b1x : out = 1; /可以a=1x, a=1z casex(a) 2b1x : out = 1; /可以a=1x, a=1z, a=10,a=11,38,下面将给出case,casez,casex的真值。,39,(1)与case语句中的控制表达式和分支表达式这种比较结构相比,if_else_if结构中的条件表达式更为直观一些。 (2)对于那些分支表达式中存在值为不定值x和高阻值z的位时,case语句提供了处理这种情况的手段。下面的两个例子介绍了处理值为x,z位的case语句。,Case语句与if_else_if语句的主要有二点区别,40,例 Case (select1

30、:2)2b00: result=0;2b01: result=flaga;2b0x2b0z: result=flaga?bx:0;2b10: result=flagb;2bx0,2bz0: result=flagb?bx:0;default: result=bx;,41,例 case(sig)1bz: $display(“signal is floating”);1bx: $ display(“signal is unknown”);default: $ display(“signal is %b”,sig); endcase,2.3 常用行为语句,三、 循环语句,循环语句分为4种: for语

31、句通过3个步骤来决定语句的循环执行: (1)给控制循环次数的变量赋初值。 (2)判定循环执行条件,若为假则跳出循环;若为真,则执行指定的语句后,转到第(3)步。 (3)修改循环变量的值,返回第(2)步。 repeat语句连续执行一条语句n次 while语句执行一条语句,直到循环执行条件不满足;若一开始条件即不满足,则该语句一次也不能被执行! forever语句无限连续地执行语句,可用disable语句中断!,43,1.for语句,for (表达式1;表达式2;表达式3)语句,for(循环变量赋初值;循环执行条件;循环变量增值)执行语句,两条语句,一般形式,简单应用形式,相当于采用while语句

32、建立的循环结构: begin循环变量赋初值;while(循环执行条件)begin循环变量增值;end end,for语句比while语句简洁!,44,2.repeat语句 连续执行一条或多条语句n次。,repeat (循环次数表达式)语句,repeat (循环次数表达式)beginend,执行语句为多条语句,或,格式,只有部分综合工具可以综合此语句!,45,3.while和forever语句 1.while语句 有条件地执行一条或多条语句。 首先判断循环执行条件表达式是否为真。若为真,则执行后面的语句或语句块;然后再回头判断循环执行条件表达式是否为真,若为真,再执行一次后面的语句;如此不断,直

33、到条件表达式不为真。,while (循环执行条件表达式)语句,while (循环执行条件表达式)beginend,或,格式,46,2.forever语句 无条件连续执行forever后面的语句或语句块。,forever 语句,forever beginend,或,常用在测试模块中产生周期性的波形,作为仿真激励信号。 常用disable语句跳出循环!,注:不同于always语句,不能独立写在程序中,一般用在initial语句块中!,格式,initialbegin : Clocking clk = 0;#10 forever #10 clk = !clk;end initialbegin : St

34、imulus disable Clocking; / 停止时钟end,一般情况下 是不可综合的!常用在测试文件中,2.3 常用行为语句,四、结构说明语句,initial说明语句只执行一次 always说明语句不断重复执行,直到仿真结束 task说明语句可在程序模块中的一处或多处调用 function说明语句可在程序模块中的一处或多处调用,1、always块语句 包含一个或一个以上的声明语句(如:过程赋值语句、任务调用、条件语句和循环语句等),在仿真运行的全过程中,在定时控制下被反复执行。,在always块中被赋值的只能是register型变量(如reg,integer,real,time)。

35、每个always块在仿真一开始便开始执行,当执行完块中最后一个语句,继续从always块的开头执行。,always ,注1:如果always块中包含一个以上的语句,则这些语句必须放在begin_end块中!,格式,always (posedge clk or negedge clear)begin if(!clear) qout = 0; /异步清零else qout = 1;end,2.3 常用行为语句,一个always的例子,always的时间控制可以为沿触发,也可为电平触发。 关键字posedge表示上升沿;negedge表示下降沿。,常用于描述时序逻辑,常用于描述组合逻辑,always

36、 (posedge clock or posedge reset)begin end,always (a or b or c)begin end,由两个沿触发的always 块,由多个电平触发的always 块,电平触发当电平发生变化时执行 边沿触发当边沿到来时执行,2.3 常用行为语句,51,2、initial语句,initialbegin语句1;语句2;语句n;end,格式,例3.9.4 利用initial语句生成激励波形。,initialbegininputs = b000000; #10 inputs = b011001; #10 inputs = b011011;#10 inputs

37、 = b011000; #10 inputs = b001000;end,用途,在仿真的初始状态对各变量进行初始化; 在测试文件中生成激励波形作为电路的仿真信号。,2.3 常用行为语句, parameter size=16; reg3:0 addr; reg reg1; reg7:0 memory0:15; initialbeginreg1 = 0; for(addr=0;addrsize;addr=addr+1); memoryaddr=0;end ,例 对各变量进行初始化。,使用编译指令将时间单位与物理时间相关联。这样的编译器指令需在模块描述前定义,如下所示:此语句说明时延时间单位为1 n

38、 s并且时间精度为100ps (时间精度是指所有的时延必须被限定在0 . 1 n s内)。如果此编译器指令所在的模块包含上面的连续赋值语句, #2 代表2 n s。 下面是带时延的连续赋值语句实例。,2.4 时延,54,timescale语句 时间尺度语句用于定义跟在该命令后模块的时间单位和时间精度。,timescale / ,时间单位用于定义模块中仿真时间和延迟时间的基准单位; 时间精度用来声明该模块的仿真时间和延迟时间的精确程度。 在同一程序设计里,可以包含采用不同时间单位的模块。此时用最小的时间精度值决定仿真的时间单位。,格式,2.4 时延,例子,例 timescale语句应用举例。 t

39、imescale 10ns / 1ns /时间单位为10ns,时间精度为1ns reg sel;initialbegin#10 sel = 0; / 在10ns10时刻,sel变量被赋值为0#10 sel = 1; / 在10ns20时刻,sel变量被赋值为1end,行为描述方式使用过程化结构建模; 数据流方式使用连续赋值语句方式建模; 用数据流描述方式对一个设计建模的最基本的机制就是使用连续赋值语句。在连续赋值语句中,某个值被指派给线网变量。连续赋值语句的语法为:结构化方式使用门和模块实例语句描述建模。,3. Verilog行为逻辑描述方式,例子,timescale 1ns / 1ps mo

40、dule lam_ctrl(S1, S2,S3, F);input S1;input S2;input S3;output F;wire AND_NS1NS2S3;wire AND_NS1S2NS3;wire AND_S1NS2NS3;wire AND_S1S2S3;wire NS1;wire NS2;wire NS3;,AND3 AND_1 (.I0(NS3), .I1(NS2), .I2(S1), .O(AND_S1NS2NS3);AND3 AND_2 (.I0(NS3),.I1(S2), .I2(NS1), .O(AND_NS1S2NS3);AND3 AND_3 (.I0(S3), .I

41、1(NS2),.I2(NS1), .O(AND_NS1NS2S3);AND3 AND_4 (.I0(S3), .I1(S2), .I2(S1), .O(AND_S1S2S3);INV INV1 (.I(S1), .O(NS1);INV INV2 (.I(S2), .O(NS2);INV INV3 (.I(S3), .O(NS3);OR4 OR_1 (.I0(AND_S1S2S3), .I1(AND_NS1NS2S3), .I2(AND_NS1S2NS3), .I3(AND_S1NS2NS3), .O(F); Endmodule,门级描述,例子,module lamp_controller(cl

42、k, S1, S2, S3, F); parameter COUNTER = 28; / 计数器的位数:28位input clk, S1, S2, S3; / 输入:时钟、三个按钮output F; / 输出:控制灯的亮、灭wire w;reg y;reg COUNTER-1 : 0 count;initial count = 0;assign w = S1 S2 S3;always (posedge clk)if (w | count 28hFFFF_FFF) beginy = 1;count = count + 1;end else beginy = 0;count = count;endassign F = y; endmodule,行为描述:带有延时的楼道灯,两种变量类型 wire 和 reg 并行性:assign 语句 块的含义: initial 块 和 always块 两种赋值语句: 阻塞赋值 “ = ” 非阻塞赋值 “= ”,要 点,通过Verilog语言行为描述,改进楼道灯控制程序,要求为: 当三个按钮开关任一个按下后,开灯; 开灯后延迟一数秒,自动关闭。要求:1. 首先对程序进行仿真实验,仿真时,请修改程序代码,使得关灯延迟时间在数个时钟周期,并验证仿真结果正确性。2. 将程序下载到开发板上,进行验证。,实验内容,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报