使用 case 语句有条件地调用模块
conditionally calling a module using case statement
我想在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
中的 case
需要一个参数或宏。
您可以将 sel
作为两个模块的输入并相应地进行操作。
这是您的模块的样子:
module add_sub(input a,b,sel,output wire [1:0] s);
assign s = (sel) ? (a + b) : (a - b);
endmodule
根据sel
,必须执行操作。
顶层模块简单实例化add_sub
模块。
module checker(o,a,b,sel);
add_sub a1(.a(a), .b(b), .sel(sel), .s(o));
endmodule
我们在这里设计硬件,而不是编写软件。 Verilog module
是一堆硬件。您不能 "call" Verilog module
就像您不能 "call" PCB 上的芯片一样。
您的 adder
和 subtractor
模块是硬件块。你不能 "call" 他们。您需要的是一些硬件 - 可能是多路复用器 - select 两个输出并驱动 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;
我想在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
中的 case
需要一个参数或宏。
您可以将 sel
作为两个模块的输入并相应地进行操作。
这是您的模块的样子:
module add_sub(input a,b,sel,output wire [1:0] s);
assign s = (sel) ? (a + b) : (a - b);
endmodule
根据sel
,必须执行操作。
顶层模块简单实例化add_sub
模块。
module checker(o,a,b,sel);
add_sub a1(.a(a), .b(b), .sel(sel), .s(o));
endmodule
我们在这里设计硬件,而不是编写软件。 Verilog module
是一堆硬件。您不能 "call" Verilog module
就像您不能 "call" PCB 上的芯片一样。
您的 adder
和 subtractor
模块是硬件块。你不能 "call" 他们。您需要的是一些硬件 - 可能是多路复用器 - select 两个输出并驱动 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;