[SugerTangYL] Verilog 语言入门(零基础视角)

目录

前言

一、示例

1.一位全加器功能及电路图

2.一位全加器Verilog代码

(1)模块定义声明

 (2)变量声明定义

(3)子模块调用

二、模块声明定义模板

总结


前言

hi guys,这是我第一篇博客23333,本人准备走数字IC设计,在对岗位了解了之后便萌生了写博客来记录自己的学习成果,同时给对该行业以及本专业的学弟学妹摸摸路子(可能有作业思路提供)


一、示例

        在进入Verilog语言语法之前,先抛出一个示例看看。对数字电路来说,大家接触最多的应该是一位全加器叭,下面就以一位全加器的RTL代码以及电路来理解Verilog语言的特点。

1.一位全加器功能及电路图

        一位全加器是用来计算低位进位的二进制加法器,其实现的逻辑表达式如下:

                         S=A\oplus B\oplus Ci                            Co=(A\cdot B)+(Ci\cdot (A\oplus B))​​​​​​

        至于真值表咱就不列啦,一位全加器的原理在此不讲述,将逻辑表达式变成实际电路,需要两个异或门和三个与非门总共五个模块,电路图如下(使用Quartus II 15.0画的):

        这个电路很熟悉了叭!数电学的就这个电路,有A、B、Ci三个输入和S、Co两个输出,那我们就是用Verilog语言来描述这个电路,让电脑转化你写的RTL代码成这个电路图。那下面便是上述电路对应的Verilog代码,代码与电路之间等效。

2.一位全加器Verilog代码

module example(A,B,Ci,Co,S);

input wire	A;
input wire	B;
input wire	Ci;
output wire	Co;
output wire	S;

wire OUT_nand1,OUT_nand2,OUT_xor1;

xor xor1(OUT_xor1,A,B);
xor xor2(S,OUT_xor1,Ci);
nand nand1(OUT_nand1,A,B);
nand nand2(OUT_nand2,OUT_xor1,Ci);
nand nand3(Co,OUT_nand1,OUT_nand2);

endmodule 

         上面就是一位全加器的Verilog代码啦,会不会看不懂(dog),接下来我将介绍各部分的对应含义。

(1)模块定义声明

module fulladder_1bit(A,B,Ci,Co,S);

......

endmodule  

         这段代码的头和尾便是对模块的定义声明,他有以下特点:

  • 以关键词(module)开始,关键词(endmodule)结束,中间便是模块的内容。
  •  fulladder_1bit为这个模块的名称。
  • 名称后面的(A,B,Ci,Co,S)为模块的输入输出列表,表示此模块有哪些输入输出“变量”。
  • 在module声明这一行末尾有“ ;” 结束!!!

 (2)变量声明定义

input wire    A;
input wire    B;
input wire    Ci;
output wire    Co;
output wire    S;

wire OUT_nand1,OUT_nand2,OUT_xor1;

         input是输入变量声明的关键字,output是输出变量声明的关键字。wire是变量类型,表示线网类型。因此“input wire A;”表示声明一个输入变量A,其属性为线网类型,线宽是一位(未定义位宽则默认一位)。变量类型放在之后详细介绍。

        对于最底下那行,最前面没有出现input和output,便表示这些变量为内部变量。

(3)子模块调用

xor xor1(OUT_xor1,A,B);
xor xor2(S,OUT_xor1,Ci);
nand nand1(OUT_nand1,A,B);
nand nand2(OUT_nand2,OUT_xor1,Ci);
nand nand3(Co,OUT_nand1,OUT_nand2);

        从电路图看的出来,一个一位全加器模块由两个异或门和三个与非门组成。于是我们只需要在一位全加器这个模块内部,调用两个异或门和三个与非门模块。

  • xor是异或门的关键字,nand是与非门的关键词。
  • xor1、xor2、nand1、nand2、nand3分别是这五个模块的名字(实例化),这个名字可以忽略不写,软件将自动帮你补上名字。
  • 与前面相同,括号内为模块的输入输出列表。

 至此这个一位全加器的所有部件齐全,编译后用RTL Viewer观察生成的RTL电路,如下:

         上例便是Verilog建模中的“门级建模”。这时候你可能会说“啊啊啊啊要是更复杂的功能难道都要用最基本的门去搭嘛那不得麻烦死啊啊啊”。当然,在实现更复杂的逻辑时,门级建模的难度会急剧上升,因此我们还有数据流建模(组合逻辑电路)和行为级建模(时序逻辑电路),甚至任务和函数,来帮助我们更高效、更具逻辑性的编写Verilog代码。具体的语言语法在此不介绍。

二、模块声明定义模板

综上,对模块的定义模板如下:

module <模块名>(<输入输出列表>);

input <变量类型> <变量位宽> <变量名>;
output <变量类型> <变量位宽> <变量名>;
<变量类型> <变量位宽> <变量名>;//内部变量声明

<子模块名> <实例化名称> (<子模块输入输出列表>)

assign ……//数据流描述

always ……//行为级描述

function ……//函数

task ……//任务

endmodule

        其中除了最开始的模块声明以及输入输出变量的声明是必须之外,其他都是可选择性的编写。有一张对模块组成很好诠释的框图。 


总结

        上面就是Verilog零基础入门的示例,我们能看出Verilog的基本设计单元为模块,模块与模块之间的区别便是内部所含电路的不同,对内部电路的描述方法也有好几种。因此,我们只需要把每个部分的语法规则学好,就可以写出功能完整的Verilog代码啦。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值