Verilog问号(?)运算符

Tri*_*7er 6 verilog operators vhdl

我正在尝试将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
Run Code Online (Sandbox Code Playgroud)

我不明白第8行,请问有谁可以对此有所了解?我在asic-world网站上看到问号是Z角色的Verilog替代品.但我不明白为什么在这种情况下使用它.

亲切的问候

sac*_*een 13

那是一个三元运营商.它是if语句的简写

格式:

condition ? if true : if false
Run Code Online (Sandbox Code Playgroud)

例:

tone[23] ? clkdivider-1 : clkdivider/2-1
Run Code Online (Sandbox Code Playgroud)

翻译成类似的东西(不正确的语法,但我认为你会得到它):

if tone[23] is 1, counter = clkdivider-1
else counter = clkdivider/2-1
Run Code Online (Sandbox Code Playgroud)

以下是使用if语句和三元运算符2到1 MUX的两个示例.

在asic-world网站上,它包含在条件运算符下


小智 5

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

q <= tone[23] ? clkdivider-1 : clkdivider/2-1;
Run Code Online (Sandbox Code Playgroud)

在VHDL中将是:

q <= clkdivider-1 when tone[23] else clkdivider/2-1;
Run Code Online (Sandbox Code Playgroud)