【HDLBits刷题】Verilog Language——1.Basics

目录

一、题目与题解

[1.Simple wire(简单导线)](#1.Simple wire(简单导线))

[2.Four wires(4线)](#2.Four wires(4线))

3.Inverter(逆变器(非门))

[4.AND gate (与门)](#4.AND gate (与门))

[5. NOR gate (或非门)](#5. NOR gate (或非门))

[6. XNOR gate(异或非(同或)门)](#6. XNOR gate(异或非(同或)门))

[7.Declaring wires(声明导线)](#7.Declaring wires(声明导线))

[8.7458 chip( 7458芯片)](#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)。这是因为 inputoutput 声明实际上声明了一个连线,除非另有指定。写入输入线 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 gate
	assign w2 = c&d;	// Second AND gate
	assign out = w1|w2;	// OR gate: Feeds both 'out' and the NOT gate
 
	assign out_n = ~out;	// NOT gate
	
endmodule

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)

相关推荐
博览鸿蒙12 小时前
FPGA设计如何快速入门?(内附学习视频)
fpga开发
发光的沙子13 小时前
FPGA----基于ZYNQ 7020实现petalinux并运行一个程序
fpga开发
kanhao10013 小时前
【FPGA开发】什么是Streaming流式传输?流式传输的最主要的设计思想是什么?
fpga开发
知行合一←_←14 小时前
01硬件原理图
fpga开发
霖0015 小时前
FPGA实战项目1——坦克大战
人工智能·经验分享·嵌入式硬件·学习·fpga开发·fpga
霖002 天前
FPGA中级项目7———TFT显示与驱动
经验分享·fpga开发·学习方法·显示器·ip·集成学习
雪天鱼3 天前
DSP48E2 的 MAC模式功能仿真
fpga开发·fpga·dsp48e2
FPGA_Linuxer3 天前
FPGA DDR4多通道管理控制器设计
fpga开发
hahaha60165 天前
zynq7035的arm一秒钟最多可以支持触发多少次中断
fpga开发