第10章Verilog操作符ppt课件.ppt
《第10章Verilog操作符ppt课件.ppt》由会员分享,可在线阅读,更多相关《第10章Verilog操作符ppt课件.ppt(117页珍藏版)》请在三一文库上搜索。
1、第10章 Verilog操作符,学习内容: 熟悉Verilog语言的操作符,操作符类型,下表以优先级顺序列出了Verilog操作符。注意“与”操作符的优先级总是比相同类型的“或”操作符高。本章将对每个操作符用一个例子作出解释。,最高,最低,优先级,Verilog中的大小(size)与符号,Verilog根据表达式中变量的长度对表达式的值自动地进行调整。 Verilog自动截断或扩展赋值语句中右边的值以适应左边变量的长度。 当一个负数赋值给无符号变量如reg时,Verilog自动完成二进制补码计算,module sign_size; reg 3:0 a, b; reg 15:0 c; initi
2、al begin a = -1; / a是无符号数,因此其值为1111 b = 8; c= 8; / b = c = 1000 #10 b = b + a; / 结果10111截断, b = 0111 #10 c = c + a; / c = 10111 end endmodule,算术操作符,module arithops (); parameter five = 5; integer ans, int; reg 3: 0 rega, regb; reg 3: 0 num; initial begin rega = 3; regb = 4b1010; int = -3; /int = 111
3、11111_1101 end initial fork #10 ans = five * int; / ans = -15 #20 ans = (int + 5)/ 2; / ans = 1 #30 ans = five/ int; / ans = -1 #40 num = rega + regb; / num = 1101 #50 num = rega + 1; / num = 0100 #60 num = int; / num = 1101 #70 num = regb % rega; / num = 1 #80 $finish; join endmodule,+ 加 - 减 * 乘 /
4、除 % 模,将负数赋值给reg或其它无符号变量使用2的补码算术。 如果操作数的某一位是x或z,则结果为x 在整数除法中,余数舍弃 模运算中使用第一个操作数的符号,注意integer和reg类型在算术运算时的差别。integer是有符号数,而reg是无符号数。,按位操作符,module bitwise (); reg 3: 0 rega, regb, regc; reg 3: 0 num; initial begin rega = 4b1001; regb = 4b1010; regc = 4b11x0; end initial fork #10 num = rega join endmodul
5、e, not & and | or xor xnor xnor,按位操作符对矢量中相对应位运算。 regb = 4b1 0 1 0 regc = 4b1 x 1 0 num = regb 位值为x时不一定产生x结果。如#50时的or计算。,当两个操作数位数不同时,位数少的操作数零扩展到相同位数。,a = 4b1011; b = 8b01010011; c = a | b; / a零扩展为 8b00001011,逻辑操作符,module logical (); parameter five = 5; reg ans; reg 3: 0 rega, regb, regc; initial begi
6、n rega = 4b0011; /逻辑值为“1” regb = 4b10xz; /逻辑值为“1” regc = 4b0z0x; /逻辑值为“x” end initial fork #10 ans = rega join endmodule,! not & and | or,逻辑操作符的结果为一位1,0或x。 逻辑操作符只对逻辑值运算。 如操作数为全0,则其逻辑值为false 如操作数有一位为1,则其逻辑值为true 若操作数只包含0、x、z,则逻辑值为x,逻辑反操作符将操作数的逻辑值取反。例如,若操作数为全0,则其逻辑值为0,逻辑反操作值为1。,逻辑反与位反的对比,module negati
7、on(); reg 3: 0 rega, regb; reg 3: 0 bit; reg log; initial begin rega = 4b1011; regb = 4b0000; end initial fork #10 bit = rega; / num = 0100 #20 bit = regb; / num = 1111 #30 log = !rega; / num = 0 #40 log = !regb; / num = 1 #50 $finish; join endmodule,! logical not 逻辑反 bit-wise not 位反,逻辑反的结果为一位1,0或x。
8、 位反的结果与操作数的位数相同,逻辑反操作符将操作数的逻辑值取反。例如,若操作数为全0,则其逻辑值为0,逻辑反操作值为1。,一元归约操作符,module reduction(); reg val; reg 3: 0 rega, regb; initial begin rega = 4b0100; regb = 4b1111; end initial fork #10 val = join endmodule,& and | or xor xnor xnor,归约操作符的操作数只有一个。 对操作数的所有位进行位操作。 结果只有一位,可以是0, 1, X。,移位操作符,module shift (
9、); reg 9: 0 num, num1; reg 7: 0 rega, regb; initial rega = 8b00001100; initial fork #10 num 3; / num = 00_0000_0001 #20 regb 3 ; / regb = 0000_0001 #30 num 2; /rega = 1111_1100 #50 num1 2;/num1=00_1111_1100 #60 $finish; join endmodule, 逻辑右移 逻辑左移,移位操作符对其左边的操作数进行向左或向右的位移位操作。 第二个操作数(移位位数)是无符号数 若第二个操作数是
10、x或z则结果为x,在赋值语句中,如果右边(RHS)的结果: 位宽大于左边,则把最高位截去 位宽小于左边,则零扩展, 将左边的操作数右移右边操作数指定的位数,左移先补后移 右移先移后补,建议:表达式左右位数一致,关系操作符,module relationals (); reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b0x10; end initial fork #10 val = regc rega ; / val = x #20 val = regb = rega
11、; / val = 1 #40 val = regb regc ; / val = 1 #50 $finish; join endmodule, 大于 = 大于等于 = 小于等于,其结果是1b1、1b0或1bx。,无论x为何值,regbregc,rega和regc的关系取决于x,相等操作符,赋值操作符,将等式右边表达式的值拷贝到左边。,注意逻辑等与 case等的差别,=,逻辑等,= =,case等,= = =,2b1x=2b0x 值为0,因为不相等 2b1x=2b1x 值为x,因为可能不相等,也可能相等,2b1x=2b0x 值为0,因为不相同 2b1x=2b1x 值为1,因为相同,a = 2b
12、1x; b = 2b1x; if (a = b) $display(“ a is equal to b“); else $display(“ a is not equal to b“);,a = 2b1x; b = 2b1x; if (a = b) $display(“ a is identical to b“); else $display(“ a is not identical to b“);,Case等只能用于行为描述,不能用于RTL描述。,相等操作符,逻辑等 逻辑不等,= ! =,module equalities1(); reg 3: 0 rega, regb, regc; reg
13、 val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b1x10; end initial fork #10 val = rega = regb ; / val = 0 #20 val = rega != regc; / val = 1 #30 val = regb != regc; / val = x #40 val = regc = regc; / val = x #50 $finish; join endmodule,其结果是1b1、1b0或1bx。 如果左边及右边为确定值并且相等,则结果为1。 如果左边及右边为确定值并且不相
14、等,则结果为0。 如果左边及右边有值不能确定的位,但值确定的位相等,则结果为x。 !=的结果与= =相反,值确定是指所有的位为0或1。不确定值是有值为x或z的位。,相等操作符,相同(case等) 不相同(case不等),= ! =,module equalities2(); reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b1x10; end initial fork #10 val = rega = regb ; / val = 0 #20 val = rega !
15、= regc; / val = 1 #30 val = regb = regc; / val = 0 #40 val = regc = regc; / val = 1 #50 $finish; join endmodule,其结果是1b1、1b0或1bx。 如果左边及右边的值相同(包括x、z),则结果为1。 如果左边及右边的值不相同,则结果为0。 !=的结果与 = 相反,综合工具不支持,条件操作符,条件,?:,module likebufif( in, en, out); input in; input en; output out; assign out = (en = 1) ? in :
16、bz; endmodule module like4to1( a, b, c, d, sel, out); input a, b, c, d; input 1: 0 sel; output out; assign out = sel = 2b00 ? a : sel = 2b01 ? b : sel = 2b10 ? c : d; endmodule,如果条件值为x或z,则结果可能为x或z,条件操作符,条件操作符的语法为: = ? :,registger = condition ? true_value:false_value;,其意思是:if condition is TRUE, then
17、LHS=true_expression, else LHS = false_expression,每个条件操作符必须有三个参数,缺少任何一个都会产生错误。 最后一个操作数作为缺省值。,上式中,若condition为真则register等于true_value;若condition为假则register等于false_value。一个很有意思的地方是,如果条件值不确定,且true_value和false_value不相等,则输出不确定值。,例如:assign out = (sel = 0) ? a : b;,若sel为0则out =a;若sel为1则out = b。如果sel为x或z,若a =
18、b =0,则out = 0;若ab,则out值不确定。,级联操作符,级联, ,可以从不同的矢量中选择位并用它们组成一个新的矢量。 用于位的重组和矢量构造,module concatenation; reg 7: 0 rega, regb, regc, regd; reg 7: 0 new; initial begin rega = 8b0000_0011; regb = 8b0000_0100; regc = 8b0001_1000; regd = 8b1110_0000; end initial fork #10 new = regc 4: 3, regd 7: 5, regb 2, reg
19、a 1: 0; / new = 8b11111111 #20 $finish; join endmodule,在级联和复制时,必须指定位数,否则将产生错误。 下面是类似错误的例子: a7:0 = 4 b10; b7:0 = 2 5; c3:0 = 3b011, b0; 级联时不限定操作数的数目。在操作符符号 中,用逗号将操作数分开。例如: A, B, C, D,复制,复制, ,复制一个变量或在 中的值,module replicate (); reg 3: 0 rega; reg 1: 0 regb, regc; reg 7: 0 bus; initial begin rega = 4b100
20、1; regb = 2b11; regc = 2b00; end initial fork #10 bus = 4 regb; / bus = 11111111 / regb is replicated 4 times. #20 bus = 2 regb, 2 regc ; / bus = 11110000. regc and regb are each / replicated, and the resulting vectors / are concatenated together #30 bus = 4 rega1, rega ; / bus = 00001001. rega is s
21、ign-extended #40 $finish; join endmodule,前两个 符号之间的正整数指定复制次数。,复习,第11章 行为建模,学习内容: 行为建模的基本概念 Verilog中高级编程语言结构 如何使用连续赋值,行为描述,行为级描述是对系统的高抽象级描述。在这个抽象级,注重的是整个系统的功能而不是实现。 Verilog有高级编程语言结构用于行为描述,包括: wait, while, if then, case和forever Verilog的行为建模是用一系列以高级编程语言编写的并行的、动态的过程块来描述系统的工作。,过程(procedural)块,过程块是行为模型的基础。
22、 过程块有两种: initial块,只能执行一次 always块,循环执行 过程块中有下列部件 过程赋值语句:在描述过程块中的数据流 高级结构(循环,条件语句):描述块的功能 时序控制:控制块的执行及块中的语句。,过程赋值(procedural assignment),在过程块中的赋值称为过程赋值。 在过程赋值语句中表达式左边的信号必须是寄存器类型(如reg类型) 在过程赋值语句等式右边可以是任何有效的表达式,数据类型也没有限制。 如果一个信号没有声明则缺省为wire类型。使用过程赋值语句给wire赋值会产生错误。,module adder (out, a, b, cin); input a,
23、 b, cin; output 1:0 out; wire a, b, cin; reg half_sum; reg 1: 0 out; always ( a or b or cin) begin half_sum = a b cin ; / OK half_carry = a end endmodule,half_carry没有声明,过程时序控制,在过程块中可以说明过程时序。过程时序控制有三类: 简单延时(#delay):延迟指定时间步后执行 边沿敏感的时序控制:() 在信号发生翻转后执行。 可以说明信号有效沿是上升沿(posedge)还是下降沿(negedge)。 可以用关键字or指定多个
24、参数。 电平敏感的时序控制:wait() 直至expr值为真时(非零)才执行。 若expr已经为真则立即执行。,module wait_test; reg clk, waito, edgeo; initial begin initial begin clk = 0;edgeo=0;waito=0;end always #10 clk = clk; always (clk) #2 edgeo = edgeo; always wait(clk) #2 waito = waito; endmodule,简单延时,在test bench中使用简单延时(#延时)施加激励,或在行为模型中模拟实际延时。,m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 Verilog 操作 ppt 课件
链接地址:https://www.31doc.com/p-2546922.html