1、Verilog Language-Basics

Wire - HDLBits链接

下列提供的代码答案不唯一!


目录

1、Simple wire

2、Four wires

3、Inverter

4、AND gate

5、NOR gate

6、XNOR gate

7、Declaring wires

8、7458 chip


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值