⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ec66 中国电子技术信息网 - 中文版verilog hdl简明教程(4).htm

📁 中文版Verilog HDL 简明教程。HTML格式
💻 HTM
📖 第 1 页 / 共 3 页
字号:
          <TD height=20><FONT color=#f3f3f3>
            <P align=center>2003-9-4</FONT></P></TD></TR></TBODY></TABLE>
      <TABLE cellSpacing=0 width=150 border=0>
        <TBODY>
        <TR>
          <TD height=20><FONT color=#ffffff>相关文章:</FONT> </TD></TR>
        <TR>
          <TD height=20>
            <DIV align=center><A 
            href="http://www.ec66.com/article/list.asp?indexid=604"><FONT 
            color=#ffffff>Verilog HDL网上资源</FONT></A><BR><A 
            href="http://www.ec66.com/article/list.asp?indexid=603"><FONT 
            color=#ffffff>中文版Verilog HDL简明教程(5)</FONT></A><BR><A 
            href="http://www.ec66.com/article/list.asp?indexid=601"><FONT 
            color=#ffffff>中文版Verilog HDL简明教程(3)</FONT></A><BR><A 
            href="http://www.ec66.com/article/list.asp?indexid=600"><FONT 
            color=#ffffff>中文版Verilog 
        HDL简明教程(1、2)</FONT></A><BR></DIV></TD></TR></TBODY></TABLE>
      <TABLE cellSpacing=0 width=150 border=0>
        <TBODY>
        <TR>
          <TD height=20></TD></TR>
        <TR>
          <TD height=20>
            <P align=center><FONT color=#ffffff>==关于文章版权==</FONT></P></TD></TR>
        <TR>
          <TD height=20><FONT 
            color=#ffffff><BR>“本站”本站站主原创文章,未经本人(帝国老手/aoe)许可其他媒体一律不得转载。<BR><BR>“本站整理”本站站主根据个人见解及他人经验总结整理的文章,其他媒体转载必须标明出处为我站。<BR><BR>“某单位或个人”全文转载来自网络上的文章,其他媒体转载与我站无关。<BR><BR>“未知”(1)来自网络,由于来源混乱,无从考证作者,其他媒体转载与我站无关。<BR><BR>“未知”(2)其文章也是本站站主原创的,只所以标注“未知”,主要是因为引用文字过多或其他原因。建议其他媒体转载标明出处为我站。<BR><BR>我站版权请标注:“www.EC66.com”或“中国电子技术信息网”字样。</FONT></TD></TR>
        <TR>
          <TD height=20></TD></TR></TBODY></TABLE></TD>
    <TD vAlign=top width=600 height=240>
      <TABLE height=20 cellSpacing=0 cellPadding=0 width=600 border=0>
        <TBODY>
        <TR>
          <TD bgColor=#5b9595>&nbsp;</TD></TR></TBODY></TABLE>
      <TABLE cellSpacing=3 cellPadding=0 width=600 border=0>
        <TBODY>
        <TR>
          <TD bgColor=#aecece height=20>
            <DIV align=center><FONT color=#0a52d8><B>中文版Verilog 
            HDL简明教程(4)</B></FONT> </DIV></TD></TR>
        <TR>
          <TD width=600>〖文章转载或出处〗≡中国电子技术信息网≡ 网址:www.EC66.com</TD></TR>
        <TR>
          <TD 
            width=600>中文版Verilog&nbsp;HDL简明教程:第4章&nbsp;表&nbsp;达&nbsp;式&nbsp;<BR><BR>  &nbsp;<BR>  本章讲述在Verilog&nbsp;HDL中编写表达式的基础。<BR>  表达式由操作数和操作符组成。表达式可以在出现数值的任何地方使用。<BR><BR>4.1&nbsp;操作数<BR><BR>  操作数可以是以下类型中的一种:<BR>  1)&nbsp;常数<BR>  2)&nbsp;参数<BR>  3)&nbsp;线网<BR>  4)&nbsp;寄存器<BR>  5)&nbsp;位选择<BR>  6)&nbsp;部分选择 <BR>  7)&nbsp;存储器单元<BR>  8)&nbsp;函数调用<BR><BR>4.1.1&nbsp;常数<BR><BR>  前面的章节已讲述了如何书写常量。下面是一些实例。<BR><BR>256,7&nbsp;//非定长的十进制数。<BR>4'b10_11,&nbsp;8'h0A&nbsp;//定长的整型常量。<BR>'b1,&nbsp;'hFBA&nbsp;//非定长的整数常量。<BR>90.00006&nbsp;//实数型常量。<BR>"BOND"&nbsp;//串常量;每个字符作为8位ASCII值存储。<BR><BR>  表达式中的整数值可被解释为有符号数或无符号数。如果表达式中是十进制整数,例如,12被解释为有符号数。如果整数是基数型整数(定长或非定长),那么该整数作为无符号数对待。下面举例说明。<BR><BR>12是01100的5位向量形式(有符号)<BR>-12是10100的5位向量形式(有符号)<BR>5'b01100是十进制数12(无符号)<BR>5'b10100是十进制数20(无符号)<BR>4'd12是十进制数12(无符号)<BR><BR>  更为重要的是对基数表示或非基数表示的负整数处理方式不同。非基数表示形式的负整数作为有符号数处理,而基数表示形式的负整数值作为无符号数。因此-44和-6'o54&nbsp;(十进制的44等于八进制的54)在下例中处理不同。<BR><BR>integer&nbsp;Cone;<BR>.&nbsp;.&nbsp;.<BR>Cone&nbsp;=&nbsp;-44/4<BR>Cone&nbsp;=&nbsp;-6'o54/&nbsp;4;<BR><BR>  注意-44和-6'o54以相同的位模式求值;但是-44作为有符号数处理,而-6'o54作为无符号数处理。因此第一个字符中Cone的值为-11,而在第二个赋值中Cone的值为1073741813。<BR><BR>4.1.2&nbsp;参数<BR><BR>  前一章中已对参数作了介绍。参数类似于常量,并且使用参数声明进行说明。下面是参数说明实例。<BR><BR>parameter&nbsp;LOAD&nbsp;=&nbsp;4'd12,&nbsp;STORE&nbsp;=&nbsp;4'd10;<BR>LOAD&nbsp;和STORE为参数的例子,值分别被声明为12和10。<BR><BR>4.1.3&nbsp;线网<BR><BR>  可在表达式中使用标量线网(1位)和向量线网(多位)。下面是线网说明实例。<BR><BR>wire&nbsp;[0:3]&nbsp;Prt;&nbsp;//Prt&nbsp;为4位向量线网。<BR>wire&nbsp;Bdq;&nbsp;//Bbq&nbsp;是标量线网。<BR><BR>  线网中的值被解释为无符号数。在连续赋值语句中,<BR><BR>assign&nbsp;Prt&nbsp;=&nbsp;-3;<BR>Prt被赋于位向量1101,实际上为十进制的13。在下面的连续赋值中,<BR>assign&nbsp;Prt&nbsp;=&nbsp;4'HA;<BR>Prt被赋于位向量1010,即为十进制的10。<BR><BR>4.1.4&nbsp;寄存器<BR><BR>  标量和向量寄存器可在表达式中使用。寄存器变量使用寄存器声明进行说明。例如:<BR><BR>integer&nbsp;TemA,&nbsp;TemB;<BR>reg&nbsp;[1:5]&nbsp;State;<BR>time&nbsp;Que&nbsp;[1:5];<BR><BR>  整型寄存器中的值被解释为有符号的二进制补码数,而reg寄存器或时间寄存器中的值被解释为无符号数。实数和实数时间类型寄存器中的值被解释为有符号浮点数。<BR><BR>TemA&nbsp;=&nbsp;-10;&nbsp;//TemA值为位向量10110,是10的二进制补码。<BR>TemA&nbsp;=&nbsp;'b1011;&nbsp;//TemA值为十进制数11。<BR><BR>State&nbsp;=&nbsp;-10;&nbsp;//State值为位向量10110,即十进制数22。<BR>State&nbsp;=&nbsp;'b1011;&nbsp;//State值为位向量01011,是十进制值11。<BR><BR>4.1.5&nbsp;位选择<BR><BR>  位选择从向量中抽取特定的位。形式如下:<BR><BR>net_or_reg_vector&nbsp;[bit_select_expr]<BR><BR>  下面是表达式中应用位选择的例子。<BR><BR>State&nbsp;[1]&nbsp;&amp;&amp;&nbsp;State&nbsp;[4]&nbsp;//寄存器位选择。<BR>Prt&nbsp;[0]&nbsp;|&nbsp;Bbq&nbsp;//线网位选择。<BR><BR>  如果选择表达式的值为x、z,或越界,则位选择的值为x。例如State&nbsp;[x]值为x。<BR><BR>4.1.6&nbsp;部分选择<BR><BR>  在部分选择中,向量的连续序列被选择。形式如下:<BR><BR>net_or_reg_vector&nbsp;[msb_const_expr:1sb_const_expr]<BR><BR>  其中范围表达式必须为常数表达式。例如。<BR><BR>State&nbsp;[1:4]&nbsp;//寄存器部分选择。<BR>Prt&nbsp;[1:3]&nbsp;//线网部分选择。<BR>选择范围越界或为x、z时,部分选择的值为x。<BR><BR>4.1.7&nbsp;存储器单元<BR><BR>  存储器单元从存储器中选择一个字。形式如下:<BR><BR>memory&nbsp;[word_address]<BR><BR>例如:<BR>reg&nbsp;[1:8]&nbsp;Ack,&nbsp;Dram&nbsp;[0:63];<BR>.&nbsp;.&nbsp;.&nbsp;<BR>Ack&nbsp;=&nbsp;Dram&nbsp;[60];&nbsp;//存储器的第60个单元。<BR><BR>  不允许对存储器变量值部分选择或位选择。例如,<BR><BR>Dram&nbsp;[60]&nbsp;[2]&nbsp;不允许。<BR>Dram&nbsp;[60]&nbsp;[2:4]&nbsp;也不允许。<BR><BR>  在存储器中读取一个位或部分选择一个字的方法如下:将存储器单元赋值给寄存器变量,然后对该寄存器变量采用部分选择或位选择操作。例如,Ack&nbsp;[2]&nbsp;和Ack&nbsp;[2:4]是合法的表达式。<BR><BR>4.1.8&nbsp;函数调用<BR><BR>  表达式中可使用函数调用。函数调用可以是系统函数调用(以$字符开始)或用户定义的函数调用。例如:<BR><BR>$time&nbsp;+&nbsp;SumOfEvents&nbsp;(A,&nbsp;B)<BR>/*$time是系统函数,并且SumOfEvents是在别处定义的用户自定义函数。*/<BR><BR>4.2&nbsp;操作符<BR><BR>  Verilog&nbsp;HDL中的操作符可以分为下述类型:<BR><BR>  1)&nbsp;算术操作符<BR>  2)&nbsp;关系操作符<BR>  3)&nbsp;相等操作符<BR>  4)&nbsp;逻辑操作符<BR>  5)&nbsp;按位操作符<BR>  6)&nbsp;归约操作符<BR>  7)&nbsp;移位操作符<BR>  8)&nbsp;条件操作符<BR>  9)&nbsp;连接和复制操作符<BR><BR>  下表显示了所有操作符的优先级和名称。操作符从最高优先级(顶行)到最低优先级(底行)排列。同一行中的操作符优先级相同。<BR>  除条件操作符从右向左关联外,其余所有操作符自左向右关联。下面的表达式:<BR><BR>A&nbsp;+&nbsp;B&nbsp;-&nbsp;C<BR>等价于:<BR>(A&nbsp;+&nbsp;B&nbsp;)&nbsp;-&nbsp;C&nbsp;//自左向右<BR>而表达式:<BR>A&nbsp;?&nbsp;B&nbsp;:&nbsp;C&nbsp;?&nbsp;D&nbsp;:&nbsp;F<BR>等价于:<BR>A&nbsp;?&nbsp;B&nbsp;:&nbsp;(C&nbsp;?&nbsp;D&nbsp;:&nbsp;F)&nbsp;//从右向左<BR>圆扩号能够用于改变优先级的顺序,如以下表达式:<BR>(A&nbsp;?&nbsp;B&nbsp;:&nbsp;C)&nbsp;?&nbsp;D&nbsp;:&nbsp;F<BR><BR>4.2.1&nbsp;算术操作符<BR><BR>  算术操作符有:<BR><BR>*&nbsp;+(一元加和二元加)<BR>*&nbsp;-(一元减和二元减)<BR>*&nbsp;*(乘)<BR>*&nbsp;/(除)<BR>*&nbsp;%(取模)<BR><BR>  整数除法截断任何小数部分。例如:<BR><BR>7/4&nbsp;结果为&nbsp;1<BR>取模操作符求出与第一个操作符符号相同的余数。<BR>7%4&nbsp;结果为&nbsp;3<BR>而:<BR>-&nbsp;7%4&nbsp;结果为&nbsp;-3<BR><BR>  如果算术操作符中的任意操作数是X或Z,那么整个结果为X。例如:<BR><BR>'b10x1&nbsp;+&nbsp;'b01111&nbsp;结果为不确定数'bxxxxx<BR><BR>1.&nbsp;算术操作结果的长度<BR>  算术表达式结果的长度由最长的操作数决定。在赋值语句下,算术操作结果的长度由操作符左端目标长度决定。考虑如下实例:<BR><BR>reg&nbsp;[0:3]&nbsp;Arc,&nbsp;Bar,&nbsp;Crt;<BR>reg&nbsp;[0:5]&nbsp;Frx;<BR>.&nbsp;.&nbsp;.&nbsp;<BR>Arc&nbsp;=&nbsp;Bar&nbsp;+&nbsp;Crt;<BR>Frx&nbsp;=&nbsp;Bar&nbsp;+&nbsp;Crt;<BR><BR>  第一个加的结果长度由Bar,Crt和Arc长度决定,长度为4位。第二个加法操作的长度同样由Frx的长度决定(Frx、Bat和Crt中的最长长度),长度为6位。在第一个赋值中,加法操作的溢出部分被丢弃;而在第二个赋值中,任何溢出的位存储在结果位Frx[1]中。<BR>  在较大的表达式中,中间结果的长度如何确定?在Verilog&nbsp;HDL中定义了如下规则:表达式中的所有中间结果应取最大操作数的长度(赋值时,此规则也包括左端目标)。考虑另一个实例:<BR><BR>wire&nbsp;[4:1]&nbsp;Box,&nbsp;Drt;<BR>wire&nbsp;[1:5]&nbsp;Cfg;<BR>wire&nbsp;[1:6]&nbsp;Peg;<BR>wire&nbsp;[1:8]&nbsp;Adt;<BR>.&nbsp;.&nbsp;.<BR>assign&nbsp;Adt&nbsp;=&nbsp;(Box&nbsp;+&nbsp;Cfg)&nbsp;+&nbsp;(Drt&nbsp;+&nbsp;Peg);<BR><BR>  表达式左端的操作数最长为6,但是将左端包含在内时,最大长度为8。所以所有的加操作使用8位进行。例如:Box和Cfg相加的结果长度为8位。<BR><BR>2.&nbsp;无符号数和有符号数<BR>  执行算术操作和赋值时,注意哪些操作数为无符号数、哪些操作数为有符号数非常重要。无符号数存储在:<BR>*&nbsp;线网<BR>*&nbsp;一般寄存器<BR>*&nbsp;基数格式表示形式的整数<BR>  有符号数存储在:<BR>*&nbsp;整数寄存器<BR>*&nbsp;十进制形式的整数<BR>  下面是一些赋值语句的实例:<BR><BR>reg&nbsp;[0:5]&nbsp;Bar;<BR>integer&nbsp;Tab;<BR>.&nbsp;.&nbsp;.<BR>Bar&nbsp;=&nbsp;-4'd12;&nbsp;//寄存器变量Bar的十进制数为52,向量值为110100。<BR>Tab&nbsp;=&nbsp;-4'd12;&nbsp;//整数Tab的十进制数为-12,位形式为110100。<BR><BR>-4'd12&nbsp;/&nbsp;4&nbsp;//结果是1073741821。<BR>-12&nbsp;/&nbsp;4&nbsp;//结果是-3<BR><BR>  因为Bar是普通寄存器类型变量,只存储无符号数。右端表达式的值为'b110100(12的二进制补码)。因此在赋值后,Bar存储十进制值52。在第二个赋值中,右端表达式相同,值为'b110100,但此时被赋值为存储有符号数的整数寄存器。Tab存储十进制值-12(位向量为110100)。注意在两种情况下,位向量存储内容都相同;但是在第一种情况下,向量被解释为无符号数,而在第二种情况下,向量被解释为有符号数。<BR>  下面为具体实例:<BR><BR>Bar&nbsp;=&nbsp;-&nbsp;4'd12/4;<BR>Tab&nbsp;=&nbsp;-&nbsp;4'd12&nbsp;/4;<BR><BR>Bar&nbsp;=&nbsp;-&nbsp;12/4<BR>Tab&nbsp;=&nbsp;-&nbsp;12/4<BR><BR>  在第一次赋值中,Bar被赋于十进制值61(位向量为111101)。而在第二个赋值中,Tab被赋于与十进制1073741821(位值为0011...11101)。Bar在第三个赋值中赋于与第一个赋值相同的值。这是因为Bar只存储无符号数。在第四个赋值中,Bar被赋于十进制值-3。<BR>  下面是另一些例子:<BR><BR>Bar&nbsp;=&nbsp;4&nbsp;-&nbsp;6;<BR>Tab&nbsp;=&nbsp;4&nbsp;-&nbsp;6;<BR>Bar被赋于十进制值62(-2的二进制补码),而Tab被赋于十进制值-2(位向量为111110)。<BR><BR>  下面为另一个实例:<BR><BR>Bar&nbsp;=&nbsp;-2&nbsp;+&nbsp;(-4);<BR>Tab&nbsp;=&nbsp;-2&nbsp;+&nbsp;(-4);<BR>Bar被赋于十进制值58(位向量为111010),而Tab被赋于十进制值-6(位向量为111010)。<BR><BR>4.2.2&nbsp;关系操作符<BR><BR>  关系操作符有:<BR><BR>*&nbsp;&gt;(大于)<BR>*&nbsp;&lt;(小于)<BR>*&nbsp;&gt;=(不小于)<BR>*&nbsp;&lt;=(不大于)<BR><BR>  关系操作符的结果为真(1)或假(0)。如果操作数中有一位为X或Z,那么结果为X。例如:<BR><BR>23&nbsp;&gt;&nbsp;45<BR>结果为假(0),而:<BR>52&lt;&nbsp;8'hxFF<BR>结果为x。如果操作数长度不同,长度较短的操作数在最重要的位方向(左方)添0补齐。例如:<BR>'b1000&nbsp;&gt;&nbsp;=&nbsp;'b01110<BR>等价于:<BR>'b01000&nbsp;&gt;&nbsp;=&nbsp;'b01110<BR>结果为假(0)。&nbsp;<BR><BR>4.2.3&nbsp;相等关系操作符<BR><BR>  相等关系操作符有:<BR><BR>*&nbsp;=&nbsp;=(逻辑相等)<BR>*&nbsp;!=(逻辑不等)<BR>*&nbsp;=&nbsp;=&nbsp;=(全等)<BR>*&nbsp;!=&nbsp;=(非全等)<BR><BR>  如果比较结果为假,则结果为0;否则结果为1。在全等比较中,值x和z严格按位比较。也就是说,不进行解释,并且结果一定可知。而在逻辑比较中,值x和z具有通常的意义,且结果可以不为x。也就是说,在逻辑比较中,如果两个操作数之一包含x或z,结果为未知的值(x)。<BR>  如下例,假定:<BR><BR>Data&nbsp;=&nbsp;'b11x0;<BR>Addr&nbsp;=&nbsp;'b11x0;<BR>那么:<BR>Data&nbsp;=&nbsp;=&nbsp;Addr<BR>不定,也就是说值为x,但:<BR>Data&nbsp;=&nbsp;=&nbsp;=&nbsp;Addr<BR>为真,也就是说值为1。<BR><BR>  如果操作数的长度不相等,长度较小的操作数在左侧添0补位,例如:<BR><BR>2'b10&nbsp;=&nbsp;=&nbsp;4'b0010<BR>与下面的表达式相同:<BR>4'b0010&nbsp;=&nbsp;=&nbsp;4'b0010<BR>结果为真(1)。<BR><BR>4.2.4&nbsp;逻辑操作符<BR><BR>  逻辑操作符有:<BR><BR>*&nbsp;&amp;&amp;&nbsp;(逻辑与)<BR>*&nbsp;||&nbsp;(逻辑或)&nbsp;<BR>*&nbsp;!(逻辑非)<BR><BR>  这些操作符在逻辑值0或1上操作。逻辑操作的结构为0或1。例如,&nbsp;假定:&nbsp;<BR><BR>Crd&nbsp;=&nbsp;'b0;&nbsp;//0为假<BR>Dgs&nbsp;=&nbsp;'b1;&nbsp;//1为真<BR>那么:<BR>Crd&nbsp;&amp;&amp;&nbsp;Dgs&nbsp;结果为0&nbsp;(假)<BR>Crd&nbsp;||&nbsp;Dgs&nbsp;结果为1&nbsp;(真)<BR>!&nbsp;Dgs&nbsp;结果为0&nbsp;(假)<BR>对于向量操作,&nbsp;非0向量作为1处理。例如,假定:<BR>A_Bus&nbsp;=&nbsp;'b0110;<BR>B_Bus&nbsp;=&nbsp;'b0100;<BR>那么:<BR>A_Bus&nbsp;||&nbsp;B_Bus&nbsp;结果为1<BR>A_Bus&nbsp;&amp;&amp;&nbsp;B_Bus&nbsp;结果为&nbsp;1<BR>并且:<BR>!&nbsp;A_Bus&nbsp;与!&nbsp;B_Bus的结果相同。<BR>结果为0。<BR>如果任意一个操作数包含x,结果也为x。<BR>!x&nbsp;结果为x<BR><BR>4.2.5&nbsp;按位操作符<BR><BR>  按位操作符有:<BR><BR>*&nbsp;~(一元非)<BR>*&nbsp;&amp;(二元与)<BR>*&nbsp;|(二元或)<BR>*&nbsp;^(二元异或)<BR>*&nbsp;~^,&nbsp;^~(二元异或非)<BR><BR>  这些操作符在输入操作数的对应位上按位操作,并产生向量结果。下表显示对于不同操作符按步操作的结果。<BR><BR>  例如,假定,<BR>A&nbsp;=&nbsp;'b0110;<BR>B&nbsp;=&nbsp;'b0100;<BR>那么:<BR>A&nbsp;|&nbsp;B&nbsp;结果为0110<BR>A&nbsp;&amp;&nbsp;B&nbsp;结果为0100<BR>如果操作数长度不相等,&nbsp;长度较小的操作数在最左侧添0补位。例如,<BR>'b0110&nbsp;^&nbsp;'b10000<BR>与如下式的操作相同:&nbsp;<BR>'b00110&nbsp;^&nbsp;'b10000<BR>结果为'b10110。<BR><BR>4.2.6&nbsp;归约操作符<BR><BR>  归约操作符在单一操作数的所有位上操作,并产生1位结果。归约操作符有:<BR><BR>*&nbsp;&amp;&nbsp;(归约与)<BR>如果存在位值为0,&nbsp;那么结果为0;若如果存在位值为x或z,结果为x;否则结果为1。<BR>*&nbsp;~&amp;&nbsp;(归约与非)<BR>与归约操作符&amp;相反。<BR>*&nbsp;|&nbsp;(归约或)<BR>如果存在位值为1,那么结果为1;如果存在位x或z,结果为x;否则结果为0。<BR>*&nbsp;~|&nbsp;(归约或非)<BR>与归约操作符|相反。<BR>*&nbsp;^&nbsp;(归约异或)<BR>如果存在位值为x或z,那么结果为x;否则如果操作数中有偶数个1,&nbsp;结果为0;否则结果为1。<BR>*&nbsp;~^&nbsp;(归约异或非)<BR>与归约操作符^正好相反。<BR>如下所示。假定,<BR>A&nbsp;=&nbsp;'b0110;<BR>B&nbsp;=&nbsp;'b0100;<BR>那么:<BR>|B&nbsp;结果为1<BR>&amp;&nbsp;B&nbsp;结果为0<BR>~&nbsp;A&nbsp;结果为1<BR>归约异或操作符用于决定向量中是否有位为x。假定,<BR>MyReg&nbsp;=&nbsp;4'b01x0;<BR>那么:<BR>^MyReg&nbsp;结果为x<BR>  上述功能使用如下的if语句检测:<BR><BR>if&nbsp;(^MyReg&nbsp;=&nbsp;=&nbsp;=&nbsp;1'bx)<BR>$&nbsp;display&nbsp;("There&nbsp;is&nbsp;an&nbsp;unknown&nbsp;in&nbsp;the&nbsp;vector&nbsp;MyReg&nbsp;!")<BR><BR>注意逻辑相等(==)操作符不能用于比较;逻辑相等操作符比较将只会产生结果x。全等操作符期望的结果为值1。<BR><BR>4.2.7&nbsp;移位操作符<BR><BR>  移位操作符有:<BR><BR>*&nbsp;&lt;&lt;&nbsp;(左移)<BR>*&nbsp;&gt;&gt;&nbsp;(右移)<BR><BR>  移位操作符左侧操作数移动右侧操作数表示的次数,它是一个逻辑移位。空闲位添0补位。如果右侧操作数的值为x或z,&nbsp;移位操作的结果为x。假定:<BR><BR>reg&nbsp;[0:7]&nbsp;Qreg;<BR>.&nbsp;.&nbsp;.<BR>Qreg&nbsp;=&nbsp;4'b0111;<BR>那么:<BR>Qreg&nbsp;&gt;&gt;&nbsp;2&nbsp;是&nbsp;8'b0000_0001<BR><BR>  Verilog&nbsp;HDL中没有指数操作符。但是,移位操作符可用于支持部分指数操作。例如,如果要计算ZNumBits的值,可以使用移位操作实现,例如:<BR><BR>32'b1&nbsp;&lt;&lt;&nbsp;NumBits&nbsp;//NumBits必须小于32。<BR>同理,可使用移位操作为2-4解码器建模,如<BR>wire&nbsp;[0:3]&nbsp;DecodeOut&nbsp;=&nbsp;4'b1&nbsp;&lt;&lt;&nbsp;Address&nbsp;[0:1];<BR>Address[0:1]&nbsp;可取值0,1,2和3。与之相应,DecodeOut可以取值4'b0001、4'b0010、4'b0100和4'b1000,从而为解码器建模。<BR><BR>4.2.8&nbsp;条件操作符<BR><BR>  条件操作符根据条件表达式的值选择表达式,形式如下:<BR><BR>cond_expr&nbsp;?&nbsp;expr1&nbsp;:&nbsp;expr2<BR><BR>如果cond_expr&nbsp;为真(即值为1),选择expr1;如果cond_expr为假(值为0),选择expr2。&nbsp;如果cond_expr&nbsp;为x或z,结果将是按以下逻辑expr1和expr2按位操作的值:&nbsp;0与0得0,1与1得1,其余情况为x。<BR>如下所示:<BR><BR>wire&nbsp;[0:2]&nbsp;Student&nbsp;=&nbsp;Marks&nbsp;&gt;&nbsp;18&nbsp;?&nbsp;Grade_A&nbsp;:&nbsp;Grade_C;<BR><BR>计算表达式Marks&nbsp;&gt;&nbsp;18;&nbsp;如果真,&nbsp;Grade_A&nbsp;赋值为Student;&nbsp;如果Marks&nbsp;&lt;&nbsp;=18,&nbsp;Grade_C&nbsp;赋值为Student。下面为另一实例:<BR><BR>always<BR>#5&nbsp;Ctr&nbsp;=&nbsp;(Ctr&nbsp;!=&nbsp;25)&nbsp;?&nbsp;(Ctr&nbsp;+&nbsp;1)&nbsp;:&nbsp;5;<BR>过程赋值中的表达式表明如果Ctr不等于25,&nbsp;则加1;否则如果Ctr值为25时,&nbsp;将Ctr值重新置为5。<BR><BR>4.2.9&nbsp;连接和复制操作<BR><BR>  连接操作是将小表达式合并形成大表达式的操作。形式如下:<BR><BR>{expr1,&nbsp;expr2,&nbsp;.&nbsp;.&nbsp;.,exprN}<BR><BR>  实例如下所示:<BR><BR>wire&nbsp;[7:0]&nbsp;Dbus;<BR>wire&nbsp;[11:0]&nbsp;Abus;<BR><BR>assign&nbsp;Dbus&nbsp;[7:4]&nbsp;=&nbsp;{Dbus&nbsp;[0],&nbsp;Dbus&nbsp;[1],&nbsp;Dbus[2],&nbsp;Dbus[3]};<BR>//以反转的顺序将低端4位赋给高端4位。<BR>assign&nbsp;Dbus&nbsp;=&nbsp;{Dbus&nbsp;[3:0],&nbsp;Dbus&nbsp;[7:4]};<BR>//高4位与低4位交换。<BR>由于非定长常数的长度未知,&nbsp;不允许连接非定长常数。例如,&nbsp;下列式子非法:<BR>{Dbus,5}&nbsp;//不允许连接操作非定长常数。<BR>复制通过指定重复次数来执行操作。形式如下:<BR>{repetition_number&nbsp;{expr1,&nbsp;expr2,&nbsp;...,exprN}}<BR>以下是一些实例:<BR>Abus&nbsp;=&nbsp;{3{4'b1011}};&nbsp;//位向量12'b1011_1011_1011)<BR>Abus&nbsp;=&nbsp;{{4{Dbus[7]}},&nbsp;Dbus};&nbsp;/*符号扩展*/<BR>{3{1'b1}}&nbsp;结果为111<BR>{3{Ack}}&nbsp;结果与{Ack,&nbsp;Ack,&nbsp;Ack}相同。<BR><BR>4.3&nbsp;表达式种类<BR><BR>  常量表达式是在编译时就计算出常数值的表达式。通常,常量表达式可由下列要素构成:<BR>  1)&nbsp;表示常量文字,&nbsp;如'b10和326。<BR>  2)&nbsp;参数名,如RED的参数表明:<BR><BR>parameter&nbsp;RED&nbsp;=&nbsp;4'b1110;<BR><BR>  标量表达式是计算结果为1位的表达式。如果希望产生标量结果,&nbsp;但是表达式产生的结果为向量,&nbsp;则最终结果为向量最右侧的位值。<BR><BR>习题<BR><BR>1.&nbsp;说明参数GATE_DELAY,&nbsp;参数值为5。<BR>2.&nbsp;假定长度为64个字的存储器,&nbsp;每个字8位,编写Verilog&nbsp;代码,按逆序交换存储器的内容。即将第0个字与第63个字交换,第1个字与第62个字交换,依此类推。<BR>3.&nbsp;假定32位总线Address_Bus,&nbsp;编写一个表达式,计算从第11位到第20位的归约与非。<BR>4.&nbsp;假定一条总线Control_Bus&nbsp;[15:0],编写赋值语句将总线分为两条总线:Abus&nbsp;[0:9]和Bbus&nbsp;[6:1]。<BR>5.&nbsp;编写一个表达式,执行算术移位,将Qparity&nbsp;中包含的8位有符号数算术移位。<BR>6.&nbsp;使用条件操作符,&nbsp;编写赋值语句选择NextState的值。如果CurrentState的值为RESET,&nbsp;那么NextState的值为GO;如果CurrentState的值为GO,则NextState&nbsp;的值为BUSY;如果CurrentState的值为BUSY;则NextState的值为RESET。<BR>7.&nbsp;如何从标量变量A,B,C和D中产生总线BusQ[0:3]?&nbsp;如何从两条总线BusA&nbsp;[0:3]和BusY&nbsp;[20:15]形成新的总线BusR[10:1]?<BR>&nbsp;</TD></TR>
        <TR>
          <TD width=600></TD></TR>
        <TR>
          <TD width=600><B>郑重声明</B><BR>&nbsp;&nbsp; 
            近年来我站数百篇“原创文章”被一些媒体肆意转载,不但不标明出自“中国电子技术信息网”,而且把相关字眼删除!这是无视技术价值的盗窃行为,是对技术人员辛勤劳动的蔑视,我对此种行为表示强烈的谴责。<BR>&nbsp;&nbsp; 
            “本是同根生,相煎何太急”,考虑到我们做技术的都是同门兄弟,对以前的盗窃行为不再追究,今后再有此类事件,最低处理限度是“明示于天下”。在这里向转载过又标注了出处的兄弟媒体表示崇高的敬意!<BR>&nbsp;&nbsp; 
            兄弟网站如果引用本站“原创文章”,请首先经本人许可,并标注“www.EC66.com”或“中国电子技术信息网”字样。<BR>&nbsp;&nbsp; 
            欢迎个人下载使用!</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR></DIV>
<DIV align=center>
<P 
align=center>本站所载文章力求原创,部分资料转自网上,转载文章均注明出处。<BR>假如您认为某些文章侵犯了您的权益,请告知我们,我们将在最短的时间内删除有关文章。<BR>如果您对文章内容有任何心得或异议,请到<A 
href="http://www.ecbbs.com/" target=_blank><FONT 
color=red>技术论坛</FONT></A>发表高见!</P>
<P align=center>中国电子技术信息网 文章管理系统由:Aoe 制作<BR>Copyright (C) 2001-2006 EC66.COM All 
Rights Reserved</P></DIV></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -