📄 verilog_3.htm
字号:
//Addr是3位线与。<BR><BR>当一个线网有多个驱动器时,即对一个线网有多个赋值时,不同的线网产生不同的行为。例如,<BR><BR>wor
Rde;<BR>. . . <BR>assign Rde = Blt & Wyl;<BR>. . . <BR>assign
Rde = Kbl |
Kip;<BR><BR>本例中,Rde有两个驱动源,分别来自于两个连续赋值语句。由于它是线或线网,Rde的有效值由使用驱动源的值(右边表达式的值)的线或(wor)表(参见后面线或网的有关章节)决定。<BR><BR>1.
wire和tri线网<BR> 用于连接单元的连线是最常见的线网类型。连线与三态线(tri)网语法和语义一致;三态线可以用于描述多个驱动源驱动同一根线的线网类型;并且没有其他特殊的意义。<BR><BR>wire
Reset;<BR>wire [3:2] Cla, Pla, Sla;<BR>tri [ MSB-1 : LSB +1]
Art;<BR>如果多个驱动源驱动一个连线(或三态线网),线网的有效值由下表决定。<BR>wire (或 tri) 0 1 x
z<BR>0 0 x x 0<BR>1 x 1 x 1<BR>x x x x x<BR>z 0 1 x
z<BR>下面是一个具体实例:<BR><BR>assign Cla = Pla & Sla;<BR>. . .
<BR>assign Cla = Pla ^
Sla;<BR><BR>在这个实例中,Cla有两个驱动源。两个驱动源的值(右侧表达式的值)用于在上表中索引,以便决定Cla的有效值。由于Cla是一个向量,每位的计算是相关的。例如,如果第一个右侧表达式的值为01x,
并且第二个右测表达式的值为11z,那么Cla 的有效值是x1x (第一位0和1在表中索引到x, 第二位1和1在表中索引到1,第三位x
和z在表中索引到x)。<BR><BR>2.
wor和trior线网<BR> 线或指如果某个驱动源为1,那么线网的值也为1。线或和三态线或(trior)在语法和功能上是一致的。<BR><BR>wor
[MSB:LSB] Art;<BR>trior [MAX-1: MIN-1] Rdx, Sdx,
Bdx;<BR>如果多个驱动源驱动这类网,网的有效值由下表决定。<BR>wor (或 trior) 0 1 x z<BR>0 0 1 x
0<BR>1 1 1 1 1<BR>x x 1 x x<BR>z 0 1 x z<BR><BR>3.
wand和triand线网<BR> 线与(wand)网指如果某个驱动源为0,那么线网的值为0。线与和三态线与(triand)网在语法和功能上是一致的。<BR><BR>wand
[-7 : 0] Dbus;<BR>triand Reset,
Clk;<BR>如果这类线网存在多个驱动源,线网的有效值由下表决定。<BR>wand (或 triand) 0 1 x z<BR>0 0
0 0 0<BR>1 0 1 x 1<BR>x 0 x x x<BR>z 0 1 x z<BR><BR>4.
trireg线网<BR> 此线网存储数值(类似于寄存器),并且用于电容节点的建模。当三态寄存器(trireg)的所有驱动源都处于高阻态,也就是说,值为z时,三态寄存器线网保存作用在线网上的最后一个值。此外,三态寄存器线网的缺省初始值为x。<BR><BR>trireg
[1:8] Dbus, Abus;<BR><BR>5.
tri0和tri1线网<BR> 这类线网可用于线逻辑的建模,即线网有多于一个驱动源。tri0(tri1)线网的特征是,若无驱动源驱动,它的值为0(tri1的值为1)。<BR><BR>tri0
[-3:3] GndBus;<BR>tri1 [0:-5] OtBus,
ItBus;<BR>下表显示在多个驱动源情况下tri0或tri1网的有效值。<BR>tri0 (tri1) 0 1 x z<BR>0 0
x x 0<BR>1 x 1 x 1<BR>x x x x x<BR>z 0 1 x 0(1)<BR><BR>6.
supply0和supply1线网<BR> supply0用于对“地”建模,即低电平0;supply1网用于对电源建模,即高电平1;例如:<BR><BR>supply0
Gnd, ClkGnd;<BR>supply1 [2:0] Vcc;<BR><BR>3.7.2
未说明的线网<BR><BR> 在Verilog
HDL中,有可能不必声明某种线网类型。在这样的情况下,缺省线网类型为1位线网。<BR>可以使用`default_nettype编译器指令改变这一隐式线网说明方式。使用方法如下:<BR><BR>`default_nettype
net_kind<BR><BR>例如,带有下列编译器指令:<BR><BR>`default_nettype
wand<BR><BR>任何未被说明的网缺省为1位线与网。<BR><BR>3.7.3
向量和标量线网<BR><BR> 在定义向量线网时可选用关键词scalared
或vectored。如果一个线网定义时使用了关键词vectored,
那么就不允许位选择和部分选择该线网。换句话说,必须对线网整体赋值(位选择和部分选择在下一章中讲解)。例如:<BR><BR>wire
vectored [3:1] Grb;<BR>//不允许位选择Grb[2]和部分选择Grb [3:2]<BR>wor scalared
[4:0] Best;<BR>//与wor [4:0] Best相同,允许位选择Best [2]和部分选择Best
[3:1]。<BR>如果没有定义关键词,缺省值为标量。<BR><BR>3.7.4
寄存器类型<BR><BR> 有5种不同的寄存器类型。<BR><BR>* reg<BR>* integer<BR>* time<BR>*
real<BR>* realtime<BR><BR>1.
reg寄存器类型<BR> 寄存器数据类型reg是最常见的数据类型。reg类型使用保留字reg加以说明,形式如下:<BR><BR>reg
[ msb: lsb] reg1, reg2, . . . regN;<BR>msb和lsb
定义了范围,并且均为常数值表达式。范围定义是可选的;如果没有定义范围,缺省值为1位寄存器。例如:<BR>reg [3:0] Sat;
//Sat为4 位寄存器。<BR>reg Cnt; //1位寄存器。<BR>reg [1:32] Kisp, Pisp,
Lisp;<BR>寄存器可以取任意长度。寄存器中的值通常被解释为无符号数, 例如:<BR>reg [1:4] Comb;<BR>. .
.<BR>Comb = -2; //Comb 的值为14(1110),1110是2的补码。<BR>Comb = 5;
//Comb的值为15(0101)。<BR><BR>2.
存储器<BR> 存储器是一个寄存器数组。存储器使用如下方式说明:<BR><BR>reg [ msb: 1sb] memory1 [
upper1: lower1],<BR>memory2 [upper2: lower2],. . . ;<BR>例如:<BR>reg
[0:3 ] MyMem [0:63]<BR>//MyMem为64个4位寄存器的数组。<BR>reg Bog
[1:5]<BR>//Bog为5个1位寄存器的数组。<BR>MyMem和Bog都是存储器。数组的维数不能大于2。注意存储器属于寄存器数组类型。线网数据类型没有相应的存储器类型。<BR> 单个寄存器说明既能够用于说明寄存器类型,也可以用于说明存储器类型。<BR><BR>parameter
ADDR_SIZE = 16 , WORD_SIZE = 8;<BR>reg [1: WORD_SIZE] RamPar [
ADDR_SIZE-1 : 0],
DataReg;<BR><BR>RamPar是存储器,是16个8位寄存器数组,而DataReg是8位寄存器。<BR> 在赋值语句中需要注意如下区别:存储器赋值不能在一条赋值语句中完成,但是寄存器可以。因此在存储器被赋值时,需要定义一个索引。下例说明它们之间的不同。<BR><BR>reg
[1:5] Dig; //Dig为5位寄存器。<BR>. . .<BR>Dig =
5'b11011;<BR><BR> 上述赋值都是正确的, 但下述赋值不正确:<BR><BR>reg BOg[1:5];
//Bog为5个1位寄存器的存储器。<BR>. . . <BR>Bog =
5'b11011;<BR><BR> 有一种存储器赋值的方法是分别对存储器中的每个字赋值。例如:<BR><BR>reg [0:3]
Xrom [1:4]<BR>. . . <BR>Xrom[1] = 4'hA;<BR>Xrom[2] =
4'h8;<BR>Xrom[3] = 4'hF;<BR>Xrom[4] =
4'h2;<BR><BR> 为存储器赋值的另一种方法是使用系统任务:<BR> 1) $readmemb
(加载二进制值)<BR> 2) $readmemb
(加载十六进制值)<BR> 这些系统任务从指定的文本文件中读取数据并加载到存储器。文本文件必须包含相应的二进制或者十六进制数。例如:<BR><BR>reg
[1:4] RomB [7:1] ;<BR>$ readmemb ("ram.patt",
RomB);<BR><BR>Romb是存储器。文件“ram.patt”必须包含二进制值。文件也可以包含空白空间和注释。下面是文件中可能内容的实例。<BR><BR>1101<BR>1110<BR>1000<BR>0111<BR>0000<BR>1001<BR>0011<BR><BR> 系统任务$readmemb促使从索引7即Romb最左边的字索引,开始读取值。如果只加载存储器的一部分,值域可以在$readmemb方法中显式定义。例如:<BR><BR>$readmemb
("ram.patt", RomB, 5,
3);<BR><BR>在这种情况下只有Romb[5],Romb[4]和Romb[3]这些字从文件头开始被读取。被读取的值为1101、1100和1000。<BR>文件可以包含显式的地址形式。<BR><BR>@hex_address
value<BR>如下实例:<BR>@5 11001<BR>@2
11010<BR><BR>在这种情况下,值被读入存储器指定的地址。<BR> 当只定义开始值时,连续读取直至到达存储器右端索引边界。例如:<BR><BR>$readmemb
("rom.patt", RomB, 6);<BR>//从地址6开始,并且持续到1。<BR>$readmemb (
"rom.patt", RomB, 6, 4);<BR>//从地址6读到地址4。<BR><BR>3.
Integer寄存器类型<BR> 整数寄存器包含整数值。整数寄存器可以作为普通寄存器使用,典型应用为高层次行为建模。使用整数型说明形式如下:<BR><BR>integer
integer1, integer2,. . . intergerN [msb:1sb]
;<BR><BR>msb和lsb是定义整数数组界限的常量表达式,数组界限的定义是可选的。注意容许无位界限的情况。一个整数最少容纳32位。但是具体实现可提供更多的位。下面是整数说明的实例。<BR><BR>integer
A, B, C; //三个整数型寄存器。<BR>integer Hist [3:6];
//一组四个寄存器。<BR><BR>一个整数型寄存器可存储有符号数,并且算术操作符提供2的补码运算结果。<BR>整数不能作为位向量访问。例如,对于上面的整数B的说明,B[6]和B[20:10]是非法的。一种截取位值的方法是将整数赋值给一般的reg类型变量,然后从中选取相应的位,如下所示:<BR><BR>reg
[31:0] Breg;<BR>integer Bint;<BR>. .
.<BR>//Bint[6]和Bint[20:10]是不允许的。<BR>. . .<BR>Breg =
Bint;<BR>/*现在,Breg[6]和Breg[20:10]是允许的,并且从整数Bint获取相应的位值。*/<BR><BR>上例说明了如何通过简单的赋值将整数转换为位向量。类型转换自动完成,不必使用特定的函数。从位向量到整数的转换也可以通过赋值完成。例如:<BR><BR>integer
J;<BR>reg [3:0] Bcq;<BR><BR>J = 6; //J的值为32'b0000...00110。<BR>Bcq =
J; // Bcq的值为4'b0110。<BR><BR>Bcq = 4'b0101.<BR>J = Bcq;
//J的值为32'b0000...00101。<BR><BR>J = -6; //J 的值为
32'b1111...11010。<BR>Bcq = J;
//Bcq的值为4'b1010。<BR><BR>注意赋值总是从最右端的位向最左边的位进行;任何多余的位被截断。如果你能够回忆起整数是作为2的补码位向量表示的,就很容易理解类型转换。<BR><BR>4.
time类型<BR> time类型的寄存器用于存储和处理时间。time类型的寄存器使用下述方式加以说明。<BR><BR>time
time_id1, time_id2, . . . ,time_idN [
msb:1sb];<BR><BR>msb和lsb是表明范围界限的常量表达式。如果未定义界限,每个标识符存储一个至少64位的时间值。时间类型的寄存器只存储无符号数。例如:<BR><BR>time
Events [0:31]; //时间值数组。<BR>time CurrTime; //CurrTime
存储一个时间值。<BR><BR>5.
real和realtime类型<BR> 实数寄存器(或实数时间寄存器)使用如下方式说明:<BR><BR>//实数说明:<BR>real
real_reg1, real_reg2, . . ., real_regN;<BR>//实数时间说明:<BR>realtime
realtime_reg1, realtime_reg2, . . .
,realtime_regN;<BR>realtime与real类型完全相同。例如:<BR>real Swing,
Top;<BR>realtime
CurrTime;<BR>real说明的变量的缺省值为0。不允许对real声明值域、位界限或字节界限。<BR><BR> 当将值x和z赋予real类型寄存器时,这些值作0处理。<BR><BR>real
RamCnt;<BR>. . . <BR>RamCnt =
'b01x1Z;<BR>RamCnt在赋值后的值为'b01010。<BR><BR>3.8
参数<BR> 参数是一个常量。参数经常用于定义时延和变量的宽度。使用参数说明的参数只被赋值一次。参数说明形式如下:<BR><BR>parameter
param1 = const_expr1, param2 = const_expr2, . . . ,<BR>paramN =
const_exprN;<BR><BR>下面为具体实例:<BR><BR>parameter LINELENGTH = 132,
ALL_X_S = 16'bx;<BR>parameter BIT = 1, BYTE = 8, PI =
3.14;<BR>parameter STROBE_DELAY = ( BYTE + BIT) / 2;<BR>parameter
TQ_FILE = "
/home/bhasker/TEST/add.tq";<BR><BR>参数值也可以在编译时被改变。改变参数值可以使用参数定义语句或通过在模块初始化语句中定义参数值(这两种机制将在第9章中详细讲解)。<BR><BR>习题<BR><BR>1.
下列标识符哪些合法,哪些非法?<BR>COunT, 1_2 Many, \**1, Real?, \wait,
Initial<BR>2. 系统任务和系统函数的第一个字符标识符是什么?<BR>3. 举例说明文本替换编译指令?<BR>4.
在Verilog HDL中是否有布尔类型?<BR>5. 下列表达式的位模式是什么?<BR>7'o44, 'Bx0, 5'bx110,
'hA0, 10'd2, 'hzF<BR>6. 赋值后存储在Qpr中的位模式是什么?<BR>reg [1:8*2] Qpr;<BR>.
. .<BR>Qpr = "ME" ;<BR>7. 如果线网类型变量说明后未赋值,其缺省值为多少?<BR>8. Verilog HDL
允许没有显式说明的线网类型。如果是这样,怎样决定线网类型?<BR>9. 下面的说明错在哪里?<BR>integer [0:3]
Ripple;<BR>10. 编写一个系统任务从数据文件“memA.data”中加载32×64字存储器。<BR>11.
写出在编译时覆盖参数值的两种方法。<BR><BR><BR> </TD></TR>
<TR bgColor=#ffffff>
<TD vAlign=top>
<TABLE cellSpacing=0 cellPadding=0 align=left border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 align=right border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=760 align=center>
<TBODY>
<TR bgColor=#ffffff>
<TD colSpan=2></TD></TR>
<TR bgColor=#ffffff>
<TD class=post vAlign=top> </TD>
<TD align=right></TD></TR></TBODY></TABLE></TD></TR></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=762 align=center border=0>
<TBODY>
<TR>
<TD bgColor=#a0b8d0 height=27>
<TABLE cellSpacing=0 cellPadding=1 width=760 align=center border=0>
<TBODY>
<TR style="COLOR: #ffffff"><!--class="navtd"-->
<TD align=middle bgColor=#00468c height=25>∫ <A
style="COLOR: #ffffff" href="http://www.mcuok.com/prosoft.php"
target=_blank><B>编程器驱动软件下载</A> </B>◆ <A style="COLOR: #ffffff"
href="http://www.mcuok.com/ftpreadme.php" target=_blank><B>FTP说明</A>
</B>★ <A style="COLOR: #ffffff"
href="javascript:addsite();"><B>添加收藏</A> </B>≌ <A
style="COLOR: #ff9900" href="http://www.mcuok.com/zhanghao.php"
target=_blank><B>帐号资料</A> </B>~ <A style="COLOR: #ffffff"
href="http://www.mcuok.com/misc.php?action=search"
target=_blank><B>搜索本站</A> </B>÷ <A style="COLOR: #ffffff"
href="javascript:openwin2('aboutus.php');"><B>关于我们</A>
</B></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TABLE></TD></TR></TABLE><BR><BR>
<TABLE align=center>
<TBODY>
<TR>
<FORM name=jiemi onsubmit="return checkgo2();" action=index.php#ddd
method=post>
<TD style="LINE-HEIGHT: 18pt" align=middle><FONT size=+0> <FONT
face="Arial, Helvetica">All Rights Reserved (C)2002-2008</FONT>
<BR>北京都信技术有限公司(原北京时代飞翔科技有限公司)<BR>【 从事于单片机解密加密技术研究,提供解密服务,仅供合法研究学习用途
】<BR>如有任何问题和建议请联系:<A href="mailto:zjw@263.net"><FONT
face="Arial, Helvetica">zjw@263.net</FONT></A> <BR>
<TABLE width=760 align=center border=0>
<TBODY>
<TR>
<TD vAlign=top align=middle><FONT size=3><SPAN
style="LINE-HEIGHT: 18pt">咨询电话:<FONT face="Arial, Helvetica"
size=3>(010)62245566 (8点30到晚10点)</FONT> <BR>联系人:周家伟工程师 手机:<FONT
face="Arial, Helvetica" size=3>13601097888 或13910122578(7×24小时)
</FONT><BR><U>地址:北京市海淀区西直门北大街甲一号依都阁大厦一层E号 邮政编码:<FONT
face="Arial, Helvetica">100088</FONT></FONT></U></SPAN><BR>
</FONT></TD></TR></TBODY></TABLE><A
href="javascript:openwin2('contract.php');">[ 点这里给我们在线留言 ]</A> <A
href="http://www.mcuok.com/zhanghao.php" target=_blank>[ 帐号资料 ]</A>
<BR><BR></FONT></TD></TR></FORM></TBODY></TABLE>
<CENTER>
<SCRIPT language=javascript>
<!--
function gook() {
f1.pwhidden.value = encode(f1.pwshow.value, parseInt(f1.picnum.value));
f1.username.value=f1.username2.value + "@mcuok.com";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -