下列提供的代码答案不唯一!
目录
1、Simple wire
创建具有一个输入和一个输出的模块,该模块的行为类似于连接。
与物理导线不同,Verilog中的导线(和其他信号)是定向的,既具有方向性,这意味着信息只向一个方向流动,从驱动程序流向接收器。在Verilog“连续赋值”(assign left_side = right_side;)中,右边信号的值被驱动到左边的连线上。赋值是“连续的”,左边的值会随着右边的值变化而变化。
模块上的端口也有方向(通常是输入或输出)。当从模块内部观察时,输入端口是驱动程序,而输出端口是接收器。
下面的图表说明了电路的各部分分别对应于Verilog代码。模块和端口声明创建电路的黑色部分。我们的任务是通过添加一个分配语句来连接in到out,从而创建一条连线(绿色)。盒子外面的部件我们不用考虑。
代码:
module top_module( input in, output out );
assign out = in;
endmodule
2、Four wires
创建一个具有3个输入和4个输出的模块,该模块的行为类似于导线,以实现下列连接:
a -> w b -> x b -> y c -> z
下图从模块外部看,有3个输入端口和4个输出端口。当有多个赋值语句时,它们在代码中出现的顺序并不重要。与编程语言不同,赋值语句(“连续赋值”)描述的是事物之间的连接,而不是将值从一个事物复制到另一个事物的操作。当存在多个assign语句时,assign出现的顺序不影响实现的功能,也就相当于连线的顺序不影响最终结果,这个要和软件的思维区别开
这里的绿色箭头表示导线之间的连接,但它们本身不是导线,仅类似于导线。这是因为输入和输出声明实际上声明了一条连接。写入输入线a和输入线a是一样的。因此,赋值语句不是在创建线,而是在已经存在的7根线之间创建连接。
代码:
module top_module(
input a,b,c,
output w,x,y,z );
assign w = a;
assign x = b;
assign y = b;
assign z = c;
endmodul
3、Inverter
创建一个实现非门的模块。使用赋值语句。赋值语句将不断地将in的逆驱动到wire out。
代码:
module top_module( input in, output out );
assign out = ~in;
endmodule
4、AND gate
创建一个实现与门的模块。这个电路现在有三条线(a、b和out)。连接a和b已经有由输入端口驱动的值。但目前还没有任何东西驱动断线。写一个赋值语句,用信号a和b的AND来驱动。
输入线是由模块外部的东西驱动的。赋值语句将在连线上驱动逻辑层。一个连接不能有多个驱动程序,一个没有驱动程序的连接会存在一个未定义的值(在硬件制备时通常被视为0)。
代码:
module top_module(
input a,
input b,
output out );
assign out = a && b;
endmodule
5、NOR gate
创建一个实现异或门的模块。
赋值语句用一个值驱动连接。只要是组合函数,这个值可以是任意复杂的函数。赋值语句是一个连续赋值语句,因为每当它的任何输入发生变化时,输出就会被“重新计算”,永远地,就像一个简单的逻辑门。
代码:
module top_module(
input a,
input b,
output out );
assign out = ~(a || b);
endmodule
6、XNOR gate
创建一个实现同或门的模块。
代码:
module top_module(
input a,
input b,
output out );
assign out = ~(a ^ b);
endmodule
7、Declaring wires
到目前为止,电路已经足够简单,输出只是输入的简单功能。随着电路变得越来越复杂,我们将需要电线来连接内部元件。当需要使用连线时,我们应该在模块体中声明它。将来我们将遇到更多同样声明方式的信号和变量类型,但现在,我们将从wire类型的信号开始。
举个例子
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"
在上面的模块中,有三个连接(In、out和not_in),其中两个已经声明为模块的输入和输出端口的一部分。连接的not_in需要在模块内部声明。它在模块外部不可见。然后,使用两个赋值语句创建两个NOT门。先创建哪一个非门并不重要。
实现以下电路。创建两条中间导线(可以任意命名)将AND和OR门连接在一起。请注意,为NOT gate提供的连线实际上是连接出去的,因此我们不必在这里声明第三条连线。根据图中的电路结构,应该以四个赋值语句结束,因为有四个信号需要赋值。(是的,没有中间线路也可以创建具有相同功能的电路。)
代码:
`default_nettype none
module top_module(
input a,
input b,
input c,
input d,
output out,
output out_n );
wire a_and_b;
wire c_and_d;
assign a_and_b = a & b;
assign c_and_d = c & d;
assign out = a_and_b | c_and_d;
assign out_n = ~out;
endmodule
8、7458 chip
7458是一个有四个与门和两个OR门的芯片。创建一个与7458芯片功能相同的模块。它有10个输入和2个输出。我们可以选择使用一个赋值语句来驱动每个输出导线,或者可以选择声明4根导线作为中间信号,其中每个内部导线由一个与门的输出驱动。为了练习,建议两种方法都试试。
代码:
module top_module (
input p1a, p1b, p1c, p1d, p1e, p1f,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
assign p1y = (p1a & p1b & p1c) | (p1d & p1e & p1f);
assign p2y = (p2a & p2b) | (p2c & p2d);
endmodule