【HDLBits 刷题 1】Verilog Language(1)Basics 部分

目录 

写在前面

Basics

Simple wire

 Four wires

 Inverter

 AND gate

 NOR gate

 Declaring wires

 7485 chip


写在前面

HDLBits 作为 Verilog 的刷题网站,非常适合初学者拿来练习,不仅可以学到基础的语法,还可以让自己写出的代码更直观,直接映射到电路中,因此在这段时间每周会抽出一点时间来把这个网站的题目刷一遍,用博客的方式记录自己的刷题经历。

由于前面几节题目比较基础,所以只展示结果代码和仿真波形,每道题复制题目浏览器翻译部分,有些翻译的比较蹩脚,具体的细节就不再赘述。

Basics

Simple wire

创建一个具有一个输入和一个输出的模块,其行为类似于导线。

与物理导线不同,Verilog中的导线(和其他信号)是定向的。这意味着信息只在一个方向上流动,从(通常是一个)接收器(源通常也称为将值驱动到导线上的驱动程序)。在Verilog“连续分配”()中,右侧信号的值被驱动到左侧的导线上。赋值是“连续的”,因为即使右侧的值发生变化,赋值也会一直持续。连续分配不是一次性事件。

模块上的端口也有一个方向(通常是输入或输出)。输入端口由模块外部的物体驱动,而输出端口驱动外部的东西。从模块内部查看时,输入端口是驱动程序或源,而输出端口是接收器。

module top_module( 
	input in, 
	output out 
);
	assign out = in;
	
endmodule

仿真波形

1fcefcd43cc54c83a32f5e00f0145a82.png

 Four wires

现在也许应该澄清的一个潜在的混淆来源:这里的绿色箭头表示电线之间的连接,但本身不是电线。模块本身已经声明了 7 根导线(命名为 a、b、c、w、x、y 和 z)。这是因为,除非另有说明,否则声明实际上声明了一根电线。书写与 相同。因此,这些语句不是在创建导线,而是在已存在的7根导线之间创建连接。

module top_module (
	input a,
	input b,
	input c,
	output w,
	output x,
	output y,
	output z  
);
	
	assign w = a;
	assign x = b;
	assign y = b;
	assign z = c;
	
endmodule

仿真波形

736ebf7ee34e4aa7be38bfaafb5af9c8.png

 Inverter

创建一个实现 NOT 门的模块。

此电路类似于线,但略有不同。当从导线到导线进行连接时,我们将实现逆变器(或“NOT-gate”)而不是普通导线。

使用赋值语句。该语句将连续赋值到导线上的反函数。

module top_module(
	input in,
	output out
);
	
	assign out = ~in;
	
endmodule

仿真波形

a43c24ebf9e7486eabce60be3b75786b.png

 AND gate

请注意,此电路与非门,只需再输入一个。如果听起来不同,那是因为我已经开始将信号描述为被驱动(具有由附加物确定的已知值)或不是由某些东西驱动的。 由模块外部的某些东西驱动。 语句将逻辑电平驱动到导线上。正如您所料,一根线路不能有多个驱动程序(如果有,它的逻辑级别是多少?),而没有驱动程序的线路将具有未定义的值(在合成硬件时通常被视为 0)。

module top_module( 
    input a, 
    input b, 
    output out );
assign out = a && b;

endmodule

仿真波形

7ca79c947d434a8a8195b31b6c88616c.png

 NOR gate

创建实现 NOR 门的模块。NOR栅极是输出反相的OR栅极。在 Verilog 中编写 NOR 函数时需要两个运算符。

语句驱动具有值的导线(或“net”,因为它更正式地称为)。此值可以是您想要的函数,只要它是组合(即无内存,没有隐藏状态)函数即可。语句是连续赋值,因为每当输出的任何输入发生变化时,输出就会被“重新计算”,就像一个简单的逻辑门一样。

module top_module( 
    input a, 
    input b, 
    output out );
assign out = ((a==1'b0) && (b==1'b0))?1'b1:1'b0;

endmodule

仿真波形

9f2316ed86ce44a686d743dc0e11fb6a.png

 XNOR gate

module top_module( 
    input a, 
    input b, 
    output out );
assign out = ((a==b))?1'b1:1'b0;

endmodule

仿真波形

397874d099374b3d8e7a01b6dce63c82.png

 Declaring wires

创建两根中间导线(命名为您想要的任何名称)以将 AND 和 OR 门连接在一起。请注意,馈送 NOT 栅极的导线实际上是导线,因此您不一定需要在此处声明第三根导线。请注意,导线如何由一个源(门的输出)驱动,但可以为多个输入供电。

module top_module(
    input a,
    input b,
    input c,
    input d,
    output out,
    output out_n   ); 
	wire    ab;
	wire    cd;
	wire    ef;

assign ab = a && b;
assign cd = c && d;
assign ef = ab || cd;
assign out = ef;
assign out_n = !ef;

endmodule

仿真波形

928e83a7d7aa4d00a6a33c415b0f66c1.png

 7485 chip

7458 是一款具有四个 AND 门和两个 OR 门的芯片。

创建具有与 7458 芯片相同功能的模块。它有 10 个输入和 2 个输出。您可以选择使用语句来驱动每根输出导线,也可以选择声明(四根)导线用作中间信号,其中每根内部导线由其中一个AND门的输出驱动。

module top_module ( 
    input p1a, p1b, p1c, p1d, p1e, p1f,
    output p1y,
    input p2a, p2b, p2c, p2d,
    output p2y );
  
  wire     wire1;
  wire     wire2;
  wire     wire3;
  wire     wire4;
  wire     wire5;
  wire     wire6;

assign wire1 = p2a && p2b;
assign wire2 = p2c && p2d;
assign wire3 = wire1 || wire2;
assign wire4 = p1a && p1c && p1b;
assign wire5 = p1f && p1e && p1d;
assign wire6 = wire4 || wire5;
assign p2y = wire3;
assign p1y = wire6;

endmodule

仿真波形

5a2cb30e20574393801c6313c1a716ca.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linest-5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值