Verilog HDL 建模概述
发布时间:2008/5/28 0:00:00 访问次数:518
在数字电路设计中,数字电路可简单归纳为两种要素:线和器件。线是器件管脚之间的物理
连线;器件也可简单归纳为组合逻辑器件(如与或非门等)和时序逻辑器件(如寄存器、锁存
器、ram等)。一个数字系统(硬件)就是多个器件通过一定的连线关系组合在一块的。因此,
verilog hdl 的建模实际上就是如何使用hdl语言对数字电路的两种基本要素的特性及相互之间的
关系进行描述的过程。
assign {count,sum} = a +b + cin;
endmodule
该例描述一个3位加法器,从例子可看出整个模块是以module 开始,endmodule 结束。
assign equare = (a == b) ? 1:0 ;
/ * if a = b , output 1, otherwise 0;*/
endmodule
2004-08-16 第9页,共41页
版权所有,侵权必究
绝密
verilog hdl 入门教程请输入文档编号
// -- enter your statements here -- //
assign d_out = d_en ? din :'bz;
endmodule
module trist (din, d_en, d_out);
input din;
input d_en;
output d_out;
// -- statements here -- //
绝密
verilog hdl 入门教程请输入文档编号
功能描述用来产生各种逻辑(主要是组合逻辑和时序逻辑,可用多种方法进行描述,具体的
用法下面章节有介绍),还可用来实例化一个器件,该器件可以是厂家的器件库也可以是我们自
己用hdl设计的模块(相当于在原理图输入时调用一个库元件)。在逻辑功能描述中,主要用到
assign 和always 两个语句。
连线;器件也可简单归纳为组合逻辑器件(如与或非门等)和时序逻辑器件(如寄存器、锁存
器、ram等)。一个数字系统(硬件)就是多个器件通过一定的连线关系组合在一块的。因此,
verilog hdl 的建模实际上就是如何使用hdl语言对数字电路的两种基本要素的特性及相互之间的
关系进行描述的过程。
下面通过一些实例,以便对verilog hdl 的设计建模有个大概的印象。
3.1 模块
模块(module )是verilog 的基本描述单位,用于描述某个设计的功能或结构及与其他模块通
信的外部端口。
模块在概念上可等同一个器件就如我们调用通用器件(与门、三态门等)或通用宏单元(计
数器、alu、cpu)等,因此,一个模块可在另一个模块中调用。
一个电路设计可由多个模块组合而成,因此一个模块的设计只是一个系统设计中的某个层次
设计,模块设计可采用多种建模方式。
模块(module )是verilog 的基本描述单位,用于描述某个设计的功能或结构及与其他模块通
信的外部端口。
模块在概念上可等同一个器件就如我们调用通用器件(与门、三态门等)或通用宏单元(计
数器、alu、cpu)等,因此,一个模块可在另一个模块中调用。
一个电路设计可由多个模块组合而成,因此一个模块的设计只是一个系统设计中的某个层次
设计,模块设计可采用多种建模方式。
3.1.1 简单事例
下面先介绍几个简单的verilog hdl 程序。
例[1] 加法器
module addr (a, b, cin, count, sum);
input [2:0] a;
input [2:0] b;
input cin;
output count;
output [2:0] sum;
下面先介绍几个简单的verilog hdl 程序。
例[1] 加法器
module addr (a, b, cin, count, sum);
input [2:0] a;
input [2:0] 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 signal ;
output equare ; // declare the output signal;
input [1:0] a,b; // declare the input signal ;
output equare ; // declare the output signal;
assign equare = (a == b) ? 1:0 ;
/ * if a = b , output 1, otherwise 0;*/
endmodule
2004-08-16 第9页,共41页
版权所有,侵权必究
绝密
verilog hdl 入门教程请输入文档编号
该例描述一个比较器,从上可看到,/* .... */ 和 // ... 表示注释部分。注释只是为了方便设计者
读懂代码,对编译并不起作用。
读懂代码,对编译并不起作用。
例[3] 三态驱动器
module mytri (din, d_en, d_out);
input din;
input d_en;
output d_out;
input din;
input d_en;
output d_out;
// -- enter your statements here -- //
assign d_out = d_en ? din :'bz;
endmodule
module trist (din, d_en, d_out);
input din;
input d_en;
output d_out;
// -- statements here -- //
mytri u_mytri(din,d_en,d_out);
endmodule
该例描述了一个三态驱动器。其中三态驱动门在模块 mytri 中描述,而在模块trist 中调用了模
endmodule
该例描述了一个三态驱动器。其中三态驱动门在模块 mytri 中描述,而在模块trist 中调用了模
块mytri 。模块mytri 对trist 而言相当于一个已存在的器件,在trist 模块中对该器件进行实例化,实
例化名 u_mytri 。
例化名 u_mytri 。
3.1.2 模块的结构
通过上面的实例可看出,一个设计是由一个个模块(module )构成的。一个模块的设计如
下:
1、模块内容是嵌在module 和endmodule 两个语句之间。每个模块实现特定的功能,模块可进
行层次的嵌套,因此可以将大型的数字电路设计分割成大小不一的小模块来实现特定的功能,最
后通过由顶层模块调用子模块来实现整体功能,这就是top-down 的设计思想,如 3.3.1的例[3]。
通过上面的实例可看出,一个设计是由一个个模块(module )构成的。一个模块的设计如
下:
1、模块内容是嵌在module 和endmodule 两个语句之间。每个模块实现特定的功能,模块可进
行层次的嵌套,因此可以将大型的数字电路设计分割成大小不一的小模块来实现特定的功能,最
后通过由顶层模块调用子模块来实现整体功能,这就是top-down 的设计思想,如 3.3.1的例[3]。
2、模块包括接口描述部分和逻辑功能描述部分。这可以把模块与器件相类比。
模块的端口定义部分:
如上例: module addr (a, b, cin, count, sum); 其中module 是模块的保留字,addr 是模块的名
模块的端口定义部分:
如上例: module addr (a, b, cin, count, sum); 其中module 是模块的保留字,addr 是模块的名
字,相当于器件名。()内是该模块的端口声明,定义了该模块的管脚名,是该模块与其他模块
通讯的外部接口,相当于器件的pin 。
模块的内容,包括i/o说明,内部信号、调用模块等的声明语句和功能定义语句。
i/o说明语句如:input [2:0] a; input [2:0] b; input cin; output count; 其中的input 、
模块的内容,包括i/o说明,内部信号、调用模块等的声明语句和功能定义语句。
i/o说明语句如:input [2:0] a; input [2:0] b; input cin; output count; 其中的input 、
output、inout 是保留字,定义了管脚信号的流向,[n:0]表示该信号的位宽(总线或单根信号线)。
2004-08-16 第10页,共41页
版权所有,侵权必究
版权所有,侵权必究
绝密
verilog hdl 入门教程请输入文档编号
逻辑功能描述部分如: assign d_out = d_en ? din :'bz;
mytri u_mytri(din,d_en,d_out);
mytri u_mytri(din,d_en,d_out);
功能描述用来产生各种逻辑(主要是组合逻辑和时序逻辑,可用多种方法进行描述,具体的
用法下面章节有介绍),还可用来实例化一个器件,该器件可以是厂家的器件库也可以是我们自
己用hdl设计的模块(相当于在原理图输入时调用一个库元件)。在逻辑功能描述中,主要用到
assign 和always 两个语句。
3、对每个模块都要进行端口定义,并说明输入、输出口,然后对模块的功能进行逻辑描述,
当然,对测试模块,可以没有输入输出口
当然,对测试模块,可以没有输入输出口
在数字电路设计中,数字电路可简单归纳为两种要素:线和器件。线是器件管脚之间的物理
连线;器件也可简单归纳为组合逻辑器件(如与或非门等)和时序逻辑器件(如寄存器、锁存
器、ram等)。一个数字系统(硬件)就是多个器件通过一定的连线关系组合在一块的。因此,
verilog hdl 的建模实际上就是如何使用hdl语言对数字电路的两种基本要素的特性及相互之间的
关系进行描述的过程。
assign {count,sum} = a +b + cin;
endmodule
该例描述一个3位加法器,从例子可看出整个模块是以module 开始,endmodule 结束。
assign equare = (a == b) ? 1:0 ;
/ * if a = b , output 1, otherwise 0;*/
endmodule
2004-08-16 第9页,共41页
版权所有,侵权必究
绝密
verilog hdl 入门教程请输入文档编号
// -- enter your statements here -- //
assign d_out = d_en ? din :'bz;
endmodule
module trist (din, d_en, d_out);
input din;
input d_en;
output d_out;
// -- statements here -- //
绝密
verilog hdl 入门教程请输入文档编号
功能描述用来产生各种逻辑(主要是组合逻辑和时序逻辑,可用多种方法进行描述,具体的
用法下面章节有介绍),还可用来实例化一个器件,该器件可以是厂家的器件库也可以是我们自
己用hdl设计的模块(相当于在原理图输入时调用一个库元件)。在逻辑功能描述中,主要用到
assign 和always 两个语句。
连线;器件也可简单归纳为组合逻辑器件(如与或非门等)和时序逻辑器件(如寄存器、锁存
器、ram等)。一个数字系统(硬件)就是多个器件通过一定的连线关系组合在一块的。因此,
verilog hdl 的建模实际上就是如何使用hdl语言对数字电路的两种基本要素的特性及相互之间的
关系进行描述的过程。
下面通过一些实例,以便对verilog hdl 的设计建模有个大概的印象。
3.1 模块
模块(module )是verilog 的基本描述单位,用于描述某个设计的功能或结构及与其他模块通
信的外部端口。
模块在概念上可等同一个器件就如我们调用通用器件(与门、三态门等)或通用宏单元(计
数器、alu、cpu)等,因此,一个模块可在另一个模块中调用。
一个电路设计可由多个模块组合而成,因此一个模块的设计只是一个系统设计中的某个层次
设计,模块设计可采用多种建模方式。
模块(module )是verilog 的基本描述单位,用于描述某个设计的功能或结构及与其他模块通
信的外部端口。
模块在概念上可等同一个器件就如我们调用通用器件(与门、三态门等)或通用宏单元(计
数器、alu、cpu)等,因此,一个模块可在另一个模块中调用。
一个电路设计可由多个模块组合而成,因此一个模块的设计只是一个系统设计中的某个层次
设计,模块设计可采用多种建模方式。
3.1.1 简单事例
下面先介绍几个简单的verilog hdl 程序。
例[1] 加法器
module addr (a, b, cin, count, sum);
input [2:0] a;
input [2:0] b;
input cin;
output count;
output [2:0] sum;
下面先介绍几个简单的verilog hdl 程序。
例[1] 加法器
module addr (a, b, cin, count, sum);
input [2:0] a;
input [2:0] 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 signal ;
output equare ; // declare the output signal;
input [1:0] a,b; // declare the input signal ;
output equare ; // declare the output signal;
assign equare = (a == b) ? 1:0 ;
/ * if a = b , output 1, otherwise 0;*/
endmodule
2004-08-16 第9页,共41页
版权所有,侵权必究
绝密
verilog hdl 入门教程请输入文档编号
该例描述一个比较器,从上可看到,/* .... */ 和 // ... 表示注释部分。注释只是为了方便设计者
读懂代码,对编译并不起作用。
读懂代码,对编译并不起作用。
例[3] 三态驱动器
module mytri (din, d_en, d_out);
input din;
input d_en;
output d_out;
input din;
input d_en;
output d_out;
// -- enter your statements here -- //
assign d_out = d_en ? din :'bz;
endmodule
module trist (din, d_en, d_out);
input din;
input d_en;
output d_out;
// -- statements here -- //
mytri u_mytri(din,d_en,d_out);
endmodule
该例描述了一个三态驱动器。其中三态驱动门在模块 mytri 中描述,而在模块trist 中调用了模
endmodule
该例描述了一个三态驱动器。其中三态驱动门在模块 mytri 中描述,而在模块trist 中调用了模
块mytri 。模块mytri 对trist 而言相当于一个已存在的器件,在trist 模块中对该器件进行实例化,实
例化名 u_mytri 。
例化名 u_mytri 。
3.1.2 模块的结构
通过上面的实例可看出,一个设计是由一个个模块(module )构成的。一个模块的设计如
下:
1、模块内容是嵌在module 和endmodule 两个语句之间。每个模块实现特定的功能,模块可进
行层次的嵌套,因此可以将大型的数字电路设计分割成大小不一的小模块来实现特定的功能,最
后通过由顶层模块调用子模块来实现整体功能,这就是top-down 的设计思想,如 3.3.1的例[3]。
通过上面的实例可看出,一个设计是由一个个模块(module )构成的。一个模块的设计如
下:
1、模块内容是嵌在module 和endmodule 两个语句之间。每个模块实现特定的功能,模块可进
行层次的嵌套,因此可以将大型的数字电路设计分割成大小不一的小模块来实现特定的功能,最
后通过由顶层模块调用子模块来实现整体功能,这就是top-down 的设计思想,如 3.3.1的例[3]。
2、模块包括接口描述部分和逻辑功能描述部分。这可以把模块与器件相类比。
模块的端口定义部分:
如上例: module addr (a, b, cin, count, sum); 其中module 是模块的保留字,addr 是模块的名
模块的端口定义部分:
如上例: module addr (a, b, cin, count, sum); 其中module 是模块的保留字,addr 是模块的名
字,相当于器件名。()内是该模块的端口声明,定义了该模块的管脚名,是该模块与其他模块
通讯的外部接口,相当于器件的pin 。
模块的内容,包括i/o说明,内部信号、调用模块等的声明语句和功能定义语句。
i/o说明语句如:input [2:0] a; input [2:0] b; input cin; output count; 其中的input 、
模块的内容,包括i/o说明,内部信号、调用模块等的声明语句和功能定义语句。
i/o说明语句如:input [2:0] a; input [2:0] b; input cin; output count; 其中的input 、
output、inout 是保留字,定义了管脚信号的流向,[n:0]表示该信号的位宽(总线或单根信号线)。
2004-08-16 第10页,共41页
版权所有,侵权必究
版权所有,侵权必究
绝密
verilog hdl 入门教程请输入文档编号
逻辑功能描述部分如: assign d_out = d_en ? din :'bz;
mytri u_mytri(din,d_en,d_out);
mytri u_mytri(din,d_en,d_out);
功能描述用来产生各种逻辑(主要是组合逻辑和时序逻辑,可用多种方法进行描述,具体的
用法下面章节有介绍),还可用来实例化一个器件,该器件可以是厂家的器件库也可以是我们自
己用hdl设计的模块(相当于在原理图输入时调用一个库元件)。在逻辑功能描述中,主要用到
assign 和always 两个语句。
3、对每个模块都要进行端口定义,并说明输入、输出口,然后对模块的功能进行逻辑描述,
当然,对测试模块,可以没有输入输出口
当然,对测试模块,可以没有输入输出口
版权所有:51dzw.COM
深圳服务热线:13692101218 13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式
深圳服务热线:13692101218 13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)

深圳市碧威特网络技术有限公司
付款方式