Verilog问号(?)运算符

时间:2012-09-09 02:48:07

标签: operators vhdl verilog

我试图将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网站上看到问号是Z字符的Verilog替代品。但我不明白为什么在这种背景下使用它。

亲切的问候

4 个答案:

答案 0 :(得分:12)

那是ternary operator。它是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

以下是2 to 1 MUX using if statement and ternary operator的两个示例。

在asic-world网站上,它涵盖在Conditional Operators

答案 1 :(得分:5)

另一种写作方式,例如以下Verilog:

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

将是:

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

答案 2 :(得分:0)

在 ?是选择位和两侧的 : 是输入

答案 3 :(得分:-2)

请注意,您可以按以下方式链接此运算符

q <= <1st condition> ? <1st choice> : <2nd condition> ? <2nd choice> : <3rd choice>

如果.. else如果.. else .. else else编码

,这是优先级的简写