数字逻辑复习三_第1页
数字逻辑复习三_第2页
数字逻辑复习三_第3页
数字逻辑复习三_第4页
数字逻辑复习三_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

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

文档简介

1、1Verilog 语法21 模块的结构Verilog结构位于module和endmodule声明语句之间,每个Verilog程序包括4 4个个主要部分:端口定义端口定义I/OI/O说明说明内部信号声明内部信号声明功能定义功能定义3模块端口定义格式module 模块名(口1,口2,口3,)引用模块的两种连接方法(1)在引用时严格按模块定义的端口顺序来连接,不用标明原模块定义时规定的端口名(2)在引用时用“. .”符号,标明定义时规定的端口名不必严格按端口顺序对应4I/O说明的格式输入口 input范围;输出口 output 范围;输入/输出口 inout 范围;I/O说明也可以写在端口声明里。m

2、odule module_name(input in_port1,input in_port2,output out_port1,output out_port2);module test_width(b,a);input6:5 a;output3:2 b; assign b=a;endmodule5内部信号说明内部信号说明reg范围 变量1,变量2;wire范围 变量1,变量2;模块中实现逻辑功能的模块中实现逻辑功能的3 3种方法种方法(1)assign assign c=a&b;(2)用实例元件 and #2 u1(q,a,b);(3)用always块assign语句是描述组合逻辑

3、最常用的方法之一。always块既可用于描述时序逻辑,又可用于组合逻辑。6Verilog语言要点(1)在Verilog模块中所有过程块(如initial块、always块)、连续赋值语句、实例引用都是并行的(2)它们表示的是一种通过变量名互相连接的关系(3)在同一模块中这三者出现的先后次序没有关系(4)只有连续赋值语句assign和实例引用语句可以独立于过程块而存在于模块的功能定义部分72 数据类型及其常量和变量4种逻辑值0 1 z(高阻) x (不定值)常量 在程序运行过程中,其值不能被改变的量称为常量。81 数字(1)整数二进制整数 b或B十进制整数 d或D十六进制整数 h或H八进制整数

4、o或O3.2.1 常量9数字表达方式4b1110 /4位二进制数12habc /12位十六进制数16d255 /16位十进制数采用默认位宽,与仿真器和使用的计算机有关(最小为32位)hc3 /32位16进制数o21 /32位8进制数10默认为十进制数采用默认位宽,与仿真器和使用的计算机有关(最小为32位)326/32位十进制数(2)x和z值一个x可以用来定义十六进制数的四位二进制数的状态,八进制数的三位,二进制数的一位。z的表示方式同x类似。z还有一种表达方式是可以写作?。在使用case表达式时建议使用这种写法,以提高程序的可读性。4b10 x0 /位宽为4的二进制数从低位数起第二位为不定值4

5、b101z /位宽为4的二进制数从低位数起第一位为高阻值12dz /位宽为12的十进制数其值为高阻值12d? /位宽为12的十进制数其值为高阻值8h4x /位宽为8的十六进制数其低四位值为不定值11(3)负数一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前面。注意减号不可以放在位宽和进制之间也不可以放在进制和具体的数之间。见下例:-8d5 /这个表达式代表5的补数(用八位二进制数表示)8d-5 /非法格式(4)下划线(underscore_)下划线可以用来分隔开数的表达以提高程序可读性。但不可以用在位宽和进制处,只能用在具体的数字之间。16b1010_1

6、011_1111_1010 /合法格式8b_0011_1010 /非法格式122 参数(Parameter)型在Verilog HDL中用parameter来定义常量, 其说明格式如下:parameter 参数名1表达式,参数名2表达式, , 参数名n表达式;parameter是参数型数据的确认符,确认符后跟着一个用逗号分隔开的赋值语句表。在每一个赋值语句的右边必须是一个常数表达式。也就是说,该表达式只能包含数字或先前已定义过的参数。parameter e=25, f=29; /定义二个常数参数parameter r=5.7; /声明r为一个实型参数parameter byte_size=8,

7、 byte_msb=byte_size-1; /用常数表达式赋值parameter average_delay = (r+f)/2; /用常数表达式赋值参数型常数经常用于定义延迟时间和变量宽度。13在实例化模块时改变参数值module two_delay(a,b,c,d);output c,d;input a,b;reg c,d;parameter delay1=2,delay2=2; always (a) c= #delay1 a; always (b) d=#delay2 b; endmodule 14module top_delay2(a1,b1,c1,d1);input a1,b1;o

8、utput c1,d1; two_delay #(5,10) u1(.a(a1),.b(b1),.c(c1),.d(d1); endmodulemodule top_delay(a1,b1,c1,d1);input a1,b1;output c1,d1; two_delay #(.delay1(5),.delay2(10) u1(.a(a1),.b(b1),.c(c1),.d(d1); endmodule15defparam 可以在一个模块中改变另外一个模块的参数。module block(b,a); input a;output b;reg b;parameter delay=0; alwa

