0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

条件(三元)运算符

汽车电子技术 来源: OpenFPGA 作者: 碎碎思 2023-02-09 15:42 次阅读

数字硬件建模SystemVerilog-条件(三元)运算符

图片

经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式和运算符。

马上HDLBits-SystemVerilog版本也开始准备了,基本这一部分完成后就开始更新~

图片

介绍

RTL建模中广泛使用的运算符是条件运算符,也称为三元运算符,该运算符用于在两个表达式之间进行选择——表5-2列出了用于表示条件运算符的重点。

表5-2:RTL建模的条件(三元)运算符| 运算符 | 示例用法 | 描述 |

| -------- | ---------- | ------------------------------------------------------------------------------- |

| ?: | s?m:n | 如果s为真,则选择m;如果s为假,则选择n,否则(s不为真不为假)对m和n进行按位比较 |

问号(?)前面列出的表达式被称为控制表达式(control expression),表示它可以是一个简单的整数值(任何大小的向量,包括1位),也可以是另一个返回整数值的操作的结果。例如:

图片

使用以下规则将控制表达式计算为true或false:

  • 如果所有位为l,则表达式为true。
  • 如果所有位均为0,则表达式为false。
  • 如果未设置任何位且并非所有位均为0,则表达式未知,如果某些位为X或Z,则可能出现这种情况。

对于4-state值,控制表达式可能既不是真的也不是假的。在下面的值中,没有一个位是l,但不是所有的位都是0。

图片

当控制表达式未知时,条件运算符对两个可能的返回值进行按位比较。如果对应位均为0,则该位位置返回0,如果对应位均为l,则该位位置返回1。如果对应的位不同,或者任一位有X或Z值,则返回该位位置的X。下面的示例演示了这种仿真行为。

图片

条件运算符的行为通常类似于硬件多路复用器。示例5-3说明了如何使用条件运算符在寄存器的两个输入之间进行选择。图5-3显示了综合该示例的结果。条件运算符映射到四个多路复用器,四位d1和d2输入的每一位对应一个多路复用器。

示例5-3:使用条件运算符:4位多路复用寄存器D输入

// 4-bit register with multiplexed D input, using conditional
// operator.
//
//`begin_keywords "1800-2012" // use SystemVerilog-2012 keywords
module muxed_register
#(parameter WIDTH = 4)                 // register size
(input  logic             clk,         // 1-bit input
 input  logic             data_select, // 1-bit input
 input  logic [WIDTH-1:0] d1, d2,      // scalable input size
 output logic [WIDTH-1:0] q_out        // scalable output size
);
  timeunit 1ns; timeprecision 1ns;

  always_ff @(posedge clk)
    q_out <= data_select? d1 : d2;     // store d1 or d2

endmodule: muxed_register
//`end_keywords

图形5-3:示例5-3的综合结果:条件运算符(多路复用寄存器)图片

图5-3所示的电路是综合编译器将电路映射到特定ASICFPGA目标实现之前的中间通用综合结果。用于生成图5-3的综合编译器使用了具有未连接的set和rst输入的通用触发器,使用ASIC或FPGA库的最终实现可能能够使用没有这些输入的触发器(如果目标设备中可用)。不同的综合编译器可能会使用不同的通用型组件来表示这些中间结果。

条件运算符并不总是作为多路复用器实现。综合编译器可能会根据操作数的类型和运算的上下文,将条件运算符映射并优化为其他类型的门级逻辑。在示例5-4中,条件运算符表示三态缓冲器,而不是多路复用逻辑,图5-4显示了综合该示例的结果,

示例5-4:使用条件运算符:带三态输出的4位加法器

// 4-bit adder with tri-state outputs, using conditional operator
// (no carry).
//
//`begin_keywords "1800-2012" // use SystemVerilog-2012 keywords
module tri_state_adder
#(parameter N = 4)                // N-bit adder size
(input  logic             enable, // output enable
input  logic     [N-1:0] a, b,   // scalable input size
output tri logic [N-1:0] out     // tri-state output, net type
);
 timeunit 1ns; timeprecision 1ns;

 assign out = enable? (a + b) : 'z;  // tri-state buffer

endmodule: tri_state_adder
//`end_keywords

在本例中,条件运算符(?)选择输出端口应分配(a+b)或高阻抗。如果en为false,则将out赋值为z。’z标记是一个文字值,用于将表达式的所有位设置为高阻抗,并自动缩放到表达式的向量大小。有关向量填充文字值的更多详细信息,请参见之前的文章。

