【HDLBits刷题】Verilog Language——1.Basics
目录
一、题目与题解
1.Simple wire(简单导线)
2.Four wires(4线)
3.Inverter(逆变器(非门))
4.AND gate (与门)
5. NOR gate (或非门)
6. XNOR gate(异或非(同或)门)
7.Declaring wires(声明导线)
8.7458 chip( 7458芯片)
二、杂谈
1.新的数据类型:wire
2.串联运算符:{}
3.逻辑运算符
4.同或的表示方法
一、题目与题解
1.Simple wire(简单导线)
创建一个具有一个 input 和一个 output 的模块,其行为类似于一条线。
与物理电线不同,Verilog 中的电线(和其他信号)是定向的 。这意味着信息仅沿一个方向流动,从 (通常一个) 源流向接收器 (源通常也称为驱动器 ,将值驱动到线路上) 。在 Verilog 的 “continuous assignment” (
assign left_side = right_side;
) 中,右侧的信号值被驱动到左侧的导线上。赋值是 “continuous” 的,因为即使右侧的值发生变化,赋值也会一直继续。连续分配不是一次性事件。模块上的端口也有一个方向(通常是输入或输出)。输入端口由模块外部的东西驱动,而输出端口则驱动外部的东西。从模块内部查看时,输入端口是驱动器或源,而输出端口是接收器。
下图说明了电路的每个部分如何对应于Verilog代码的每个位。模块和端口声明创建电路的黑色部分。您的任务是通过添加要连接到 的语句来创建一条线路(绿色)。开箱即用的部件不是您关心的问题,但您应该知道,通过将测试线束的信号连接到顶部_模块的端口,可以测试您的电路。
module top_module( input in, output out );assign out = in;
endmodule
2.Four wires(4线)
创建一个具有 3 个输入和 4 个输出的模块,其行为类似于进行以下连接的电线:
a -> w b -> x b -> y c -> z下图说明了 circuit 的每个部分如何对应于 Verilog 代码的每个位。从模块外部,有三个输入端口和四个输出端口。
当您有多个 assign 语句时,它们在代码中出现的顺序无关紧要。与编程语言不同, assign 语句(“连续赋值”)描述事物之间的连接 ,而不是将值从一个事物复制到另一个事物的操作 。
现在也许应该澄清一个潜在的混淆来源:这里的绿色箭头代表电线之间的连接,但本身不是电线。该模块本身已经声明了 7 条电线(名为 a、b、c、w、x、y 和 z)。这是因为
input
和output
声明实际上声明了一个连线,除非另有指定。写入输入线 a
与写入 a
相同。因此,assign
语句不是在创建电线,而是在已经存在的 7 条电线之间创建连接。
module top_module( input a,b,c,output w,x,y,z );assign w = a;assign x = b,y = b;assign z = c;//如果我们确定每个信号的宽度,使用//串联运算符等效且更短://assign {w,x,y,z}={a,b,b,c};
endmodule
3.Inverter(逆变器(非门))
创建一个实现 NOT 门的模块。该电路类似于线,但略有不同。当从电线连接到电线时,我们将实现逆变器(或者"非门")而不是普通电线。使用assign语句。assign语句将持续将in的非转换为out。
module top_module( input in, output out );assign out = ~in;
endmodule
4.AND gate (与门)
创建实现 AND 门的模块。
该电路现在有三条导线(a、b和out)。导线a和b已经具有由输入端口驱动的值。但wire out目前并不是由任何因素驱动的。写一个assign语句,用a和b的AND信号输出。
请注意,该电路与NOT门非常相似,只是多了一个输入。如果听起来不一样,那是因为我已经开始描述信号是被驱动的(已知值由附加到它的某个东西决定)还是不是被某个东西驱动的。输入线由模块外部的东西驱动。assign语句将把一个逻辑电平驱动到一条线上。正如您所料,一条导线不能有多个驱动器(如果有,其逻辑级别是多少?),没有驱动程序的导线将有一个未定义的值(在合成硬件时通常被视为0)。
module top_module( input a, input b, output out );assign out = a & b;
endmodule
5. NOR gate (或非门)
创建一个实现或非门的模块。或非门是输出反转的或门。在Verilog中编写NOR函数时需要两个运算符。
assign语句用一个值驱动一条线(或者更正式地称为“网”)。该值可以是任意复杂的函数,只要它是组合函数(即无内存、无隐藏状态)。assign语句是一种连续赋值,因为每当其任何输入发生变化时,都会“重新计算”输出,就像一个简单的逻辑门一样
module top_module( input a, input b, output out );assign out = ~(a | b);
endmodule
6. XNOR gate(异或非(同或)门)
创建一个实现 XNOR 门的模块。
module top_module( input a, input b, output out );//assign out = a ~^ b;a和b相同输出0,不同输出1//assign out = a ^~ b;assign out = ~(a ^ b);
endmodule
7.Declaring wires(声明导线)
到目前为止,电路已经足够简单,以至于 output 是 inputs 的简单函数。随着电路变得越来越复杂,您将需要电线将内部组件连接在一起。当你需要使用 wire 时,你应该在 module 的主体中声明它,在它第一次使用之前的某个地方。(将来,您将遇到更多类型的信号和变量,它们也以相同的方式声明,但现在,我们将从 type 为 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 ),其中两根已经声明为模块的输入和输出端口的一部分(这就是为什么你在前面的练习中不需要声明任何电线的原因)。需要在 module 内部声明 wire not_in 。从模块外部不可见。然后,使用两个 assign 语句创建两个 NOT 门。请注意,您首先创建哪个 NOT 门并不重要:您最终仍然会得到相同的电路。
实现以下电路。创建两条中间线(命名您想要的任何名称)以将 AND 和 OR 门连接在一起。请注意,馈送 NOT 门的 wire 实际上是 wire out ,因此您不一定需要在此处声明第三根 wire 。请注意 wires 是如何由一个 source (gate 的 output) 驱动的,但可以馈送多个 inputs。
如果您遵循图中的电路结构,则最终应该有四个 assign 语句,因为有四个信号需要赋值。
module top_module (input a,input b,input c,input d,output out,output out_n );wire w1, w2; // Declare two wires (named w1 and w2)assign w1 = a&b; // First AND gateassign w2 = c&d; // Second AND gateassign out = w1|w2; // OR gate: Feeds both 'out' and the NOT gateassign out_n = ~out; // NOT gateendmodule
8.7458 chip( 7458芯片)
7458 是一款具有 4 个 AND 门和 2 个 OR 门的芯片。此问题比 7420 稍微复杂一些。
创建与 7458 芯片具有相同功能的模块。它有 10 个输入和 2 个输出。您可以选择使用
assign
语句来驱动每根输出线,也可以选择声明 (four) 线用作中间信号,其中每根内部线都由其中一个 AND 门的输出驱动。如需额外练习,请尝试两种方式。
module top_module ( input p1a, p1b, p1c, p1d, p1e, p1f,output p1y,input p2a, p2b, p2c, p2d,output p2y );//第一种方法assign p2y = (p2a & p2b) | (p2c & p2d);assign p1y = (p1a & p1c & p1b) | (p1f & p1e & p1d);//第二种方法wire a,b,c,d;assign a = p2a & p2b;assign b = p2c & p2d;assign p2y = a | b;assign c = p1a & p1c & p1b;assign d = p1f & p1e & p1d;assign p1y = c | d;
endmodule
二、杂谈
1.新的数据类型:wire
2.串联运算符:{}
assign {w, x, y, z} = {a, b, b, c};
可实现一对一的赋值
3.逻辑运算符
&与
|或
~非
^异或
4.同或的表示方法
~ (a ^ b) == (a ^~ b) == (a ~^ b)