9、ys (a) b=#delay a; endmodule 16module block_up(a,b,c,d);input a,b;output c,d;wire temp1,temp2; assign temp1=a&b; assign temp2=a; block u1(.b(c),.a(temp1); block u2(.b(d),.a(temp2); endmodule 17module test_block_up2; reg a_in,b_in; wire c_out,d_out; defparam test_block_up2.test_u.u1.delay=5, test

10、_block_up2.test_u.u2.delay=10; block_up test_u(.a(a_in),.b(b_in),.c(c_out),.d(d_out); initial begin a_in=0; b_in=0; #20 a_in=1; #100 b_in=1; #100 a_in=0; endendmodule 183.2.2 变量1 网络型(线网,net )线网的默认值为z(trireg例外,默认值为x)本课程主要讨论wire wire型数据常用来表示用于以assign关键字指定的组合逻辑信 号。 Verilog程序模块中输入输出信号类型缺省时自动定义为wire 型。 w

11、ire型信号可以用作任何方程式的输入,也可以用作“assign”语句或实例元件的输出。19格式:wire n-1:0 数据名1,数据名2,数据名i; /共有i条总线,每条总线内有n条线路wire n:1 数据名1,数据名2,数据名i;wire a; /定义了一个一位的wire型数据wire 7:0 b; /定义了一个八位的wire型数据wire 4:1 c, d; /定义了二个四位的wire型数据202寄存器型通常表示一个存储数据的空间。reg是最常用的寄存器型数据。reg型变量并不严格对应于电路上的存储单元。Verilog还支持integer,real和time寄存器数据类型。reg的默认初

12、始值是x。格式:reg n-1:0 数据名1,数据名2, 数据名i; reg n:1 数据名1,数据名2, 数据名i;21reg rega; /定义了一个一位的名为rega的reg型数据reg 3:0 regb; /定义了一个四位的名为regb的reg型数据reg 4:1 regc, regd; /定义了两个四位的名为regc和regd的reg型数据223 memory型Verilog HDL通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器,ROM存储器和reg文件。数组中的每一个单元通过一个数组索引进行寻址。memory型数据是通过扩展reg型数据的地址范围来生成的。格式:r

13、eg n-1:0 存储器名m-1:0;或 reg n-1:0 存储器名m:1;reg 7:0 mema255:0;23在同一个数据类型声明语句里,可以同时定义存储器型数据和reg型数据。parameter wordsize=16, /定义二个参数。memsize=256;reg wordsize-1:0 memmemsize-1:0,writereg, readreg;尽管memory型数据和reg型数据的定义格式很相似,但要注意其不同之处。如一个由n个1位寄存器构成的存储器组是不同于一个n位的寄存器的。reg n-1:0 rega; /一个n位的寄存器reg mema n-1:0; /一个由

14、n个1位寄存器构成的存储器组24一个n位的寄存器可以在一条赋值语句里进行赋值,而一个完整的存储器则不行。rega =0; /合法赋值语句mema =0; /非法赋值语句如果想对memory中的存储单元进行读写操作,必须指定该单元在存储器中的地址。mema3=0; /给memory中的第3个存储单元赋值为0。进行寻址的地址索引可以是表达式,这样就可以对存储器中的不同单元进行操作。表达式的值可以取决于电路中其它的寄存器的值。253 运算符及表达式运算符按其功能可分为以下几类1) 算术运算符(+,,/,)2) 赋值运算符(=,=,=)4) 逻辑运算符(&,|,!)5) 条件运算符(?:)6)

15、 位运算符(,|,&,)7) 移位运算符()8) 拼接运算符( )9) 其它2627赋值语句和块语句 赋值语句在Verilog HDL语言中,信号有两种赋值方式:1 非阻塞(Non_Blocking)赋值方式( 如 b = a; )(1)在语句块中,上面语句所赋的变量值不能立即就为下面的语句所用(2)块结束后才能完成这次赋值操作,而所赋的变量值是上一次赋值得到的(3)在编写可综合的时序逻辑模块时,这是最常用的赋值方法2.阻塞(Blocking)赋值方式( 如 b = a; )(1)赋值语句执行完后,才执行下一条语句。(2) b的值在赋值语句执行完后立刻就改变的。(3)在时序逻辑中使用时

