Verilog HDLbits 刷题(1)Basics
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
觉得有帮助,希望帮点赞、转发~
本文来自于【CSDN平台:郑退之】
#笔记##C/C++#
查看10道真题和解析