Logic Verilog中的If语句和配线

Logic Verilog中的If语句和配线,logic,hardware,verilog,hdl,Logic,Hardware,Verilog,Hdl,我试图找出基于组合逻辑分配导线的基本原理 我有: 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是进入寄存器的导线 如果您能为我指出需要更改的内容的正确方向,我将不胜感激。wires只能通过assign语句进行赋值,而不能与If语句一起使用。

我试图找出基于组合逻辑分配导线的基本原理

我有:

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
是进入寄存器的导线


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

wire
s只能通过
assign
语句进行赋值,而不能与If语句一起使用。 如果将
x
更改为
reg
类型,则可以在“始终”块中分配它

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

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

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

首先要问的是:您是否试图使用这些导线作为输入?或者你用这些作为连接? 第二件事:你想要一个可合成的代码吗? 并且不能在“始终”块内指定导线,必须使用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

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

但是,假设您的模块定义如下,具有输入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
<> > <强>赋值<强>语句用作强< >条件<强>块,如<>强> I/St>语句,您可能习惯于流行的编程语言,如C或C++。

assign操作符的工作原理如下:

  • 如果某些条件为真,则根据将我的值分配给其他值
  • 上述分配操作符的工作如下:

    如果val==2'b00,则将x指定给a的值

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


    Elseval=0

    我只声明为reg类型,而不使用中间x。