16、可能会产生意想不到的结果。28module ex4_1(c,a,clk);output c;input a,clk;reg c;reg b; always (posedge clk) begin b=a; cend_wave; join 37块名在VerilgHDL语言中,可以给每个块取一个名字,只需将名字加在关键词begin或fork后面即可。使用块名的原因有以下几点。(1) 这样可以在块内定义局部变量,即只在块内使用的变量。(2) 这样可以允许块被其它语句调用,如disable语句。(3) 在Verilog语言里,所有的变量都是静态的,即所有的变量都只有一个唯一的存储地址,因此进入或跳出块

17、并不影响存储在变量内的值。 基于以上原因,块名就提供了一个在任何仿真时刻确认变量值的方法。384 条件语句、循环语句、块语句394.1 条件语句(if_else语句)if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。Verilog HDL语言提供了三种形式的if语句。40(1)if(表达式)语句例如:if ( a b ) out1 b) out1=int1;else out10)begin for(scani=0;scani0) begin $display(.); memoryscani=0; endendelse /*WRONG*/ $displa

18、y(error-indexiszero);44case语句case语句是一种多分支选择语句,if语句只有两个分支可供选择,而实际问题中常常需要用到多分支选择,Verilog语言提供的case语句直接处理多分支选择。 它的一般形式如下:1) case(表达式) endcase2) casez(表达式) endcase3) casex(表达式) endcasecase分支项的一般格式如下:分支表达式: 语句缺省项(default项): 语句45module test_case;reg1:0 select; initial begin select=2b01; case (select) 2b01:

19、$display(second 2b01.); 2b01:$display(third 2b01.); 2b01,2b00:$display(2b01); 2b11:$display(2b11); default:$display(default.); endcase endendmodule 46module exb5_1;reg1:2 select;reg3:0 result; always (select) begin case ( select1:2 ) 2 b00: result = 0; 2 b01: result = 4b0001; 2 b0 x, 2 b0z: result =

20、 4b0 x0z; 2 b10: result = 4b0010; 2 bx0, 2 bz0: result = 4bx0z0; default: result = 4bxxxx; endcase end47case语句与if_else_if语句的区别主要有两点:1)与case语句中的控制表达式和多分支表达式这种比较结构相比,if_else_if结构中的条件表达式更为直观一些。2) 对于那些分支表达式中存在不定值x和高阻值z位时,case语句提供了处理这种情况的手段Verilog HDL针对电路的特性提供了case语句的其它两种形式用来处理case语句比较过程中的不必考虑的情况( dont c

21、are condition )。其中casez语句用来处理不考虑高阻值z的比较过程,casex语句则将高阻值z和不定值都视为不必关心的情况。所谓不必关心的情况,即在表达式进行比较时,不将该位的状态考虑在内。这样在case语句表达式进行比较时,就可以灵活地设置以对信号的某些位进行比较。48494.2 循环语句循环语句在Verilog HDL中存在着四种类型的循环语句,用来控制执行语句的执行次数。forever repeat while for 50foreverreg clock;initial begin clock=1b0; forever #10 clock=clock;end产生周期为2

22、0个单位时间的时钟信号51repeat语句repeat语句的格式如下:repeat(表达式) 语句; 或repeat(表达式) begin 多条语句; end52实现乘法器module test_repeat;parameter size=8,longsize=16;reg size:1 opa, opb;reg longsize:1 result; initial begin opa=8ha2; opb=8h3f; #100; opa=8hf5; opb=8hc6; end53 always (opa or opb) begin: mult reg longsize:1 shift_opa,

23、 shift_opb; shift_opa = opa; shift_opb = opb; result = 0; repeat(size) begin if(shift_opb1) result = result + shift_opa; shift_opa = shift_opa 1; end end endmodule 54while 语句while语句的格式如下:while(表达式) 语句;或用如下格式:while(表达式) begin 多条语句; end55对rega中值为1的位进行计数begin:count1s reg7:0 tempreg; count=0; tempreg =

24、rega; while(tempreg) begin if(tempreg0) count = count + 1; tempreg = tempreg1; endend56for语句初始化memory型变量begin:init_memreg7:0 tempi; for(tempi=0;tempimemsize;tempi=tempi+1) memorytempi=0;end57parameter size = 8, longsize = 16;regsize:1 opa, opb;reglongsize:1 result;begin:mult integer bindex; result=0

25、; for( bindex=1; bindex=size; bindex=bindex+1 ) if(opbbindex) result = result + (opa1 ) if(tempreg0) count=count+1;end594.3 命名块的禁用Verilog通过关键字disable提供了一种终止命名块执行的方法。可用来从循环中退出、处理错误条件以及根据控制信号来控制某些代码段是否被执行。对块语句的禁用导致紧接在块后面的那条语句被执行。60/从矢量标志寄存器的低有效位开始查找第一个值为1的位module ex5_13;reg 15:0 flag;integer i; /用于计数的

