我试图将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替代品。但我不明白为什么在这种背景下使用它。
亲切的问候
答案 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编码
,这是优先级的简写