新闻  |   论坛  |   博客  |   在线研讨会
Verilog中模组(module)的概念
zhchxgh | 2009-07-14 22:09:26    阅读:5952   发布文章

Verilog中模组(module)的概念

Verilog中的基本单元是模组(module)。
模组代表一些可以用硬体实践的逻辑实体。 例如,一个模组可以是一个逻辑闸、一个三十二位元计数器、一个记忆体子系统、一个机算机系统或是一个用网路相连的多部电脑。
模组中与外界连接端(port)可以是一个位元或数个位元。连接端可以宣告为输入端、输出端或输出入端。 

以下介绍Verilog语法,用三种不同层级(Level)来表示模组的方式。 


下面以一个自定的 AND2 模组来说明。
它有三个单一位元称为 in1、in2、及 out 的连接端。其中 in1及 in2 为输入,而 out 为输出。其实这个 AND2 模组能做的事和 and 闸是一样的。 

宜礕从结构式层次定义模组的例子 //structural 
module AND2 (in1,in2,out);
input in1;
input in2;
output out;
wire in1,in2,out;
and u1 (out,in1,in2);
endmodule 



二∶从资料流层次程式定义模组的例子 

//data flow 

module AND2 (in1,in2,out); 

input in1; 

input in2; 

output out; 

wire in1,in2,out; 

assign out=in1&in2; 

endmodule

三∶从行为式层次定义模组的例子 

//behavioral 

module AND2 (in1,in2,out); input in1; input in2; output out; wire in1,in2; reg out; always @(in1 or in2); out=in1 & in2;

endmodule

一个Verilog模组包含了关键字(keywords)、名字(names)、文字(literals)、 注解(comments)以及标点符号。Verilog语法中大小写与C语言一样,大小写是不一样的,而Verilog中所有的关键字均是使用小写。空白、跳格(tab)及换行是用来增加程式的可读性。注解的用法为 /*注解*/。 

所有的模组均以关键字module开始,并紧跟著该模组的模组名称、输入输出的串列。
所有的模组均以关键字endmodule结束。
模组名称必须唯宜礎没有重复。
上述三个例子 的模组接著宣告输出及输入的型别为wire。例外的是在行为式模组的例子将其输出宣告为 reg的型别。其实在Verilog中所有的输出及输入均预设为wire的型别,因此这些宣告(除了宣告为reg型别的输出外)均可省略。
以上三个模组分别说明三种不同的描述方式∶ 结构式(structural)、资料流程式(data-flow)及行为式(behavioral)。 

结构式的描述∶又称逻辑闸层次 -- Gate Level 

在这层次中模组是由逻辑闸连接而成,在这层次的设计工作就好像以前用描绘逻辑闸来设计线路一样。 

资料流程式的描述∶ 又称暂存器传送层次 -- Register Transation Level 

它是一种模拟组合函式(combinational-functions)的方法。使用这种描述方式,函式可视为一棵有方向性的树(directed-tree)。输入为其树叶,输出为其树根。 当任何输入有所改变时,输出会被重新计算而跟著改变。资料流程式只能用来实践组合函式。 在这个层次中,要说明资料如何在暂存器中储存与传送,如何处理资料。 

行为式的描述∶ 

它是一种使用高阶语言来描述硬体的方式。因Verilog提供很普遍及功能强大的描述方式。因此使用行为式所描述的模组其描述与真实的电路可能毫无关连。甚至某些行为式模组可能无费晕硬体实践。这种特性是Verilog的优点也是缺点。 在这个层次的设计工作就好像写C语言一样。 

(例宜礮中的结构式模组有一个AND闸的实例。在(例宜礮中的AND与其他如or、nand、nor、not等均为Verilog的基本元件(primitive)。这些是Verilog语言预先定义好的函式。例如,这个AND闸实例会不断地观测其输入。如果输入有任何变化,这个AND函式将会重新用新的输入值计算出输入值。 

(例二)中的资料流程式模组有一个使用关键字assign的连续设定叙述。 

(例三)中的行为式模组有一个使用关键字always的行为式实例。
@(in1or in2) 表示式告诉拟器等待 in1或 in2发生变化。 如果发生变化则下列设定 : 

output=in1&in2; 


将表示式 in1AND in2 的值放置於变数out中。同时,always这个关键字也意味著当这个设定完成时,模拟器将等待下一次 in1或 in2 的变化。也就是说,always区块(block)很像传统程 式语言的无穷回圈。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客