【问题标题】:Verilog question mark (?) operatorVerilog 问号 (?) 运算符
【发布时间】:2012-09-09 02:48:06
【问题描述】:

我正在尝试将 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 替代品。但我不明白为什么在这种情况下使用它。

亲切的问候

【问题讨论】:

    标签: operators vhdl verilog


    【解决方案1】:

    那是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覆盖

    【讨论】:

      【解决方案2】:

      另一种写法,例如以下 Verilog:

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

      在 VHDL 中是:

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

      【讨论】:

      • 这就是为什么声明在问题中如此重要的原因。条件必须计算为布尔值。音调[23] 满足该标准的唯一方法是音调是否为 BOOLEAN_VECTOR。
      • @user1155120 不是这样。在 VHDL-2008 中,它可以是布尔值、std_logic 或位。
      • 可以隐式应用的条件运算符 (9.2.9)(在条件赋值语句中的 when 之后)在 BIT 类型的包标准中预定义。没有声明(或实体头),音调的类型是未知的。请注意,重载条件运算符是为包 std_logic_1164 中的类型 std_ulogic 定义的(并且将覆盖具有 std_ulogic 元素基类型的各种数组类型的元素)。没有什么可以阻止您提供自己的重载运算符,它将元素类型转换为 BOOLEAN。
      • 一项匆忙的调查显然表明没有综合供应商支持条件运算符隐式或其他方式。
      • 糟糕!出现在Synopsys FPGA Synthesis Synplify Pro for Microsemi Edition Reference Manual 2011 年 10 月。第 752 页,隐式和显式条件运算符。可能有更早的参考资料。
      【解决方案3】:

      把它想象成一个 MUX,在 ?是选择位, : 的两侧是输入

      【讨论】:

      • 请更具体。
      • 更具体的 Mux 还是问号?在知道它是一个 MUX 之后,假设您了解硬件和 vhdl,它应该足以转换为 VHDL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 2015-07-08
      相关资源
      最近更新 更多