Verilog问号(?)运算符

11
我试图将一个Verilog程序翻译成VHDL,并遇到了一个在Verilog程序中使用问号(?)运算符的语句。
以下是Verilog代码:
1  module music(clk, speaker);
2  input clk;
3  output speaker;
4  parameter clkdivider = 25000000/440/2;

5  reg [23:0] tone;
6  always @(posedge clk) tone <= tone+1;

7  reg [14:0] counter;
8  always @(posedge clk) if(counter==0) counter <= (tone[23] ? clkdivider-1 : clkdivider/2-1); else counter <= counter-1;

9  reg speaker;
10  always @(posedge clk) if(counter==0) speaker <= ~speaker;
11  endmodule

我不理解第8行的含义,有人能解释一下吗?我在asic-world网站上阅读到问号是Verilog中Z字符的替代符号。但我不明白为什么在这个上下文中要使用它。

谢谢

3个回答

16

那是一个三目运算符,它是if语句的简写形式。

格式:

condition ? if true : if false

例子:

tone[23] ? clkdivider-1 : clkdivider/2-1

翻译成类似以下内容(语法可能不正确,但我认为您会明白):

if tone[23] is 1, counter = clkdivider-1
else counter = clkdivider/2-1

这里有两个使用if语句和三目运算符的2到1 MUX示例

在asic-world网站上,它被涵盖在条件运算符下面。


如果 tone[23] 是 X 或 Z 呢? - PieterNuyts

6

另一种编写方式,例如以下Verilog代码:

q <= tone[23] ? clkdivider-1 : clkdivider/2-1;

在VHDL中,它将是这样的:

q <= clkdivider-1 when tone[23] else clkdivider/2-1;

这就是为什么在问题中声明如此重要的原因。条件必须评估为布尔值。唯一的方式tone[23]将符合该标准是如果tone是一个BOOLEAN_VECTOR。 - user1155120
@user1155120 不是这样的。在VHDL-2008中,它可以是布尔型、标准逻辑型或位型。 - Jim Lewis
条件运算符(9.2.9)可以隐式应用(在条件赋值语句中的 when 后面),对于 BIT 类型,它在标准包中是预定义的。如果没有声明(或实体头),则无法知道 tone 的类型。请注意,针对 std_logic_1164 包中的 std_ulogic 类型定义了重载条件运算符(并且将覆盖具有 std_ulogic 元素基础类型的各种数组类型的元素)。没有任何阻止您提供自己的重载运算符,它将元素类型转换为 BOOLEAN。 - user1155120
一个匆忙的调查显然表明没有综合供应商支持条件运算符(隐式或显式)。 - user1155120
哎呀!在2011年10月的 Synopsys FPGA Synthesis Synplify Pro for Microsemi Edition参考手册 上所示,无论是隐式条件运算符还是显式条件运算符都会出现。可能存在更早的参考资料。 - user1155120

0
把它看作一个MUX,在问号之前是选择位,在冒号的两侧是输入。

请具体说明。 - Abhishek Dutt
更具体地说,是关于Mux还是问号?如果知道它是一个MUX,那么翻译成VHDL应该就足够了,假设你理解硬件和VHDL。 - DavidYu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接