【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)

相关推荐
hahaha60167 小时前
常见相机的ISP算法
数码相机·fpga开发
GateWorld8 小时前
《深入解析SPI协议及其FPGA高效实现》-- 第一篇:SPI协议基础与工作机制
fpga开发·开源协议
牵星术小白11 小时前
【ARM】【FPGA】【硬件开发】Chapter.1 AXI4总线协议
fpga开发
千码君201613 小时前
电子电路:怎么理解时钟脉冲上升沿这句话?
fpga开发·示波器·晶振·时钟脉冲·上升沿-电压跳变·cmos晶体管导通特性·前级信号
余大大.14 小时前
AMBA总线家族成员
fpga开发
9527华安18 小时前
FPGA纯verilog实现MIPI-DSI视频编码输出,提供工程源码和技术支持
fpga开发·音视频·mipi·dsi
156082072191 天前
飞腾D2000与FPGA结合的主板
fpga开发
baowxz1 天前
FPGA管脚类型,及选择
fpga开发
辣个蓝人QEX2 天前
【ZYNQ Linux开发】使用 boot.scr 启动 Linux 报错 Bad Linux ARM64 Image magic! 调试过程记录
linux·运维·fpga开发·zynq·petalinux·zynq mpsoc
一条九漏鱼2 天前
uart verilog 三段式状态机
fpga开发