数字系统设计与VerilogHDL-9版-第6章 Verilog设计的层次与风格_第1页
数字系统设计与VerilogHDL-9版-第6章 Verilog设计的层次与风格_第2页
数字系统设计与VerilogHDL-9版-第6章 Verilog设计的层次与风格_第3页
数字系统设计与VerilogHDL-9版-第6章 Verilog设计的层次与风格_第4页
数字系统设计与VerilogHDL-9版-第6章 Verilog设计的层次与风格_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

数字系统设计与VerilogHDL(第9版)数字系统设计与VerilogHDL(第9版)第6章

Verilog设计的层次与风格6.1Verilog描述的层级和方式6.2Verilog门元件

6.3门级结构描述6.4用户自定义元件

6.5连续赋值

6.6数据流描述

6.7多层次结构电路设计6.8generate生成语句

6.9三态逻辑设计6.1Verilog描述的层级和方式VerilogHDL常用的逻辑电路描述方式:结构(structural)描述;行为(behavioural)描述;数据流(dataflow)描述。结构描述调用电路元件(如子模块,逻辑门,甚至晶体管)来构建电路;行为描述侧重于描述电路的行为特性来构建电路;数据流描述主要用连续赋值语句、操作符和表达式表示电路,也可以采用上述方式的混合来描述电路。6.2Verilog门元件6.2.1门元件6.2Verilog门元件6.2.1门元件6.2.2门元件的例化门元件例化的格式门元件名<驱动强度说明>#<门延时>例化名

(门端口列表)<驱动强度说明>为可选项,其格式为:(对1的驱动强度,对0的驱动强度),如果驱动强度缺省,则默认为(strong1,strong0)。<门延时>也是可选项,当没有指定延时,默认延时为0。6.2.2门元件的例化1.多输入门的例化多输入门的端口列表可按下面的顺序列出,(输出,输入1,输入2,输入3,...);例如:anda1(out,in1,in2,in3); //三输入与门,其名字为a1anda2(out,in1,in2); //二输入与门,其名字为a26.2.2门元件的例化2.多输出门的例化buf和not两种元件允许有多个输出,但只能有一个输入。多输出门的端口列表按下面的顺序列出。(输出1,输出2,...,输入);例如:notg3(out1,out2,in); //1个输入in,2个输出out1,out2bufg4(out1,out2,out3,din);6.2.2门元件的例化3.三态门的例化对于三态门,按以下顺序列出输入、输出端口。(输出,输入,使能控制端);例如:bufif1g1(out,in,enable); //高电平使能的三态门bufif0g2(out,a,ctrl); //低电平使能的三态门6.3门级结构描述所谓结构描述方式,是指通过调用库中的元件或已设计好的模块来完成设计实体功能的描述方式。门级结构描述就是用VerilogHDL门元件例化实现电路功能。例6.1门元件例化实现的4选1MUXmodulemux4_1(inputin1,in2,in3,in4,s0,s1,outputout);wires0_n,s1_n,w,x,y,z;not(s0_n,s0),(s1_n,s1);and(w,in1,s0_n,s1_n),(x,in2,s0_n,s1),(y,in3,s0,s1_n),(z,in4,s0,s1);or(out,w,x,y,z);endmodule6.3门级结构描述例6.2门元件例化实现1位全加器modulefull_add(//门元件例化inputa,b,cin,outputsum,cout);wires1,m1,m2,m3;and(m1,a,b),(m2,b,cin),(m3,a,cin);xor(sum,a,b,cin);or(cout,m1,m2,m3);endmodule6.3门级结构描述6.4用户自定义元件利用UDP(User-definedPrimitives),用户可以自定义元件模型并建立相应的原语库。UDP元件可分为两种:

组合逻辑UDP;时序逻辑UDP:又包括电平敏感型UDP和边沿敏感型UDP。UDP元件只能有一个输出,其取值只能为0、1或x,不支持高阻态z。6.4.1组合逻辑UDP元件例6.42选1数据选择器的组合UDP元件primitivemultiplexer(mux,cntrl,dataA,dataB);outputmux;inputcntrl,dataA,dataB;table//cntrldataAdataBmux010:1;011:1;01x:1;000:0;001:0;00x:0;101:1;111:1;1x1:1;100:0;110:0;1x0:0;x00:0;x11:1;endtableendprimitive例6.5用符号“?”表述的2选1数据选择器UDP元件。primitivemultiplexer(mux,cntrl,dataA,dataB);outputmux;inputcntrl,dataA,dataB;table//cntrldataAdataBmux01?:1; //?表示0,1,x00?:0;1?1:1;1?0:0;x00:0;x11:1;endtableendprimitive6.4.2时序逻辑UDP元件例6.6电平敏感的1位数据锁存器UDP元件。primitivelatch(q,clk,data);outputq;regq;inputclk,data;table//clkdataqq+01:?:1;00:?:0;1?:?:-; //clk=1时,锁存器的输出保持原值,用符号“-”表示endtableendprimitive例6.7上升沿触发的D触发器的UDP元件。primitived_edge_ff(q,clk,data);outputq;regq;inputclk,data;table//clkdataqq+(01)0:?:0; //时钟上升沿到来,输出值更新(01)1:?:1;(0?)1:1:1;(0?)0:0:0;(?0)?:?:-; //时钟下降沿,输出q保持原值?(??):?:-; //时钟不变,输出也不变endtableendprimitive

6.5连续赋值赋值是将值赋给net型和variable型变量的操作,有两种基本的赋值操作:

连续赋值(continuousassignment):用于对net型变量赋值;过程赋值(proceduralassignment):用于对variable型变量赋值。连续赋值语句是VerilogHDL数据流建模的核心语句,主要用于对net型变量(包括标量和向量)进行赋值,其格式如下。

assignLHS_net=RHS_expression;

示例:wirecout,a,b;assigncout=a&b;6.5.1连续赋值VerilogHDL还提供了另一种对net型变量赋值的方法,即在net型变量声明时同时对其赋值。如下面的赋值方式等效于上面例子中对cout的赋值语句,两者效果相同。wirea,b;wirecout=a&b;//等效于assigncout=a&b;6.5.2net变量声明时赋值例6.12用连续赋值方式定义的4位带进位加法器moduleadder4(inputwire[3:0]ina,inb,inputwirecin,outputwire[3:0]sum,outputwirecout);assign{cout,sum}=ina+inb+cin;endmodule6.6数据流描述用数据流描述方式描述电路与用传统的逻辑表达式表示电路类似。设计中只要有了布尔代数表达式,就很容易将它用数据流的方式表达出来,表达方法是用VerilogHDL中的逻辑操作符置换布尔运算符。例6.15半加器的数据流描述modulehalf_add( //数据流描述inputa,b,outputso,co);assignso=a^b,co=a&b;endmodule6.6.1