26、整数 initialbegin flag = 16b 0010_0000_0000_0000; i = 0; 61 begin: block1 /while循环声明中的主模块是命名块block1 while(i 16) begin if (flagi) begin $display(Encountered a TRUE bit at element number %d, i); disable block1; / 在标志寄存器中找到了值为真 /(1)的位,禁用block1 end i = i + 1; end endendendmodule625 结构语句、系统任务、函数语句和显示系统任务63

27、5.1 结构说明语句Verilog语言中的任何过程模块都从属于以下四种结构的说明语句。(1)initial说明语句(2) always说明语句(3) task说明语句(4) function说明语句64initial和always说明语句在仿真的一开始即开始执行。initial语句只执行一次。相反,always语句则是不断地重复执行,直到仿真过程结束。always语句后面跟着的过程块是否运行,则要看它的触发条件是否满足,如满足则运行过程块一次,再次满足再运行一次,直至仿真过程结束。在一个模块中,使用initial和always语句的次数是不受限制的。task和function语句可以在程序模块

28、中的一处或多处调用。656.1.1 initial语句initial语句的格式如下:initialbegin 语句1; 语句2; . 语句n;end66例6.1 用initial 块对存储器变量赋初始值initialbegin areg=0; /初始化寄存器areg for(index=0;indexsize;index=index+1) memoryindex=0; /初始化一个memoryend67例6.2 用initial语句来生成激励波形initialbegin inputs = b000000;/初始时刻为0 #10 inputs = b011001; #10 inputs = b0

29、11011; #10 inputs = b011000; #10 inputs = b001000;end68always语句由于其不断活动的特性,只有和一定的时序控制结合在一起才有用。如果一个always语句没有时序控制,则这个always语句将会使仿真器产生死锁。always areg = areg; 但如果加上时序控制,则这个always语句将变为一条非常有用的描述语句。 always #half_period areg = areg;69例6.5reg7:0 counter; reg tick; always (posedge areg) begin tick = tick; coun

30、ter = counter + 1; end70always 的时间控制可以是沿触发也可以是电平触发的,可以单个信号也可以多个信号,中间需要用关键字 or 连接。always (posedge clock or posedge reset)begin endalways (a or b or c)beginend71边沿触发的always块常常描述时序行为,如有限状态机。如果符合可综合风格要求,则可通过综合工具自动地将其转换为表示寄存器组和门级组合逻辑的结构,而该结构应具有时序所要求的行为 电平触发的always块常常用来描述组合逻辑的行为。如果符合可综合风格要求,可通过综合工具自动将其转换为

31、表示组合逻辑的门级逻辑结构或带锁存器的组合逻辑结构,而该结构应具有所要求的行为。一个模块中可以有多个always块,它们都是并行运行的。72如果组合逻辑块语句的输入变量很多,那么编写敏感列表会很繁琐并且容易出错。针对这种情况,Verilog提供另外两个特殊的符号:* 和(*),它们都表示对其后面语句块中所有输入变量的变化时敏感的。/用or 操作符的组合逻辑块/编写敏感列表很繁琐并且容易漏掉一个输入always (a or b or c or d or e or f or g or h or p or m)begin out1 = a ? b + c : d + e ; out2 = f ? g

32、 + h : p + m ;end73/不用上述方法,用符号 (*) 来代替,/可以把所有输入变量都自动包括进敏感列表。always ( * )begin out1 = a ? b + c : d + e ; out2 = f ? g + h : p + m ;end748 有限状态机设计75状态机分类 Melay型:输出是当前状态和所有输入信号的函数。 Moore型:输出仅是当前状态的函数。 Melay型状态机的输出是输入变化后立即发生变化;而Moore型状态机在输入发生变化后,还需等到时钟到来,时钟使状态发生变化才导致输出变化。因此要多等待一个时钟周期。76设计实例例1 Moore状态机状

33、态s0时,输入为0维持s0,输入为1时,下一状态改为s1,不论输入是什么,输出均为0。0101110S1/1S3/0S2/0S0/077module moore_ex1(clk,din,op);input clk,din;output op;reg op;parameter s0=2b00, s1=2b01, s2=2b10, s3=2b11; reg1:0 presentstate ;reg1:0 nextstate ; always (posedge clk) presentstate = nextstate;78 always (din,presentstate) begin case

34、(presentstate) s0: begin if (din = 0) nextstate = s0; else nextstate = s1; op=0; end s1: begin if (din = 1) nextstate = s1;else nextstate = s2;op=1; end s2: begin if (din = 1) nextstate = s2;else nextstate= s3;op=0; end s3: begin if (din = 1) nextstate = s0;else nextstate = s1;op=0; end default:begin nextstate = s0; op = 0; endendcaseend endmodule 79module t_moore_ex1; reg clk,din; wire op; always #20

温馨提示

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

评论

0/150

提交评论