如果在Verilog中声明和分配电汇

T.T*_*.T. 3 hardware logic 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
Run Code Online (Sandbox Code Playgroud)

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

如果你能指出我正确的方向,我需要改变,我将不胜感激.

谢谢.

Tim*_*Tim 6

wires只能由assign语句分配,不能与if语句一起使用.如果更改xreg类型,则可以在始终块中分配它.

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

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

assign x = (val==0) ?   a : 
           (val==1) ?   b : 
                      'bx ;
Run Code Online (Sandbox Code Playgroud)


DOS*_*DOS 5

首先要问的是:您是否要使用这些导线作为输入?还是使用这些作为连接?第二件事:您是否想要一个可综合的代码?而且您不能在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
Run Code Online (Sandbox Code Playgroud)

  • 我只是声明为reg类型,而不使用中间的x。 (5认同)