我试图弄清楚基于组合逻辑分配电线的基础知识。
我有:
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 x = (val==0) ? a :
(val==1) ? b :
'bx ;
首先要问的是:您是否尝试将这些电线用作输入?还是您将它们用作连接?第二件事:你想要一个可综合的代码吗?而且你不能在 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
首先,我没有注意到您的模块中有任何输入或输出端口。我也没有注意到带有begin和end的正确模块声明。
但是,假设您的模块定义如下,输入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
赋值语句用作条件块,就像您可能在流行的编程语言(如 C 或 C++)中使用的 if 语句一样。
分配运算符的工作方式如下:
上述赋值运算符的工作原理如下:
如果val == 2'b00,则将 x 赋给 a 的值。
否则,如果val == 2'01,则将 x 分配给 b 的值。
否则val = 0