Verilog HDLbits 刷题(1)Basics

自定义目录标题)

基本

wire

物理线不同,Verilog 中的线(和其他信号)是有方向的。这意味着信息仅在一个方向上流动,从(通常是一个)接收器(源通常也称为驱动器,将值驱动到线路上)。在 Verilog “连续赋值” ( assign left_side = right_side;) 中,右侧的信号值被驱动到左侧的导线上。赋值是“连续的”,因为即使右侧的值发生变化,赋值也会一直持续。连续分配不是一次性事件。

模块上的端口也有方向(通常是输入或输出)。输入端口模块外部的某些东西驱动,而输出端口由外部的某些东西驱动。从模块内部看,输入端口是驱动器或源,而输出端口是接收器。

下图说明了电路的每个部分如何对应 Verilog 代码的每一位。模块和端口声明创建电路的黑色部分。你的任务是通过添加一个连接到的assign语句来创建一个连线(绿色)。电线.png

下图说明了电路的每个部分如何对应 Verilog 代码的每一位。从模块外部看,有三个输入端口和四个输出端口。

当您有多个分配语句时,它们在代码中出现的顺序****无关紧要。与编程语言不同,赋值语句(“连续赋值”)描述事物之间的联系,而不是将值从一个事物复制到另一个 事物的动作。

现在也许应该澄清一个潜在的混淆来源:这里的绿色箭头代表电线之间的连接,但它们本身并不是电线。模块本身已经声明了 7 根线(命名为 a、b、c、w、x、y 和 z)。这是因为除非input另有output说明,否则声明实际上声明了一条线。写法input wire a同理input a。因此,这些assign语句不是在创建连线,而是在创建已经存在的 7 条连线之间的连接。

Wire4.png

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`。

Notgate.png

module top_module( input in, output out );
	assign out=~in;
endmodule

And gate 与门

创建一个实现与门的模块。

该电路现在有三根导线(about)。电线ab已经有输入端口驱动到它们的值。但是电线out目前不是由任何东西驱动的。编写一个用信号和的 ANDassign驱动的语句。 out``a``b

请注意,此电路与非门非常相似,只需再输入一个。如果听起来不同,那是因为我已经开始将信号描述为被驱动(具有由附加的东西决定的已知值)或被某物驱动。Input wires由模块外部的东西驱动。assign语句会将逻辑电平驱动到线路上。如您所料,一条线不能有多个驱动程序(如果有,它的逻辑电平是多少?),没有驱动程序的线将有一个未定义的值(在综合硬件时通常被视为 0)。

与门.png

Nor gate 或非门

创建一个实现 NOR 门的模块。或非门是一个输出反相的或门。用 Verilog 编写的 NOR 函数需要两个运算符。

assign语句驱动带有值的线(或“网”,因为它更正式地称为)。这个值可以是任意复杂的函数,只要它是一个组合(即,无记忆,没有隐藏状态)函数。一个assign语句是一个连续赋值,因为只要它的任何输入永远改变,输出就会被“重新计算”,就像一个简单的逻辑门一样。

诺盖特.png

module top_module( 
    input a, 
    input b, 
    output out );
	assign out=~(a|b);
endmodule

Xnor gate 异或门

按位异或运算符是^. 没有逻辑异或运算符。

Xnorgate.png

module top_module( 
    input a, 
    input b, 
    output out );
    assign out=~(a^b);
endmodule

Declaring wires

声明电线

到目前为止,电路已经足够简单,以至于输出是输入的简单函数。随着电路变得越来越复杂,您将需要电线将内部组件连接在一起。当你需要使用连线时,你应该在模块的主体中声明它,在它第一次使用之前的某个地方。(将来,您会遇到更多类型的信号和变量,它们也以相同的方式声明,但现在,我们将从wire类型的信号开始)。

Wiredecl1.png

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"

Wiredecl2.png

`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语句来驱动每条输出线,或者您可以选择声明(四)条线用作中间信号,其中每条内部线由一个与门的输出驱动。如需额外练习,请尝试两种方式。

7458.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在哪我是谁啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值