【问题标题】:If statement and assigning wires in VerilogVerilog 中的 if 语句和分配连线
【发布时间】:2013-07-19 03:08:36
【问题描述】:

我正在尝试弄清楚基于组合逻辑分配电线的基础知识。

我有:

wire val;
wire x;
wire a;
wire b;

always @*
begin

if(val == 00)
 //I want to assign x = a
if(val == 01)
 //I want to assign x = b

end

其中ab 是带有值的连线,x 是进入寄存器的连线。

如果您能指出我需要更改的正确方向,将不胜感激。

【问题讨论】:

    标签: logic hardware verilog hdl


    【解决方案1】:

    首先,我没有注意到您的模块中有任何 inputoutput 端口。我也没有注意到带有 beginningend 的正确模块声明。

    但是,假设您的模块定义如下,具有 inputs a、b 和 val 以及 output x:

    module myfirstmodule (
      input       a,
      input       b,
      input [1:0] val,
      output      x
    );
    
    // Assign a or b to x based upon val
    assign x = (val == 2'b00) ? a : 
               (val == 2'b01) ? b :
               0; // Since val can take on values 00,01,10, and 11, we define all possible cases
    
    endmodule
    

    assign 语句用作 条件 块,就像您在流行的编程语言(如 C 或 C++)中可能习惯的 if 语句一样.

    assign 运算符的工作原理如下:

    1. 根据如果某些条件为真,将我的值分配给其他值。

    上述 assign 运算符的工作原理如下:

    如果 val == 2'b00,将x赋给a的值。

    Else If val == 2'01,将 x 赋值给 b。

    否则 val = 0

    【讨论】:

      【解决方案2】:

      首先要问的是:您是否尝试将这些电线用作输入?还是您将它们用作连接? 第二件事:你想要一个可综合的代码吗? 而且你不能在always块内分配电线,你必须使用reg

      所以意见是:

      //**************************************************************************************
      module(a, b, out); //You have to define an interface, and all Verilog modules starts with module 
      input val[1:0]; //you have to use [] in order to indicate the length. In this case 2 bits, since you want to ask for 00;
      input a;
      input b;
      output out;
      
      reg x;
      
      always @* //NOTE: You are describing combo logic, since there is no clock signal
      begin
      
            if(val == 2'b00)
              x = a;
            else if(val == 2'b01)
              x = b;
            else 
              x = 0; //If you are describing combo logic, you have to cover ALL val cases, in                     order to evade latches
      
      end
      
      assign out = x; //This is how you assign values in Verilog
      
      endmodule
      

      【讨论】:

      • 我只是将 out 声明为 reg 类型,而不使用中间 x。
      【解决方案3】:

      wires 只能由assign 语句赋值,不能与 if 语句一起使用。 如果您将x 更改为reg 类型,那么您将能够在always 块中分配它。

      这将合成完全相同,一个常见的误解是reg 类型变量意味着一个寄存器,但它只是改变了赋值的方式。

      或者,如果您希望它保持为连线类型,您可以使用带有三元运算符?: 的赋值语句:

      assign x = (val==0) ?   a : 
                 (val==1) ?   b : 
                            'bx ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多