在示例5-4中观察,out三态输出端口被声明为3-state logic类型,而不是通常的逻辑类型,logic数据类型只定义端口时可以有四态值,它不定义端口类型是网络类型或者变量类型。输出端口默认为变量类型,除非显式声明为NET(网络)类型。(相反,输入端口将默认为NET类型,除非显式声明为变量类型),关键字•tri声明网络类型。tri类型在各个方面都与wire类型相同,但tri关键字可以帮助记录网络或端口的预期三态(高阻抗)值。

图5-4:示例5-4的综合结果:条件运算符(三态输出)图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 建模
    +关注

    关注

    1

    文章

    281

    浏览量

    60502
  • RTL
    RTL
    +关注

    关注

    1

    文章

    377

    浏览量

    59068
  • 运算符
    +关注

    关注

    0

    文章

    163

    浏览量

    10947
收藏 人收藏

    评论

    相关推荐

    JAVA语言的运算符及表达式

    ;3.5.2 运算符运算符指明对操作数的运算方式。运算符按其要求的操作数个数分为:单目运算符、双目运算符
    发表于 12-06 00:28

    C语言单片机第七课 运算符和表达式(关系运算符)

    时,这个时候就是关系表达式。关系表达式通常是用来判别某个条件是否满足。要注意的是用关系运算符运算结果只有 0 和 1 两种,也就是逻辑的真与假,当指定的条件满足时结果为 1,不满足时
    发表于 10-21 09:38

    炼狱传奇-移位和位拼运算符之战

    运算符,就会使程序编写起来变得简单了。代码的意思就是,每次把最低位放到最高位,让前位放到后面,这样逻辑“1”就实现了移位,形成了循环。
    发表于 04-30 09:43

    【FPGA】VHDL 语言的运算符有哪些?计算的优先级是怎样的?

    注意的是乘方(**)运算的右边必须为整数。VHDL 的算术运算符如表 2-8 所示。4.移位运算符移位运算符为二
    发表于 09-12 09:51

    【梦翼师兄今日分享】 常见的关系运算符(移位运算符)

    立即学习>>梦翼师兄FPGA培训(视频加板卡),手把手带你入门FPGA写在前面的话移位运算符是双目运算符,将运算符左边的操作数左移或右移指定的位数,用0来补充空闲位。如果右边操作数的值
    发表于 12-17 10:45

    【梦翼师兄今日分享】 常见的关系运算符(位拼运算符

    立即学习>>梦翼师兄FPGA培训(纯视频),手把手带你入门FPGA写在前面的话位拼运算符是将多个小的表达式合并形成一个大的表达式,用符号{}来实现多个表达式的连接运算,各个表达式之间用
    发表于 12-19 09:38

    C语言运算符优先级(超详细)

    C语言运算符优先级(超详细) 当想找哪个运算符优先级高时,很多时候总是想找的就没有,真让人气愤!现在,终于有个我个人觉得非常全的,分享给大家,欢迎拍砖!C语言运算符优先级[table]优先级
    发表于 04-27 16:47

    Java基础之Java运算符

    、逻辑运算符条件运算符、位运算符。如下图所示: 算术运算符 //注意区分是否为字符串连接System.out.println(
    发表于 05-18 15:39

    逻辑运算符是什么

    逻辑运算符:与或非条件结构if -else及其嵌套循环结构whilefordo-while
    发表于 07-14 07:50

    如何去使用运算符

    运算的定义是什么?运算符是由什么组成的?如何去使用运算符
    发表于 07-15 13:13

    C语言中运算符? :怎么使用?

    C语言中运算符? :怎么使用?
    发表于 11-02 09:23

    算术运算符的相关资料分享

    一:算术运算符算术运算符非常地简单,就是小学数学里面的一些加减乘除操作。不过呢,还是有一些语法细节需要注意的。1.加法运算符 + 1 在第3行利用加法运算符 + 进行了加法
    发表于 11-30 06:09

    运算符的相关资料推荐

    运算符1、算数操作运算符+、-、*、/、%加法:A+B, AB最好是同类型乘除:乘法在很多CPU中并不支持,乘除法能不用就不用,可能会使执行变差求模/求余数:n%m=res[0~(m-1)]求模
    发表于 12-24 06:13

    2.7 python运算符

    优先级的所有运算符:[table][td]运算符描述**指数 (最高优先级)~,+,-按位翻转, 一加号和减号 (最后两个的方法名为 +@ 和 -@)*,/,%,//乘,除,取模和取整除+,-加法减法
    发表于 02-21 16:43

    条件运算符是什么_条件运算符有哪些

    运算符优先级高于赋值、逗号运算符,低于其他运算符。关系运算实际上是逻辑比较运算,它是逻辑运算
    发表于 11-16 16:02 1.1w次阅读
    <b class='flag-5'>条件</b><b class='flag-5'>运算符</b>是什么_<b class='flag-5'>条件</b><b class='flag-5'>运算符</b>有哪些