【HDLbits刷题笔记 】01-verilog语法-基础部分

simple wire

创建一个具有一个输入和一个输出的模块,其行为类似于电线。

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

assign left_side = right_side;

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

下图说明了电路的每个部分如何对应于Verilog代码的每个位。模块和端口声明创建线路的黑色部分。您的任务是通过添加要连接到的语句来创建电线(绿色)。开箱即用的部件不是您的问题,但您应该知道,通过将来自我们的测试线束的信号连接到 .assigninouttop_module

除了连续赋值之外,Verilog 还有另外三种赋值类型用于过程块,其中两种是可合成的。在我们开始使用程序块之前,我们不会使用它们。

Four wires

创建一个具有 3 个输入和 4 个输出的模块,其行为类似于建立这些连接的电线:

a -> w

b -> x

b -> y

c -> z

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

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

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

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(Inverter)

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

该电路类似于线,但略有不同。当从导线连接到导线时,我们将实现逆变器(或“非门”)而不是普通导线。inout

使用赋值语句。该语句将连续驱动导线上的反转。assigninout

NOT gate(非门),逻辑取反符号!,按位取反符号~

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

And gate

创建实现 AND 门的模块。

此电路现在有三根导线。并且已经有由输入端口驱动的值。但电线目前不是由任何东西驱动的。编写一个使用信号和 的 AND 驱动的语句。

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

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

Nor gate

创建实现 NOR 门的模块。NOR 门是输出反相的 OR 门。NOR 函数在 Verilog 中编写时需要两个运算符。

语句驱动具有值的导线(或更正式地称为“net”)。此值可以是您想要的复杂函数,只要它是组合(即无内存,无隐藏状态)函数即可。语句是一个连续赋值,因为每当它的任何输入发生变化时,输出就会被“重新计算”,永远,就像一个简单的逻辑门一样。

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

Xnor gate

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

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

Declaring wire

声明电线

到目前为止,电路非常简单,输出是输入的简单功能。随着电路变得越来越复杂,您将需要电线将内部组件连接在一起。当您需要使用电线时,您应该在模块的主体中声明它,在首次使用之前的某个地方。(将来,您会遇到更多类型的信号和变量,它们也以相同的方式声明,但现在,我们将从 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"

在上面的模块中,有三根电线(输入、输出和not_in),其中两条已经声明为模块输入和输出端口的一部分(这就是为什么在前面的练习中不需要声明任何线路的原因)。电线not_in需要在模块内声明。从模块外部看不到它。然后,使用两个赋值语句创建两个 NOT 门。请注意,您首先创建哪个 NOT 门并不重要:您最终仍然会得到相同的电路。

实践

实现以下电路。创建两条中间导线(命名为您想要的任何名称)以将 AND 和 OR 门连接在一起。请注意,馈入 NOT 门的导线实际上是导线输出,因此您不一定需要在此处声明第三根导线。请注意,导线如何仅由一个源(门的输出)驱动,但可以馈送多个输入。

如果您遵循图中的电路结构,则最终应该得到四个assign语句,因为有四个信号需要assign值。

(是的,可以在没有中间线的情况下创建具有相同功能的电路。

`default_nettype none
module top_module(
    input a,
    input b,
    input c,
    input d,
    output out,
    output out_n   ); 
wire a_and_b,c_and_d,ad;
    assign a_and_b=a&b;
    assign c_and_d=c&d;
    assign ad=a_and_b|c_and_d;
    assign out=ad;
    assign out_n=~ad;
endmodule

7458 chip

7458 是一款具有四个 AND 门和两个 OR 门的芯片。这个问题比7420.

创建与 7458 芯片具有相同功能的模块。它有 10 个输入和 2 个输出。您可以选择使用语句来驱动每根输出导线,也可以选择声明 (四) 根导线用作中间信号,其中每根内部导线由其中一个 AND 门的输出驱动。对于额外的练习,请尝试两种方式。assign

module top_module ( 
    input p1a, p1b, p1c, p1d, p1e, p1f,
    output p1y,
    input p2a, p2b, p2c, p2d,
    output p2y );
    assign  p1y=(p1a&p1b&p1c)|(p1e&p1f&p1d);
    assign  p2y=(p2a&p2b)|(p2c&p2d);
endmodule

总结

assign用于连续赋值

NOT gate(非门)

逻辑取反符号!

按位取反符号~

AND gate(与门)

逻辑与符号&&

按位与符号&

OR gate(或门)

逻辑或符号||

按位或符号|

XNOR gate(同或门)

逻辑同或符号^~

XOR gate(异或门)

逻辑同或符号^

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

绿茶冰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值