原创 什么是verilog HDL?

2008-9-21 12:39 3112 7 8 分类: FPGA/CPLD

 


       verilog是一种硬件描述语言,可以在算法级、门级到开关级的多种抽象设计层次上对数字系统建模。它可以描述设计的行为特性、数据流特性、结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。此外,verilog提供了编程语言接口,通过该接口用户可以在模拟、验证期间从外部访问设计,包括模拟的具体控制和运行。


       verilog不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用verilog仿真器进行验证。verilog从C语言中继承了多种操作符和结构,所以从结构上看两者有很多相似之处。


设计流程:功能设计-->用verilog描述电路-->软件模拟与仿真-->考察结果--->逻辑综合-->代码下载到硬件电路--->完成。


1. 基本机构


1.1 模块


       模块(module)是verilog最基本的概念,也是v设计中的基本单元。每个v设计的系统都是由若干模块组成的。


A:模块在语言形式上是以关键词module开始,以关键词endmodule结束的一段程序。


B:模块的实际意义是代表硬件电路上的逻辑实体。


C:每个模块都实现特定的功能。


D:模块的描述方式有行为建模和结构建模之分。


E:模块之间是并行运行的。


F:模块是分层的,高层模块通过调用、连接低层模块的实例来实现复杂的功能。


G:各模块连接完成整个系统需要一个顶层模块(Top-module)。


无论多么复杂的系统,总能划分成多个小的功能模块。因此系统的设计可以按照下面三个步骤进行:


(1)把系统划分成模块;


(2)规划各模块的接口;


(3)对模块编程并连接各模块完成系统设计。


模块的结构是这样的:


module <模块名>(<端口列表>);


<定义>


<模块条目>


endmodule


其中:


模块名是模块唯一的标识符;


端口列表是输入、输出和双向端口的列表,这些端口用来与其他模块进行连接。


定义 则是一段程序,用来指定数据对象为寄存器型、存储器型、线型以及过程块,诸如函数块和任务块;


模块条目 也是一段程序,将上面定义的东东和端口组合起来,是说明这个模块要做什么的语句;


标识模块结束的endmodule之后没有分号。


需要注释时,用//即可,这和c语言一样。


1.2 模块的调用


      在做模块划分时,通常会出现这种情形:某个大的模块中包含了一个或多个功能子模块。verilog是通过模块调用或称为模块实例化的方式来实现这些子模块与高层模块的连接的。下面是通过两个NAND门实现一个与门的代码:


module AND(in1, in2, out);


input in1, in2;


output out;


wire w1;                                   //一个模块内部连线


NAND NAND1(in1, in2, w1);      //调用(实例化)一个NAND子模块


NAND NAND2(w1, w1, out);      //调用(实例化)一个NAND子模块


endmodule                                 //AND模块结束


调用模块实例的一般形式为:


<模块名><参数列表><实例名>(<端口列表>);


其中参数列表是传递到子模块的参数值,参数传递的典型应用是定义门级时延。


1.3 测试模块


2. 程序设计基础


     Verilog其实是最容易学会的一种编程语言,因为它的结构和语法都比较简单而且和C语言相似。


2.1 参数声明


     程序中经常多次出现某些数字,如延迟时间或变量的宽度,有时可能要改变这些值,这种情况下经常要用到参数。参数一经声明,就视其为一个常量,在整个仿真过程中不再改变。


parameter LINELENGTH = 132, ALL_X_S = 16'bx;


parameter BIT = 1, BYTE = 8, PI = 3.14;


parameter STROBE_DELAY = (BYTE+BIT)/2;


使用参数可以提高程序的可读性,也利于修改。


2.2 预处理指令


和C相似,V也有预处理指令,不过它的预处理指令以反引号“`”开头。


(1)`define和`undef :前者相当于C中的#define,后者取消`define所做的定义。


(2)`ifdef、`else和`endif :这三个编译器指令通常一起出现,和普通的if-else结构类似,这些编译器指令用于条件编译。


(3)`include


这个`include要注意一下,它用于嵌入“内嵌文件”的内容,这里的内嵌文件通常也是verilog文件。如下所示,在文件adder.v中有如下内容:


`include "../../halfaddr.v"


module adder;


...........


endmodule


在编译时,adder.v中的`include这一行将由halfadder的内容代替。


(4)`timescale


在Verilog模型中,所有时延都用单位时间表示。`timescale编译器指令定义时延单位和时延精度,其格式为:


`timescale time_unit / time_precision


其中,time_unit和time_precision由值1、10和100以及单位s、ms、us、ns、ps和fs组成。前者定义了时延单位,后者定义了时延精度。


当设计中多个模块带有自身的`timescale编译指令时会发生什么呢?在这种情况下,模拟器总是定位在所有模块的最小时延精度上,并且所有时延都相应的换算成最小的时延精度。


小结一下:


这一章比较简单,其实verilog与C语言有许多相通之处,所以学习并掌握这种语言应该不是特别困难。


信心倍增!

文章评论1条评论)

登录后参与讨论

用户461316 2008-9-21 12:54

欢迎你到“可编程器件”论坛版块参见讨论! http://bbs.ednchina.com/ShowForum.aspx?id=22

crazy_embeddedsystem_775092187 2007-12-11 20:04

实际上,这些东西都是可以计算出来的。

crazy_embeddedsystem_775092187 2007-12-11 19:59

好啊,大家一起学习进步。

用户1434811 2007-12-11 19:48

写的好深刻

看了明白了许多

希望可以交个朋友,帮助我学习进步!

用户23434 2007-12-7 16:56

负载躁声不容易消除呀!
相关推荐阅读
用户6646 2010-06-09 16:44
Linux C中令人讨厌的段错误
作者:孙晓明,华清远见嵌入式学院讲师同学们在做练习的时候,编译完程序,执行的时候,有时会莫名的出现 “Segment fault”,即段错误,段错误是让许多C程序员都头疼的提示,因为对于这种模糊的提示...
用户6646 2010-06-09 13:06
VC6 显示行号 (无限制注册版)
make编译时出现错误, 会提示哪一行。可惜vc中不能显示行号,很是郁闷。这个插件可以显示行号,呵呵,很有用。VC显示行号插件说明-----------------------------------...
用户6646 2010-05-22 10:07
删除 nero search 的有效方法
不知道从什么时候开始,Nero多出来一个绑定的Nero Search,虽然可以不然它显示,可是他仍然会在后台占用资源。可以用以下方法解决:开始->运行,依次输入下列文字回车、确定即可(每次输一行...
用户6646 2010-04-03 08:46
2007年5月22日完成的全电控小电视(版本V2.0)
基础功能部分写了4000多行汇编,加上遥控红外部分达到了6000多行,大体介绍如下:1. 内置开关电源转换,11-37V供电;2. 全轻触操作,无机械可调器件,PWM调节亮度/色彩/背光;3.按钮有:...
用户6646 2010-03-17 09:41
三极管HFE与β的关系
hfe是三极管H参数,全称“共发射极低频小信号输出交流短路电流放大系数”,在等效四端网络中又叫“h21”。β是Ic与Ib函数关系的普遍表达式,尤其特指在晶体管基区中电流的分配关系。无论在教科书还是在应...
用户6646 2010-03-17 09:35
三极管饱和(2)
from:http://blog.ednchina.com/xcbao/10816/category.aspx本图片来自于<模拟集成电路的分析与设计>,用来表现三极管饱和时的carriers的分布。但...
我要评论
1
7
关闭 站长推荐上一条 /2 下一条