FPGA开发语言——verilog语言详细教程:6-9

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第六章Verilog的数据类型及逻辑系统•学习Verilog逻辑值系统•学习Verilog中不同类的数据类型•理解每种数据类型的用途及用法•数据类型说明的语法学习内容:Verilog采用的四值逻辑系统’0’,Low,False,LogicLow,Ground,VSS,NegativeAssertion‘1’,High,True,LogicHigh,Power,VDD,VCC,PositiveAssertion’X’Unknown:OccursatLogicalWhichCannotbeResolvedConflictHiZ,HighImpedance,Tri-Stated,DisabledDriver(Unknown)主要数据类型Verilog主要有三类(class)数据类型:•net(线网):表示器件之间的物理连接•register(寄存器):表示抽象存储元件•parameters(参数):运行时的常数(run-timeconstants)net(线网)net需要被持续的驱动,驱动它的可以是门和模块。当net驱动器的值发生变化时,Verilog自动的将新值传送到net上。在例子中,线网out由or门驱动。当or门的输入信号置位时将传输到线网net上。net类的类型(线网)•有多种net类型用于设计(design-specific)建模和工艺(technology-specific)建模•没有声明的net的缺省类型为1位(标量)wire类型。但这个缺省类型可由下面的编译指导改变:`default_nettypenettypenet类型功能wire,trisupply1,supply0wor,triorwand,triandtriregtri1,tri0标准内部连接线(缺省)电源和地多驱动源线或多驱动源线与能保存电荷的net无驱动时上拉/下拉综合编译器不支持的net类型net类的类型(线网)•wire类型是最常用的类型,只有连接功能。•wire和tri类型有相同的功能。用户可根据需要将线网定义为wire或tri以提高可读性。例如,可以用tri类型表示一个net有多个驱动源。或者将一个net声明为tri以指示这个net可以是高阻态Z(hign-impedance)。可推广至wand和triand、wor和trior•wand、wor有线逻辑功能;与wire的区别见下页的表。•trireg类型很象wire类型,但trireg类型在没有驱动时保持以前的值。这个值的强度随时间减弱。•修改net缺省类型的编译指导:`default_nettypenettypenettype不能是supply1和supply0。net类在发生逻辑冲突时的决断•Verilog有预定义的决断函数•支持与工艺无关的逻辑冲突决断–wire-and用于集电极开路电路–wire-or用于射极耦合电路寄存器类(register)•寄存器类型在赋新值以前保持原值•寄存器类型大量应用于行为模型描述及激励描述。在下面的例子中,reg_a、reg_b、reg_sel用于施加激励给2:1多路器。•用行为描述结构给寄存器类型赋值。给reg类型赋值是在过程块中。寄存器类的类型•寄存器类有四种数据类型寄存器类型功能reg可定义的无符号整数变量,可以是标量(1位)或矢量,是最常用的寄存器类型integer32位有符号整数变量,算术操作产生二进制补码形式的结果。通常用作不会由硬件实现的的数据处理。real双精度的带符号浮点变量,用法与integer相同。time64位无符号整数变量,用于仿真时间的保存与处理realtime与real内容一致,但可以用作实数仿真时间的保存与处理•不要混淆寄存器数据类型与结构级存储元件,如udp_dffVerilog中net和register声明语法•net声明net_type[range][delay]net_name[,net_name];net_type:net类型range:矢量范围,以[MSB:LSB]格式delay:定义与net相关的延时net_name:net名称,一次可定义多个net,用逗号分开。•寄存器声明reg_type[range]reg_name[,reg_name];reg_type:寄存器类型range:矢量范围,以[MSB:LSB]格式。只对reg类型有效reg_name:寄存器名称,一次可定义多个寄存器,用逗号分开Verilog中net和register声明语法•举例:rega;//一个标量寄存器wandw;//一个标量wand类型netreg[3:0]v;//从MSB到LSB的4位寄存器向量reg[7:0]m,n;//两个8位寄存器tri[15:0]busa;//16位三态总线wire[0:31]w1,w2;//两个32位wire,MSB为bit0选择正确的数据类型moduletop;wirey;rega,b;DUTu1(y,a,b);initialbegina=0;b=0;#5a=1;endendmodulemoduleDUT(Y,A,B);outputY;inputA,B;wireY,A,B;and(Y,A,B);endmodule输入端口可以由net/register驱动,但输入端口只能是net输出端口可以是net/register类型,输出端口只能驱动net在过程块中只能给register类型赋值若Y,A,B说明为reg则会产生错误。in1in2OABY双向端口输入/输出只能是net类型选择数据类型时常犯的错误•用过程语句给一个net类型的或忘记声明类型的信号赋值。信息:illegal……assignment.•将实例的输出连接到声明为register类型的信号上。信息:namehasillegaloutputportspecification.•将模块的输入信号声明为register类型。信息:incompatibledeclaration,signalname……下面所列是常出的错误及相应的错误信息(errormessage)•信号可以分为端口信号和内部信号。出现在端口列表中的信号是端口信号,其它的信号为内部信号。•对于端口信号,输入端口只能是net类型。输出端口可以是net类型,也可以是register类型。若输出端口在过程块中赋值则为register类型;若在过程块外赋值(包括实例化语句),则为net类型。•内部信号类型与输出端口相同,可以是net或register类型。判断方法也与输出端口相同。若在过程块中赋值,则为register类型;若在过程块外赋值,则为net类型。•若信号既需要在过程块中赋值,又需要在过程块外赋值。这种情况是有可能出现的,如决断信号。这时需要一个中间信号转换。信号类型确定方法总结如下:选择数据类型时常犯的错误举例修改前:moduleexample(o1,o2,a,b,c,d);inputa,b,c,d;outputo1,o2;regc,d;rego2andu1(o2,c,d);always@(aorb)if(a)o1=b;elseo1=0;endmodule修改后:moduleexample(o1,o2,a,b,c,d);inputa,b,c,d;outputo1,o2;//regc,d;//rego2rego1;andu1(o2,c,d);always@(aorb)if(a)o1=b;elseo1=0;endmoduleexample.v选择数据类型时常犯的错误举例Compilingsourcefileexample.vError!Illegalleft-hand-sideassignment[Verilog-ILHSA]example.v,11:o1=b;Error!Illegalleft-hand-sideassignment[Verilog-ILHSA]example.v,12:o1=0;2errors第一次编译信息verilog–cexample.v第二次编译信息Compilingsourcefileexample.vError!Incompatibledeclaration,(c)definedasinputatline2[Verilog-IDDIL]example.v,5:Error!Incompatibledeclaration,(d)definedasinputatline2[Verilog-IDDIL]example.v,5:Error!Gate(u1)hasillegaloutputspecification[Verilog-GHIOS]example.v,8:3errors参数(parameters)•用参数声明一个可变常量,常用于定义延时及宽度变量。•参数定义的语法:parameterlist_of_assignment;•可一次定义多个参数,用逗号隔开。•在使用文字(literal)的地方都可以使用参数。•参数的定义是局部的,只在当前模块中有效。•参数定义可使用以前定义的整数和实数参数。modulemod1(out,in1,in2);...parametercycle=20,prop_del=3,setup=cycle/2-prop_del,p1=8,x_word=16’bx,file=/usr1/jdough/design/mem_file.dat;...wire[p1:0]w1;//Awiredeclarationusingparameter...endmodule注意:参数file不是string,而是一个整数,其值是所有字母的扩展ASCII值。若file=“AB”,则file值为8‘h4142。用法:$fopen(file);$display(“%s”,file);参数重载(overriding)•可用defparam语句在编译时重载参数值。•defparam语句引用参数的层次化名称•使用defparam语句可单独重载任何参数值。Defparam语句(现在综合工具还不支持)modulemod1(out,in1,in2);...parameterp1=8,real_constant=2.039,x_word=16’bx,file=/usr1/jdough/design/mem_file.dat;...endmodulemoduletest;...mod1I1(out,in1,in2);defparamI1.p1=6,I1.file=../my_mem.dat;...endmodule参数重载(overriding)modulemod1(out,in1,in2);...parameterp1=8,real_constant=2.039,x_word=16’bx,file=/usr1/jdough/design/mem_file.dat;...endmodulemoduletop;...mod1#(5,3.0,16’bx,../my_mem.dat)I1(out,in1,in2);...endmodule模块实例化时参数重载使用#次序与原说明相同不需要给所有参数赋新值,但不能跳跃赋值,假设模块MOD顺序定义三个参数a,b,c,则:MODu1#(a,b)(...);MODu2#(a)(...);MODu3#(a,,c)(...);MODu4#(,b,c)(...);为什么编译器认为这是参数而不是延时呢?因为#说明延时的时候只能用于gate或过程语句,不能用于模块实例。gate(primitives)在实例化时只能有延时,不能有模块参数。寄存器数组(RegisterArrays)•在Verilog中可以说明一个寄存器数组。integerNUMS[7:0];//包含8个整数数组变量timet_vals[3:0];//4个时间数组变量•reg类型的数组通常用于描述存储器其语法为:reg[MSB:LSB]memory_name[first_addr:last_addr];[MSB:LSB]定义存储器字的位数[

1 / 96
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功