打印

Verilog HDL建模概述

[复制链接]
2385|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
星星之火红|  楼主 | 2012-11-8 00:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在数字电路设计中,数字电路可简单归纳为两种要素:线和器件。线是器件管脚之间的物理连线;器件也可简单归纳为组合逻辑器件(如与或非门等)和时序逻辑器件(如寄存器、锁存器、RAM等)。一个数字系统(硬件)就是多个器件通过一定的连线关系组合在一块的。因此,Verilog HDL的建模实际上就是如何使用HDL语言对数字电路的两种基本要素的特性及相互之间的
关系进行描述的过程。

       本章节首先会展示几个简单实例,使读者对使用Verilog HDL 建模有个大概的印象,然后详细介绍模块的结构和语法,让读者掌握建模的基本要素。最后介绍三种verilog语言建模的方法以及三种方法的混合使用,让读者具备用verilog简单建模的能力。

相关帖子

沙发
星星之火红|  楼主 | 2012-11-8 00:00 | 只看该作者
2.1 模块  
模块(module)是Verilog 的基本描述单位,用于描述某个设计单元的功能、结构以及与其他模块通信的外部端口。

        模块在概念上可等同一个器件就如我们调用通用器件(与门、三态门等)或通用宏单元(计数器、ALU、CPU)等,因此,一个模块可在另一个模块中调用。

        一个电路设计可由多个模块组合而成,因此一个模块的设计只是一个系统设计中的某个层次设计,模块设计可采用多种建模方式。

        本节分三部分来介绍模块的相关知识:

                         2.1.1 简单示例
                         2.1.2 模块的结构
                         2.1.3 模块语法

使用特权

评论回复
板凳
星星之火红|  楼主 | 2012-11-8 00:01 | 只看该作者
面先介绍几个简单的Verilog HDL module。
例[1] 加法器
module add (a, b, cin, count, sum);
input [2:0] a; //加数a
input [2:0] b; //加数b
input cin; //进位输入
output count; //进位输出
output [2:0] sum; //结果
assign {count,sum} = a +b + cin;
endmodule
该例描述一个3位加法器,从例子可看出一个模块是以module 开始,endmodule 结束。

例[2] 比较器
module compare (equal,a,b);
input [1:0] a,b; // declare the input signals ;
output equare ; // declare the output signal;
assign equare = (a == b) ? 1:0 ; / * if a = b , output 1, otherwise 0;*/
endmodule
该例描述一个比较器, 从上可看到,/* .... */ 和 // ... 表示注释部分。注释只是为了方便设计者读懂代码,对编译并不起作用。

注释可以用中文也可以用英文,但是推荐用英文,因为使用中文注释可能引起一些工具软件的错误。Verilog HDL的注释只有/* .... */ 和 // ...两种,其中,/* .... */可以跨行, // ... 不能跨行。

例[3]多路选择器
module multi2(selete,a,b,c);
input a,b; // declare the input signals;
input selete; // declare the input signal;
output c; // declare the output signal;
assign c = (selete == 1) ? a:b ; / * if selete = 1 , c = a, otherwise c = b*/
endmodule
module multi4(selete_4to1,dat_in_0,dat_in_1,dat_in_2,dat_in_3,dat_out);
input dat_in_0,dat_in_1,dat_in_2,dat_in_3; // declare the input signals;
input [1:0] selete_4to1; // declare the input signal;
output dat_out; // declare the output signal;
wire dat_out_0; // declare the Internal signal;
wire dat_out_1; // declare the Internal signal;

multi2 U_multi2_0(selete_4to1[0],dat_in_0,dat_in_1,dat_out_0);
multi2 U_multi2_1(selete_4to1[0],dat_in_2,dat_in_3,dat_out_1);
multi2 U_multi2_3(selete_4to1[1],dat_out_0,dat_out_1,dat_out);

endmodule