数据流描述加法器例6.15半加器的数据流描述modulehalf_add( //数据流描述inputa,b,outputso,co);assignso=a^b,co=a&b;endmodule6.6.1

数据流描述加法器例6.16用数据流描述实现1位全加器modulefull_add(inputa,b,cin,outputsum,cout);assignsum=a^b^cin, //数据流描述cout=(a&b)|(b&cin)|(cin&a);endmodule6.6.1

数据流描述加法器例6.17用数据流描述实现4位二进制加法器moduleadd4#(parameterMSB=4) //用参数定义位宽(input[MSB-1:0]a,b,inputcin,output[MSB-1:0]sum,outputcout);assign{cout,sum}=a+b+cin; //数据流描述endmodule6.6.1

数据流描述加法器6.6.2数据流描述减法器例6.20半减器的数据流描述modulehalf_sub(inputa,b,outputd,co);assignd=a^b,co=(~a)&b;endmoduleendmodule例6.21用数据流描述的全减器modulefull_sub(inputa,b,inputcin, //低位借位outputd,co);assignd=a^b^cin,co=(~a&(b^cin))|(b&cin);endmodule例6.258位有符号数减法运算(被减数、减数和结果均用补码表示)modulesub8_sign#(parameterMSB=8)(inputsigned[MSB-1:0]x, //带符号被减数inputsigned[MSB-1:0]y, //带符号减数outputsigned[MSB-1:0]d); //结果wiresigned[MSB-1:0]temp_y;assigntemp_y=~y+1'b1;assignd=x+temp_y; //用加法器实现减法器endmodule例6.268位有符号数减法器的测试代码`timescale1ns/1nsmodulesub8_sign_tb();parameterDELY=20;parameterN=8;regsigned[N-1:0]x,y;wiresigned[N-1:0]d;sub8_sign#(.MSB(N))i1(.x(x),.y(y),.d(d));initialbeginx=-8'sd49;y=8'sd55;#DELY x=8'sd107;#DELY y=8'sd112;#DELY x=-8'sd72;#DELY y=-8'sd99;repeat(4)begin#DELYx<=$random%127; //x为-127~127之间的一个随机数y<=$random%127;end#DELY $stop;$display("Runningtestbench");endendmodule8位有符号数减法器的测试波形图6.6.2数据流描述减法器例6.20半减器的数据流描述modulehalf_sub(inputa,b,outputd,co);assignd=a^b,co=(~a)&b;endmoduleendmodule6.6.3数据流描述触发器例6.27数据流描述SR锁存器modulesr_latch(inputs,r,outputq,qn);assignq=~(s&qn),qn=~(r&q);endmodule例6.28电平触发的D触发器(D锁存器)`timescale1ns/1nsmoduled_latch(inputd,cp,outputq,qn);wirey1,y2,y3,y4;assigny1=~(d&cp),y2=~(cp&~d),y3=~(y1&y4),y4=~(y2&y3);assign#3q=y3,qn=y4;//#3表示与非门传输延时为2个单位时间(ns)endmodule例6.32二进制码转格雷码modulebin2gray#(parameterWIDTH=8) //数据位宽(input[WIDTH-1:0]bin, //二进制码output[WIDTH-1:0]gray); //格雷码assigngray=bin^(bin>>1);endmodule6.6.4格雷码与二进制码相互转换例6.33格雷码转二进制码modulegray2bin#(parameterWIDTH=8) //数据位宽(input[WIDTH-1:0]gray, //格雷码output[WIDTH-1:0]bin); //二进制码assignbin[WIDTH-1]=gray[WIDTH-1]; //最高位不需转换genvari;generatefor(i=0;i<=WIDTH-2;i=i+1)begin:g2b //命名块assignbin[i]=bin[i+1]^gray[i];endendgenerateendmodule6.6.4格雷码与二进制码相互转换VerilogHDL通过模块例化支持层次化的设计,高层模块可以例化下层模块,并通过输入、输出和双向端口互通信息。6.7多层次结构电路设计例6.348位加法器的源代码moduleadd8#(parameterMSB=8,LSB=0)(input[MSB-1:LSB]a,b,inputcin,output[MSB-1:LSB]sum,outputcout);assign{cout,sum}=a+b+cin;endmodule6.7.1带参数模块例化例6.358位寄存器的源代码modulereg8#(parameterSIZE=8)(inputclk,clear,input[SIZE-1:0]in,outputreg[SIZE-1:0]qout);always@(posedgeclk,posedgeclear)beginif(clear)qout<=0; //异步清0elseqout<=in;endendmodule6.7.1带参数模块例化例6.36累加器顶层连接描述moduleacc#(parameterWIDTH=8)(input[WIDTH-1:0]accin,inputcin,clk,clear,output[WIDTH-1:0]accout,outputcout);wire[WIDTH-1:0]sum;add8u1(.cin(cin),.a(accin),.b(accout),.cout(cout),.sum(sum));//例化add8子模块,端口名关联reg8u2(.qout(accout),.clear(clear),.in(sum),.clk(clk));//例化reg8子模块,端口名关联endmodule6.7.1带参数模块例化例6.38用参数名进行参数传递方式moduleacc16w#(parameterWIDTH=16)(input[WIDTH-1:0]accin,inputcin,clk,clear,output[WIDTH-1:0]accout,outputcout);wire[WIDTH-1:0]sum;add8#(.MSB(WIDTH),.LSB(0))//用参数名进行参数传递方式u1(.cin(cin),.a(accin),.b(accout),.cout(cout),.sum(sum));reg8#(.SIZE(WIDTH)) //用参数名进行参数传递方式u2(.qout(accout),.clear(clear),.in(sum),.clk(clk));endmodule6.7.2用parameter进行参数传递用参数名进行参数传递generate是Verilog-2001中新增的语句,generate语句一般和循环语句(for)、条件语句(if,case)一起使用。为此,Verilog-2001增加了4个关键字generate、endgenerate、genvar和localparam。genvar是一个新的数据类型,用在generate循环中的索引变量(控制变量)必须定义为genvar数据类型。6.8generate生成语句generate语句和for循环语句一起使用,generate循环可以产生一个对象(如module、primitive,或者variable、net、task、function、assign、initial和always)的多个例化,为可变尺度的设计提供便利。generate、for生成语句例6.40用generate语句描述的4位行波进位加法器的示例moduleadd_ripple#(parameterSIZE=4)(input[SIZE-1:0]a

温馨提示

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

评论

0/150

提交评论