到目前为止,电路已经足够简单,以至于输出是输入的简单功能。
随着电路变得越来越复杂,我们需要电线将内部组件连接在一起。当需要使用导线时,应在首次使用之前在模块主体中声明它。 (将来,您会遇到更多类型的信号和变量,它们也以相同的方式声明,但是现在,我们将从wire类型的信号开始)。
1 Declaring wires
1.1 example
在上面的模块中,有三根导线(in,out和not_in),其中两根已经声明为模块输入和输出端口的一部分(这就是为什么在前面的练习中无需声明任何导线的原因)。
电线not_in需要在模块内部声明。从模块外部看不到它。然后,使用两个assign语句创建两个NOT门。请注意,首先创建哪个非门都没关系,我们都会得到相同的电路。
solution:
module top_module (
input in, // Declare an input wire named "in"
output out // Declare an output wire named "out"
);
wire not_in; // Declare a wire named "not_in"
assign out = ~not_in; // Assign a value to out (create a NOT gate).
assign not_in = ~in; // Assign a value to not_in (create another NOT gate).
endmodule // End of module "top_module"
1.2 practice
question:
实现下图电路。创建两条中间线(任意命名)以将AND和OR门连接在一起。请注意,将“非”门馈入的导线实际上是导线,因此不必在此处声明第三条导线。
注意,导线是仅由一个源(一个门的输出)驱动的,但可以为多个输入供电。 如果遵循图中的电路结构,则应该以四个assign语句结束,因为有四个信号需要分配值。
solution:
`default_nettype none
module top_module(
input a,
input b,
input c,
input d,
output out,
output out_n );
wire e;
wire f;
assign e = a & b;
assign f = c & d;
assign out = e | f;
assign out_n = ~(e | f);
endmodule
2 chip named 7458
7458是具有四个“与”门和两个“或”门的芯片。这个问题比7420稍微复杂一些。
创建具有与7458芯片相同功能的模块。它具有10个输入和2个输出。可以选择使用assign语句来驱动每条输出线,也可以选择声明(四根)线用作中间信号,其中每条内部线由与门之一的输出驱动。
尝试上述两种方式。
- 方法一:
module top_module (
input p1a, p1b, p1c, p1d, p1e, p1f,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
assign p1y = (p1a & p1c & p1b)|(p1f & p1e & p1d);
assign p2y = (p2c & p2d)|(p2a & p2b);
endmodule
- 方法二:
module top_module (
input p1a, p1b, p1c, p1d, p1e, p1f,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
wire p3y = (p1f & p1e & p1d);
wire p4y = (p1a & p1c & p1b);
wire p5y = (p2c & p2d);
wire p6y = (p2a & p2b);
assign p1y = p3y|p4y;
assign p2y = p5y|p6y;
endmodule