Verilog基础(一):基础元素
verilog基础
我先说,看了肯定会忘,但是重要的是这个过程,我们知道了概念,知道了以后在哪里查询。语法都是术,通用的概念是术。所以如果你有相关的软件编程经验,那么其实开启这个学习之旅,你会感受到熟悉,也会感受到别致。
入门
- 如何开始
欢迎来到二进制的世界,数字逻辑的入门一开始可能有难度,因为你需要学习新的概念,新的硬件描述语言(HDL – Hardware Description Language)例如 verilog
,几个新的仿真软件和一块FPGA的板子.但是这能帮你更加深刻的理解计算机的运作原理.
设计电路需要如下几个步骤:
- 编写HDL(verilog)代码
- 编译代码生成电路
- 模拟电路并修复错误
下面,我们来个简单的例子,请把one
的输出设为1:
- Module Declaration
module top_module(output one);
- Solution
module top_module( output one );
assign one = 1;
endmodule
- 输出0
建立一个没有输入,输出为常数0的电路.
本系列题使用verilog-2001 ANSI-style 的端口声明语法,因为它更容易阅读并减少了拼写错误.如果愿意,可以使用旧的verilog-1995语法.例如,下面的两个模块声明是可接受的和等效的:
module top_moduel(zero);
output zero;
//verilog-1995
endmodule
module top_module(output zero);
//verilog-2001
endmodule
- Module Declaration
module top_module(
output zero
);
- Solution
module top_module(
output zero
);// Module body starts after semicolon
assign zero=0;
endmodule
Verilog 语言
基础元素
- wire类型
创建一个具有一个输入和一个输出的模块,其行为想一条"线"(Wire)。
与物理线不同但十分相似,Verilog中的线(和其他信号)是定向的。
这意味着信息只在一个方向上流动,从(通常是一个)源流向汇点(该源通常也被称为驱动程序,将值驱动到wire上)。
在verilog"连续赋值"(assign left_side=right_side;)中,右侧的信号值被驱动到左侧的"线"上。
请注意:赋值是"连续的"(Continuous Assignments),因为如果右侧的值发生更改,分配也会一直持续,因此左侧的值将随之改变。(这里与其他语言有很大区别)。 连续分配不是一次性事件,其产生的变化是永久的。
想要真正理解为啥会这样,你首先要明白,你并不是在编写程序,你其实是在用代码"画"电路!
因此输入端的电平高低的变化必然会影响到wire的另一端,你可以想像真的有一根电线连接两个变量。
模块(module)上的端口(port)也有一个方向(通常是输入 – input或输出 – output)。
输入端口由来自模块外部的东西驱动,而输出端口驱动外部的东西。从模块内部查看时,输入端口是驱动程序或源,而输出端口是接收器。
下图说明了电路的每个部分如何对应Verilog代码的每个部分。
- 模块和端口声明创建电路的黑色部分。
- 您的任务是通过添加一个assign语句来创建一条线(绿色)。
- 盒子外的部件不是您的问题,但您应该知道,通过将测试激励连接到top_module上的端口来测试电路。
除了连续赋值之外,Verilog还有另外三种用于程序块(Procedural block)的赋值类型,其中两种是可综合的。在开始使用Procedural block之前,我们不会使用它们.
- Module Declaraction
module top_module( input in, output out );
- Solution
module top_module( input in, output out );
assign out = in;
endmodule
这里的 Module Declaraction 和 Solution就像是对应C里面的声明和定义实现
- Four wires
创建一个具有3个输入和4个输出的模块,这些输入和输出的行为如下:
A ->W
B -> X
B -> Y
C -> Z
下图说明了电路的每个部分如何对应Verilog代码的每个部分.模块外部有三个输入端口和四个输出端口.
当您有多个assign语句时,它们在代码中的出现顺序并不重要.与编程语言不同,assign语句(“连续赋值”)描述事物之间的连接,而不是将值从一个事物复制到另一个事物的操作.
可能现在应该澄清的一个潜在的困惑来源是:这里的绿色箭头表示电线之间的连接,但不是wire本身.
模块本身已经声明了7条线(名为A、B、C、W、X、Y和Z).这是因为input与output被声明为了wire类型.因此,assign语句不会创建wire,而是描述了在已存在的7条线之间创建的连接.
- Module Declaraction
module top_module(
input a,b,c;
output w,x,y,z
);
- Solution
module top_module(
input a,b,c,
output w,x,y,z );
assign w=a;
assign x=b;
assign y=b;
assign z=c;
endmodule
- 反转器 (Inveter)
创建实现非门的模块.
这个电路和电线相似,但有点不同.当把电线从进线连接到出线时,我们要实现一个反相器(非门),而不是一根