该实例首先描述了一个2选1多路选择器,然后通过三次例化实现了一个4选1多路选择器。模块multi2对multi4而言相当于一个已存在的器件,在multi4模块中对该器件进行实例化,实例化名分别为 U_multi2_0、 U_multi2_1、 U_multi2_2。

使用特权

评论回复
地板
星星之火红|  楼主 | 2012-11-8 00:01 | 只看该作者
通过上面的实例可看出,一个设计是由一个个模块(module)构成的。一个模块的设计如下:
1、模块内容是嵌在module 和endmodule两个语句之间。每个模块实现特定的功能,模块可进行层次的嵌套,因此可以将大型的数字电路设计分割成大小不一的小模块来实现特定的功能,最后通过由顶层模块调用子模块来实现整体功能,这就是Top-Down的设计思想,如 2.1.1的例[3]。

2、模块包括接口描述部分、声明部分、逻辑功能描述部分。这可以把模块与器件相类比。模块的端口定义部分,如上例: module addr (a, b, cin, count, sum); 其中module 是模块的保留字,addr 是模块的名字,相当于器件名。()内是该模块的端口声明,定义了该模块的管脚名,是该模块与其他模块通讯的外部接口,相当于器件的pin 。

3、模块的声明部分,包括I/O说明,内部信号、参数等的声明语句。I/O说明语句如:
input [2:0] a;
input [2:0] b;
input cin;
output count;
或者
input wire [2:0] a;
input wire [2:0] b;
input wire cin;
output reg count;
其中的input 、output、inout 是保留字,定义了管脚信号的流向。wire 和 reg也是保留字,定义了管教信号的类型,是线网型信号还是寄存器型信号。[n:0]表示该信号的位宽(总线或单根信号线)。内部信号的声明和I/O说明语句类似,只不过不需要指明信号的流向,只需指明信号的类型和位宽。参数的声明语句格式在后续章节介绍。

4、逻辑功能描述部分,如:
assign d_out = d_en ? din :'bz;
multi2 U_multi2_0(selete_4to1[0],dat_in_0,dat_in_1,dat_out_0);
功能描述部分用于定义模块的功能,可以是各种逻辑描述(主要是组合逻辑和时序逻辑,可用多种方法进行描述,具体的用法下面章节有介绍),还可以使实例化一个器件或其他模块,该器件可以是厂家的器件库也可以是我们自己用HDL设计的模块(相当于在原理图输入时调用一个库元件)。在逻辑功能描述中,主要用到assign 和always 两个语句。

5、对每个模块都要进行端口定义,并说明输入、输出口,然后对模块的功能进行逻辑描述,当然,对测试模块,可以没有输入输出口。

6、Verilog HDL 的书写格式自由,一行可以写几个语句,也可以一个语句分几行写。当然,对于一个研发团队,是应该有一定的编码风格可以遵循的,这样子的代码才能更方便阅读。有一些约定俗成的东西是需要遵循的,如尽量不要在同一行写几个语句。

7、除endmodule 语句外,每个语句后面需有分号表示该语句结束。

1、I/O信号的方向描述和信号类型描述可以分开写成两句语句也可以在同一个语句里面写,但是信号位宽在方面声明语句和信号类型声明语句中都必须写出来,而且要保持位宽一致。2、模块是不同直接或者间接地例化它自己的,这与软件的嵌套是有区别的,因为一个硬件里面不可以包含它自己。3、建议模块不能太复杂,如果超过一定行数(如2000行),建议将这个模块再细分成几个小模块。

使用特权

评论回复
5
星星之火红|  楼主 | 2012-11-8 00:02 | 只看该作者
2.1.3 模块的语法  
1. 一个模块的基本语法如下:
module module_name (port1, port2, ......) ;
// Declarations field:
input, output, inout,
reg, wire, parameter,
function, task, . . .
// Statement field:
Initial statement
Always statement
Module instantiation
Gate instantiation
Continuous assignment
endmodule
模块的结构需按上面的顺序进行,声明区用来对信号方向、信号数据类型、函数、任务、参
数等进行描述。语句区用来对功能进行描述如:器件调用(Module instantiation )等。

