如果声明并在Verilog中分配电线

时间:2013-07-19 18:07:09

标签: logic hardware verilog hdl

Verilog的新手,并试图找出基于组合逻辑分配电线的基础知识。

我有:

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

其中a和b是带有值的导线 - 而x是进入寄存器的导线。

如果你能指出我需要改变的方向,我将非常感激。

谢谢。

3 个答案:

答案 0 :(得分:6)

wire只能由assign语句分配,这些语句不能与if语句一起使用。 如果您将x更改为reg类型,则可以将其分配给始终阻止。

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

或者,您可以将assign语句与三元运算符?:一起使用,如果您希望它保留为有线类型:

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

答案 1 :(得分:4)

首先要问的是:您是否尝试将这些电线用作输入?或者你使用那些作为连接? 第二件事:你想要一个可综合的代码吗? 并且你不能在一个总是块内分配电线,你必须使用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

答案 2 :(得分:2)

首先,我没有注意到模块中的任何输入输出端口。我也没有注意到开头结束的正确模块声明。

但是,假设您的模块定义如下,输入 a,b和val以及输出 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. 根据如果某些条件为真,将我的值分配给其他值。
  2. 上述 assign 运算符的工作原理如下:

    如果 val == 2'b00,请将x指定为a的值。

    否则如果 val == 2'01,则将x指定为b的值。

    其他 val = 0