Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog 使用case语句有条件地调用模块_Verilog - Fatal编程技术网

Verilog 使用case语句有条件地调用模块

Verilog 使用case语句有条件地调用模块,verilog,Verilog,我想在sel=0时实现模块加法器,在sel=1时实现模块减法器。我了解到generate可用于有条件地调用另一个模块中的模块 3. module checker(o,a,b,sel); 4. output reg o; 5. input a,b,sel; 6. always@(*) 7. begin 8. generate 9. case (sel)

我想在
sel=0
时实现模块加法器,在
sel=1
时实现模块减法器。我了解到generate可用于有条件地调用另一个模块中的模块

3.         module checker(o,a,b,sel);
4.         output reg o;
5.         input a,b,sel;
6.         always@(*)
7.         begin
8.         generate
9.         case (sel)                               
10.        1'b0 : adder a1(.sum(o),.a(a),.b(b));
11.        1'b1 : subtractor s1(.diff(o),.a(a),b(b));
12.        endcase
13.        endgenerate
14.        end
15.        endmodule

        //errors shown are:

    D:/FILES/verilog files/Neha/checker.v" Line 8: Syntax error near "generate".
    D:/FILES/verilog files/Neha/checker.v" Line 11: Port connections cannot be mixed ordered and named.
    D:/FILES/verilog files/Neha/checker.v" Line 13: Syntax error near "endgenerate".
    D:/FILES/verilog files/Neha/checker.v" Line 10: Instantiation is not allowed in sequential area except checker instantiation.
    D:/FILES/verilog files/Neha/checker.v" Line 11: Instantiation is not allowed in sequential area except checker instantiation

提前谢谢

你不能这样做。由于
generate
块在模拟之前被求值,因此
generate
中的
案例需要一个参数或宏

您可以将
sel
作为两个模块的输入,并相应地执行操作

以下是您的模块的外观:

module add_sub(input a,b,sel,output wire [1:0] s);

assign s = (sel) ? (a + b) : (a - b);

endmodule
根据
sel
,必须执行该操作

顶部模块只是实例化
add\u sub
模块

module checker(o,a,b,sel);

add_sub a1(.a(a), .b(b), .sel(sel), .s(o));

endmodule

你不能这样做。由于
generate
块在模拟之前被求值,因此
generate
中的
案例需要一个参数或宏

您可以将
sel
作为两个模块的输入,并相应地执行操作

以下是您的模块的外观:

module add_sub(input a,b,sel,output wire [1:0] s);

assign s = (sel) ? (a + b) : (a - b);

endmodule
根据
sel
,必须执行该操作

顶部模块只是实例化
add\u sub
模块

module checker(o,a,b,sel);

add_sub a1(.a(a), .b(b), .sel(sel), .s(o));

endmodule

我们在这里设计硬件,而不是编写软件。Verilog
模块
是一块硬件。您不能“调用”Verilog
模块,就像您不能“调用”PCB上的芯片一样

您的
加法器
减法器
模块是一堆硬件。你不能给他们打电话。您需要一些硬件(可能是多路复用器)来选择两个输出并驱动
o
输出:

module checker(o,a,b,sel);
  output /* is this really 1 bit wide?   */ o;
  input  /* are these really 1 bit wide? */ a,b;
  input sel;

  wire   /* are these really 1 bit wide? */ sum, diff;;

  adder      a1(.sum(sum),   .a(a), .b(b));
  subtractor s1(.diff(diff), .a(a), .b(b));

  assign o = sel ? diff : sum;

endmodule

顺便说一下,您的输入和输出肯定超过1位宽吗?

我们在这里设计硬件,而不是编写软件。Verilog
模块
是一块硬件。您不能“调用”Verilog
模块,就像您不能“调用”PCB上的芯片一样

您的
加法器
减法器
模块是一堆硬件。你不能给他们打电话。您需要一些硬件(可能是多路复用器)来选择两个输出并驱动
o
输出:

module checker(o,a,b,sel);
  output /* is this really 1 bit wide?   */ o;
  input  /* are these really 1 bit wide? */ a,b;
  input sel;

  wire   /* are these really 1 bit wide? */ sum, diff;;

  adder      a1(.sum(sum),   .a(a), .b(b));
  subtractor s1(.diff(diff), .a(a), .b(b));

  assign o = sel ? diff : sum;

endmodule

顺便说一句-您的输入和输出肯定超过1位宽吗?

您不能在通电时动态生成硬件。因此,逻辑必须存在

如果您想节省门,您可以使用单加法器,而不是一个加法器和一个减法器。基于select将b值或-b(2的赞美)值传递给它。通过这种方式,您可以节省减法逻辑。 请使用下面的示例并正确地使用代码

assign b_final = sel ? b : -b;
assign s = a+ b_final;

通电时无法动态生成硬件。因此,逻辑必须存在

如果您想节省门,您可以使用单加法器,而不是一个加法器和一个减法器。基于select将b值或-b(2的赞美)值传递给它。通过这种方式,您可以节省减法逻辑。 请使用下面的示例并正确地使用代码

assign b_final = sel ? b : -b;
assign s = a+ b_final;

这只是我用来学习有条件地调用模块的一个例子。实际上,我正在研究浮点运算,它需要32位的输入和输出,可以有条件地进行浮点加法和乘法!这只是我用来学习有条件地调用模块的一个例子。实际上,我正在研究浮点运算,它需要32位的输入和输出,可以有条件地进行浮点加法和乘法!这只是一个例子,我需要32位宽的输入和输出。并且需要基于case语句进行浮点加法或乘法(即,条件类似于sel==0时,执行F.P加法,以及sel==1时执行F.P乘法)!希望你明白我的要求@Neha这是
sel
静态还是动态?如果它是静态的,那么您可以使用
generate
语句。但它看起来像是动态的
sel
,因为它是
checker
的输入。在这种情况下,正如@rahulcodesinverilog所说,您不能使用
generate
语句;相反,您必须实例化(而不是“调用”)两个模块,并使用多路复用器在它们的输出之间切换(正如我所做的)。我不太清楚为什么有必要使用
case
语句,但如果必须使用
case
statemet,请将我的
赋值
替换为包含一个的
始终
块。“除了checker实例化之外,顺序区域中不允许实例化”。这个错误意味着什么?为什么会发生这种错误@听起来你好像在重复你在原来的帖子中犯的错误。通常,不能在过程代码中实例化模块。解释错误消息的实际细节:在SystemVerilog中,
checker
是一个保留字;检查程序是一种特殊的模块,它实际上可以在过程代码中实例化。这只是一个例子,我需要32位宽的输入和输出。并且需要基于case语句进行浮点加法或乘法(即,条件类似于sel==0时,执行F.P加法,以及sel==1时执行F.P乘法)!希望你明白我的要求@Neha这是
sel
静态还是动态?如果它是静态的,那么您可以使用
generate
语句。但它看起来像是动态的
sel
,因为它是
checker
的输入。在这种情况下,正如@rahulcodesinverilog所说,您不能使用
generate
语句;相反,您必须实例化(而不是“调用”)两个模块,并使用多路复用器在它们的输出之间切换(正如我所做的)。我不太清楚为什么有必要使用
case
语句,但如果必须使用
case
statemet,请将我的
赋值
替换为包含一个的
始终
块。“除了checker实例化之外,顺序区域中不允许实例化”。