|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
9 J6 A0 I# E0 i1 V" F$ n, K6 q' \0 b1 E0 o
1、Verilog的基本设计单元是模块(block)。一个模块是有两部分组成的 ,一部分描述接口,另一部分描述逻辑功能,及定义输入时如何影响输出的。下图为模块结构的组成。
; l: |8 V8 w( k4 E2 Z3 w1 l
: N% t; u) H. r& j6 T2 S* Q2 E$ R, E! L' _! J! X4 s% H' y7 D1 d& a
(1)Verilog结构位于module和endmodule声明语句之间,每个Verilog程序包括四个主要部分:端口定义、I/O说明、内部信号声明和功能定义。模块的端口表示的是模块的输入还是输出口,其格式如下:module 模块名(口1,口2,口3,口4,……);
- ]' s% J3 H% [
( ~6 I" O- r4 H* q8 E# @: o(2)模块的内容包括I/O说明、内部信号声明和功能定义。
+ Q( ~4 A- Q4 Q/ G* k
0 G1 [, d7 d& L3 ^" Y i$ UI/O说明的格式,其中输入口:input[信号位宽-1:0] 端口名i;(共有i个输入端口),输出口:output[信号位宽-1:0] 端口名j;(共有j个输出口),输入/输出口:inout[信号位宽-1:0] 端口名k;(共有k个双向总线端口)。另外I/O说明也可以卸载端口声明语句里,其格式如下:module module_name(input port1,input port2,...output port1,output port2...);
/ L; ?# r; n8 M' P
+ N' ~- z: C4 @; q& c
8 l, W7 s c4 Q" ~3 H$ g u
0 J' K, J( g- T5 K$ d& B内部信号说明,在模块内用到的和与端口有关的wire和reg类型变量的声明。如:reg[width-1:0] R变量1,R变量2...;wire[width-1:0] W变量1,W变量2...;4 X$ c0 L! z0 J
% {& K1 D6 }- O' [/ B7 s
; j6 ^& w' I' o# q! o; `, }# D J
1 p2 \. J* g' l) y9 R模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑。
$ L# I( D7 [# B4 |" D( f+ [ }6 T& m# D. O
1)用“assign”声明语句:assign a = b & c;方程式描述了一个有两个输入的与门。/ |5 u# D3 U' H- [0 [: y# \
# z* s9 l/ d* n I
2)用实例元件,如:and #2 u1(q, a, b);表示在设计中用到一个跟与门(and)一样的名为u1的与门,其输入端为a,b,输出为q,输出延迟2个单位时间,实例元件的名字必须是唯一的,以免与其他调用与门(and)的实例混淆。
4 a7 _. p3 I' j, s0 X, f
# u/ `! ?" |* U1 ]3)用“always”块,如:6 r0 R! t5 h1 [0 a5 w4 ^. X
& z' c% \3 z! W" nalways @(posedge clk or posedge clr)$ W0 }8 B, e9 h, g
) Y# U6 ~ `+ X; ubegin7 g9 r( R2 e% k0 h; v; D* W
" b+ n& Y" m f2 X8 p( c
if(clr) q<= 0;
$ v* Y9 m6 p( r" h# O+ ~, p7 T; {3 i9 p5 S3 M; i! L" e3 d
else if(en) q <= d;
2 N+ Z, [; y7 E$ I# P9 {* e: ?( C p" H% \9 d
end2 U1 R# d* ~, b/ F! D& v+ c" C
, X5 i: G: i) d8 {采用“assign”语句是描述组合逻辑最常用的方法之一,而“always”块既可用于描述组合逻辑也可描述时序逻辑。
0 g; Q& E. P" Y8 @! g
/ X o/ n6 n% y: n6 _
2 `: L F% R0 _& P! C2 Q" H8 g1 o
0 @' D6 H1 w- a- Y7 Z
7 G: e& H$ l3 E7 `* ]' T2、数据类型及其常量及变量,Verilog HDL中总共有19种数据类型。数据类型是用来表示数字电路硬件中的数据储存和传送元素的,其中reg型、wire型、integer型和parameter型为四个最基本的数据类型。其他的类型有large型、medium型、scalared型、time型、small型、tri型、trio型、tril型、triand型、trior型、trireg型、vectored型、wand型和wor型。其中除了time型外都与基本逻辑单元建库有关,与设计系统没有很大的关系。
" Z6 g) Q; @1 J- N X% d
. H8 a$ u- p# V- u- g, V9 i9 Z4 W# h
( z1 v: o. d( u. d' d% T0 T8 v(1)在程序运行过程中,其值不能被改变的量称为常量,包括数字和参数型(parameter)。; Z) x; `4 p0 x9 V# G$ G
0 g% T4 N ?( J2 \. t& ]
(2)变量即在程序运行过程中其值可以改变的量,在Verilog HDL中变量的数据类型有很多种,其中只介绍wire型、reg型和memory型
3 H1 z, Q9 J* [- e
2 P2 W! H6 w. m+ w; o2 m' L4 Z
w7 a- F) `+ u
3 f8 q( ^& Y* D; n4 g9 ]3、运算符及表达式,按功能可分为算术运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符、位运算符、移动运算符和拼接运算符等。按其操作数可分为单目运算符、双目运算符和三目运算符。/ T7 y2 }+ A0 t
! d/ e+ H2 |' | k. R; F A2 P& a+ c
; \* H* I; e3 E& m1 D
2 z |. [, b" L9 h. m5 m/ n* [1 Z刚接触Verilog应注意以下几点:/ N3 {) J7 Z/ B1 L4 b
- i L4 G, z# ~% r7 S1 g3 g
1】在Verilog模块中所有过程块(initial块,always块)、连续赋值语句、实例引用都是并行的;
: Y* y6 i+ T8 M I1 f4 h
, Y% _% ]9 u- e2】它们表示的是一种通过变量名相互连接的关系;, a4 v* B4 Z$ L$ y: b
( M- O- X$ P0 E3 U) P" j- B. m; n
3】在同一模块中这三者出险的先后顺序没有关系;$ T5 o5 H% R' z D5 Z8 p
: i4 V( `! s( s4】只有连续赋值语句assign和实例引用语句可以独立于过程块而存在于模块的功能定义部分。) u* j# |; z; F( t1 ]
6 w5 Q e# t! i( v2 o4 v
5】被实例引用的模块,其端口可以通过不同名的连线或寄存器类型变量连接到别的模块相应的输出输入信号端。
4 ?/ `4 S6 j. ?5 | f- @8 p' s* s7 N7 w5 f6 t( z1 D' i
6】在“always”块内被赋值的每一个信号都必须定义成reg型。+ z% N+ M9 P3 K8 @; i- r
|
|