自定义目录标题)
基本
wire
物理线不同,Verilog 中的线(和其他信号)是有方向的。这意味着信息仅在一个方向上流动,从(通常是一个)源到接收器(源通常也称为驱动器,将值驱动到线路上)。在 Verilog “连续赋值” ( assign left_side = right_side;
) 中,右侧的信号值被驱动到左侧的导线上。赋值是“连续的”,因为即使右侧的值发生变化,赋值也会一直持续。连续分配不是一次性事件。
模块上的端口也有方向(通常是输入或输出)。输入端口由模块外部的某些东西驱动,而输出端口由外部的某些东西驱动。从模块内部看,输入端口是驱动器或源,而输出端口是接收器。
下图说明了电路的每个部分如何对应 Verilog 代码的每一位。模块和端口声明创建电路的黑色部分。你的任务是通过添加一个连接到的assign
语句来创建一个连线(绿色)。
下图说明了电路的每个部分如何对应 Verilog 代码的每一位。从模块外部看,有三个输入端口和四个输出端口。
当您有多个分配
语句时,它们在代码中出现的顺序****无关紧要。与编程语言不同,赋值
语句(“连续赋值”)描述事物之间的联系,而不是将值从一个事物复制到另一个 事物的动作。
现在也许应该澄清一个潜在的混淆来源:这里的绿色箭头代表电线之间的连接,但它们本身并不是电线。模块本身已经声明了 7 根线(命名为 a、b、c、w、x、y 和 z)。这是因为除非input
另有output
说明,否则声明实际上声明了一条线。写法input wire a
同理input a
。因此,这些assign
语句不是在创建连线,而是在创建已经存在的 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;
endmodule
Not gate 非门
创建一个实现非门的模块。
这个电路类似于电线,但略有不同。当从电线连接到电线in
时,out
我们将使用逆变器(或“非门”)而不是普通电线。
使用分配语句。该assign
语句将in连续驱动到
out`。
module top_module( input in, output out );
assign out=~in;
endmodule
And gate 与门
创建一个实现与门的模块。
该电路现在有三根导线(a
、b
和out
)。电线a
和b
已经有输入端口驱动到它们的值。但是电线out
目前不是由任何东西驱动的。编写一个用信号和的 ANDassign
驱动的语句。 out``a``b
请注意,此电路与非门非常相似,只需再输入一个。如果听起来不同,那是因为我已经开始将信号描述为被驱动(具有由附加的东西决定的已知值)或不被某物驱动。Input wires
由模块外部的东西驱动。assign
语句会将逻辑电平驱动到线路上。如您所料,一条线不能有多个驱动程序(如果有,它的逻辑电平是多少?),没有驱动程序的线将有一个未定义的值(在综合硬件时通常被视为 0)。
Nor gate 或非门
创建一个实现 NOR 门的模块。或非门是一个输出反相的或门。用 Verilog 编写的 NOR 函数需要两个运算符。
assign
语句驱动带有值的线(或“网”,因为它更正式地称为)。这个值可以是任意复杂的函数,只要它是一个组合(即,无记忆,没有隐藏状态)函数。一个assign
语句是一个连续赋值,因为只要它的任何输入永远改变,输出就会被“重新计算”,就像一个简单的逻辑门一样。
module top_module(
input a,
input b,
output out );
assign out=~(a|b);
endmodule
Xnor gate 异或门
按位异或运算符是^
. 没有逻辑异或运算符。
module top_module(
input a,
input b,
output out );
assign out=~(a^b);
endmodule
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"
`default_nettype none
module top_module(
input a,
input b,
input c,
input d,
output out,
output out_n );
wire and1;
wire and2;
assign and1=a&b;
assign and2=c&d;
assign out=and1|and2;
assign out_n=~out;
endmodule
7458 chip
创建一个与 7458 芯片功能相同的模块。它有 10 个输入和 2 个输出。您可以选择使用assign
语句来驱动每条输出线,或者您可以选择声明(四)条线用作中间信号,其中每条内部线由一个与门的输出驱动。如需额外练习,请尝试两种方式。
module top_module (
input p1a, p1b, p1c, p1d, p1e, p1f,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
wire left;
assign left=p2a&p2b|p2c&p2d;
assign p2y=left;
wire right;
assign right=p1a&p1b&p1c|p1e&p1f&p1d;
assign p1y=right;
endmodule