verilog建模方式.doc_第1页
verilog建模方式.doc_第2页
verilog建模方式.doc_第3页
verilog建模方式.doc_第4页
verilog建模方式.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

verilog HDL建模方式简单的归纳为三类:结构化描述方式、数据流描述方式、行为描述方式。一个模块中往往是将三种建模方式混合起来使用,来描述一个完整的功能。系统级、算法级、RTL级属于行为级,门级、开关级属于结构级。系统级:用高级语言实现设计模块的外部性能的模型。算法级:用高级语言结构实现设计算法的模型。RTL级:描述数据在寄存器之间流动和如何树立这些数据的模型门级:描述逻辑门以及逻辑门之间的连线的模型开关级:描述器件中三极管和存储节点以及他们之间连线的模型1)结构化的建模方式是通过对电路的层次和组成结构进行描述来建模,即通过对器件的调用(HDL概念称为例化),并使用线网来连接各器件来描述一个模块的结构。这里的器件包括Verilog HDL的内置门如与门and,异或门xor等,也可以是用户自定义的一个模块,还可以是FPGA厂商的提供的一个基本逻辑单元或者宏。结构化的描述方式反映了一个设计的层次结构。module FA_struct (A, B, Cin, Sum, Cout);input A;input B;input Cin;output Sum;output Cout;wire S1, T1, T2, T3;/ - statements - /xor x1 (S1, A, B);xor x2 (Sum, S1, Cin);and A1 (T1, A, B );and A2 (T2, B, Cin);and A3 (T3, A, Cin);or O1 (Cout, T1, T2, T3 );endmodule该实例显示了一个全加器由两个异或门、三个与门、一个或门构成。S1、T1、T2、T3则是门与门之间的连线。代码显示了用纯结构的建模方式,其中xor 、and、or 是Verilog HDL 内置的门器件。以 xor x1 (S1, A, B) 该例化语句为例:xor 表明调用一个内置的异或门,器件名称xor ,代码实例化名x1(类似原理图输入方式)。括号内的S1,A,B 表明该器件管脚的实际连接线(信号)的名称,其中 A、B是输入,S1是输出。2)数据流建模方式数据流的建模方式就是通过对数据流在设计中的具体行为的描述来建模。最基本的机制就是用连续赋值语句。在连续赋值语句中,某个值被赋给某个线网变量(信号)。语法如:assign #2 A = B;在数据流描述方式中,还必须借助于HDL提供的一些运算符。如算术运算符、关系运算符、逻辑运算符、按位逻辑运算符、条件运算符,以及连接运算符等。通过将这些运算符嵌入到连续赋值语句中,可以形成比较复杂的连续赋值语句,用来描述一些较复杂的线网变量的产生过程(即线网变量的行为)。timescale 1ns/100psmodule FA_flow(A,B,Cin,Sum,Cout)input A,B,Cin;output Sum, Cout;wire S1,T1,T2,T3;assign #2 S1 = A B;assign #2 Sum = S1 Cin;assign #2 T1 = A & B;assign #2 T2 = B & Cin;assign #2 T3 = A & Cin ;assign #2 Cout = T1|T2|T3;endmodulemodule内的各个assign 语句,是并行执行的,即各语句的执行与语句在module内出现的先后顺序无关。当assign语句右边表达式中的变量发生变化时,表达式的值会重新计算,并将结果赋值给左边的线网变量。如果赋值语句使用了时延,那么在等待时延结束后再将表达式的值赋给左边的线网变量。上例中每个assign语句都加了2个时间单位的时延,若右边表达式的值发生变化,assign语句左边的变量会在2个时间单位后获得右边表达式的新值。即,当信号A发生变化后,S1、T1、T3 也会跟着变化(A变化的2个时间单位后),S1的变化又会导致Sum的变化(A变化的4个时间单位后)。数据流描述方式,相对行为描述方式而言,描述的都是比较简单的信号,不用类似于高级语言的高级语句(如if else,case等)就可以很容易的将信号的行为描述出来。而且通过数据流描述方式描述的电路,我们可以很容易的看出它的电路组成,如通过几个与门或者几个异或门,不需要经过很复杂的分析就可得知。对于行为描述方式,由于嵌入了大量的高级语句,我们很容易理解电路的行为,却不容易一下子看出电路的结构来。3) 行为描述方式建模行为描述方式是指通过对信号的行为进行描述来建模。在表示方面,类似数据流建模方式,但一般是把用initial 块语句或always 块语句描述的归为行为建模方式。行为描述方式中,我们不关心电路使用到哪些基本逻辑单元(如逻辑门、厂商的基本逻辑单元LUT等),也不关心这些基本逻辑单元最终是怎么连起来的,只关心电路具有什么样的功能。为了达到这个目的,行为描述建模方式中使用了大量的类似C语言的高级语句,如if else、case、for、while等等,可以很方便的用简洁的代码描述复杂的电路。 task(任务)和function(函数)也属于行为描述方式建模。和数据流建模方式一样,行为建模方式也需要使用到各种运算符,将各种运算符和高级语句配合起来使用,可以对复杂的电路进行抽象建模,只关心电路的功能,不关心电路的具体实现。电路的具体实现过程由软件自动完成。采用行为描述的建模方式,对电路的描述效率更高,可以用简洁的语句描述复杂的逻辑电路。module FA_behav1(A, B, Cin, Sum, Cout );input A,B,Cin;output Sum,Cout;reg Sum, Cout;reg T1,T2,T3;always ( A or B or Cin )begin Sum = (A B) Cin ; T1 = A & B ; T2 = B & Cin; T3 = A & Cin; Cout = (T1| T2) | T3;endendmodule行为建模中的关键字:reg、always、begin 、end。对于行为建模方式,以下几点概念必须建立:1.只有寄存器类型的信号才可以在always和initial 语句中进行赋值(过程赋值),类型定义使用reg关键字声明。由于信号默认的类型是wire,所以reg型变量必须在module中声明。2.always语句是一直重复执行的,由敏感表(always 语句括号内的变量)中的变量触发,每次敏感列表中的变量发生变化时,always语句内部的各个语句都要重新执行一次。3.always 语句从0 时刻开始。4.在begin 和end 之间的语句是顺序执行,属于串行语句。module FA_behav2(A, B, Cin, Sum, Cout );input A,B,Cin;output Sum,Cout;reg Sum, Cout;always ( A or B or Cin )begin Cout ,Sum = A + B + Cin ;endendmodule在本例中,采用更加高级(更趋于行为级)描述方式,即直接采用“+”来描述加法。Cout,Sum表示对位数的扩展,因为两个1bit 相加,和有两位,低位放在Sum 变量中,进位放在Cout 中。 行为描述方式可以使用一些类似于C语言的高级语句,例如if else和case等。一段使用case语句的进行行为描述方式建模的代码,如果改为用数据流描述方式来实现(假设都是组合逻辑,组合逻辑可用数据流描述方式和行为描述方式建模,时序逻辑只能用行为描述方式建模),代码量会剧增,可读性也会很差。行为描述方式体现了verilog HDL的精髓和强大的建模能力,同时代码具有很好的可读性和抽象性,体现了高级语言的优点。当然,结构建模方式和数据建模方式也是必不可少的,应该根据需要合理的搭配使用三种不同的方式进行建模。在实际的设计中,往往是将这三种描述方式混合起来使用。一般而言,对顶层模块,会更多的采用结构描述方式,通过对低层模块的调用来描述顶层模块的功能,当然也会使用到数据流建模和行为建模来描述一些简单的功能,对于一些复杂的逻辑一般是放在低层模块中来实现。对于底层模块,更多的是采用数据流和行为描述方式来描述模块的功能,也会通过调用其它更低层模块来实现更细化的功能。timescale 1 ns / 1 ps/module function is:if data datb,Value =0;else Value = 1.module compare(Data,Datb,Value);input 3:0 Data;input 3:0 Datb;output Value;reg Value;wire Value0;wire Value1;wire Value2;wire Value3;assign Value0 = (Data0 Datb0) ? Data0 : 1b1;assign Value1 = (Data1 Datb1) ? Data1 : 1b1;assign Value2 = (Data2 Datb2) ? Data2 : 1b1;assign Value3 = (Data3 Datb3) ? Data3 : 1b1;always(Value0 or Value1 or Value2 or Value3)begin if(Value0 = 1b1) Value = 1b1; else if(Value1 = 1b1) Value = 1b1; else if(Value2 = 1b1) Value = 1b1; else if(Value3 = 1b1) Value = 1b1; else Value = 1b0;endendmodule上例中,通过数据流描述方式和行为描述方式,描述了一个二输入4bits数值比较器。二输入4bits数值比较器的功能为:当Data大于等于Datb时,Value为1;否则Value为0。作为一个底层module,compare模块实现的是一个具体的、较小的功能,不需要例化其他更低层模块。compare模块内部,简单的逻辑可以用数据流描述方式来实现,相对复杂一些的逻辑由行为描述方式来实现,相互搭配使用,使得代码不仅可读性好,而且简洁。/calculate the the result of the max data and min datmodule calc(Dat0,Dat1,Dat2,Result);input 3:0 Dat0;input 3:0 Dat1;input 3:0 Dat2;output 3:0 Result;reg 3:0 MaxDat;reg 3:0 MinDat;wire CmpResult0;wire CmpResult1;wire CmpResult2;compare U_compare_0( /结构级描述 .Data (Dat0), .Datb (Dat1), .Value(CmpResult0);compare U_compare_1( .Data (Dat0), .Datb (Dat2), .Value(CmpResult1);compare U_compare_2( .Data (Dat1), .Datb (Dat2), .Value(CmpResult2);always(CmpResult0 or CmpResult1 or CmpResult2 or Dat0 or Dat1 or Dat2)begin /行为级描述 case(CmpResult0,CmpResult1,CmpResult2) 3b110 : MaxDat = Dat0; 3b111 : MaxDat = Dat0; 3b001 : MaxDat = Dat1; 3b011 : MaxDat = Dat1; 3b000 : MaxDat = Dat2; 3b100 : MaxDat = Dat2; default : MaxDat = Dat0; endcaseendalways(CmpResult0 or CmpResult1 or CmpResult2 or Dat0 or Dat1 or Dat2

温馨提示

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

最新文档

评论

0/150

提交评论