当前位置: 首页 > news >正文

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

相关文章:

  • 代码随想录算法训练营总结篇
  • Kubernetes弹性伸缩:让应用自动应对流量洪峰与低谷
  • 购物|电商购物小程序|基于微信小程序的购物系统设计与实现(源码+数据库+文档)
  • OpenKylin安装Elastic Search8
  • k8s node 内存碎片化如何优化?
  • 文件上传漏洞篇:upload-labs靶场搭建
  • Ubuntu 系统中解决 Firefox 中文显示乱码的完整指南
  • 代码随想录算法训练营第五十六天| 图论2—卡码网99. 岛屿数量(dfs bfs)
  • 养生融入生活,畅享健康人生
  • MySQL8查询某个JSON类型的字段中出现过的所有键名(json key name)并去重返回
  • conda虚拟环境相关操作
  • 第三章:langchain加载word文档构建RAG检索教程(基于FAISS库为例)
  • Spring Boot项目集成Aviator实现成本计算模块
  • 【阿里云大模型高级工程师ACP习题集】3 总结与展望
  • vscode远程服务器连接----过程尝试写入的管道不存在
  • 修改MySQL枚举类型添加‘location‘值
  • 【AI】Ubuntu 22.04 evalscope 模型评测 Qwen3-4B-FP8
  • Linux——https基础理论
  • 【AI论文】FormalMATH:大型语言模型形式化数学推理能力基准测试
  • C语言内存函数及大小端字节序!
  • 网民反映“潜水时遭遇服务质量不佳”,三亚开展核查调查
  • 同观·德国|默茨当总理后,能否带领德国在欧盟“说了算”?
  • 央行:5月8日起7天期逆回购操作利率由此前的1.50%调整为1.40%
  • 上海市政府党组会议传达学习习近平总书记重要讲话精神,部署抓好学习贯彻落实
  • 许昌市场监管部门对胖东来玉石开展日常检查:平均毛利率不超20%
  • 观察|“离境退税”撬动上海“五一”假期入境消费