2. 书写语法建议
一个模块用一个文件;
模块名与文件名要同名;
一行一句语句。
信号方向按输入、输出、双向顺序描述。
设计模块时可尽量考虑采用参数化,提高设计的重用。

1、虽然一个模块内部分为声明区和语句区,但是并没有限制必须所有申明结束后才可以写描述语句只要保证信号使用前先声明即可。特别是一些内部语句的声明,可以在使用的前面几行声明,这样可以增加代码的可读性。2、上述书写语法建议,仅仅是建议,可结合自己的喜好和团队的风格自行定义自己团队的编码风格。

使用特权

评论回复
6
星星之火红|  楼主 | 2012-11-8 00:03 | 只看该作者
2.2 时延  



信号在电路中传输会有传播延时,如线延时、器件延时。时延就是对延时特性的HDL描述。举例如下:
      
assign # 2 B = A;
该语句表示的是B信号在2个时间单位后得到A信号的值。如下图所示:


在Verilog HDL中,所有时延都必须根据时间单位进行定义,时间单位的定义方式为在文件头添加如下语句:
        `timescale 1ns /100ps
其中’timescale 是Verilog HDL 提供的预编译处理命令, 1ns 表示时间单位是1ns ,100ps表示时间精度是100ps。根据该命令,编译工具才可以认知 #2 为2ns。在Verilog HDL 的IEEE标准中没有规定时间单位的缺省值,由各仿真工具确定。因此,在写代码时必须确定。


1. 1ns/100ps是最常用的时间单位,也可以根据实际需要将时间单位修改成其他值。时间精度为100ps的意思是指描述一个时间值时,最多能精确到100ps,如时延值可以为2.5,但是不能为2.55,因为2.5的精度为100ps,2.55的精度为10ps。2.`timescale宏定义指令一般是和其他宏定义指令一起在专门的宏定义define文件中指定,然后将define文件用`include宏定义指令添加在每个模块文件头部,语法如下:
         
`include "define.v"
3.一个FPGA设计的所有模块中的时延值都应该采用同一个值,而且这个时延值必须参数化(可在define.v文件用`define语句定义时延参数,语法为:
         `define UDLY 1
其中UDLY表示的意思的是单位时延,被定义为1。然后在RTL代码中使用时延的办法语法为:
          assign #`UDLY B = A;
同时,一般在可实现的RTL级代码中组合逻辑(如assign语句)不需要使用时延,时延只在时序逻辑(如always语句)中使用。这样做的目的,是保证每个信号(不管是wire还是reg)相对时钟的延迟都是1个时间单位,各个信号参与运算的时候就不会出现一些短暂的毛刺。虽然这种类型的毛刺不影响功能,但是对于分析波形会有很大的干扰。

使用特权

评论回复
7
wmsk| | 2012-11-8 00:20 | 只看该作者
学习啦。

使用特权

评论回复
8
GoldSunMonkey| | 2012-11-8 00:31 | 只看该作者
:lol

使用特权

评论回复
9
Dick00| | 2012-11-14 18:31 | 只看该作者
学习了

使用特权

评论回复
10
wmsk| | 2012-11-14 18:31 | 只看该作者
学习了
Dick00 发表于 2012-11-14 18:31
不错

使用特权

评论回复
11
GoldSunMonkey| | 2012-11-14 18:51 | 只看该作者
:lol

使用特权

评论回复
12
chuxuezhe12| | 2013-1-5 19:13 | 只看该作者
学些学习

使用特权

评论回复
13
GoldSunMonkey| | 2013-1-5 23:10 | 只看该作者
嘿嘿

使用特权

评论回复
14
星星之火红|  楼主 | 2013-1-13 22:11 | 只看该作者
GoldSunMonkey 发表于 2013-1-5 23:10
嘿嘿

学习啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

1782

帖子

22

粉丝