|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Verilog基本语法——模块 / ?) e' s' i/ p9 i, e2 z. D4 d9 V
3 ~- R) V! ]& P. m, e3 L
模块特点: N' q# `# X+ W! `+ y7 S0 X
Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module和endmodule两个语句之间。每个模块实现特定的功能。模块可以进行层次嵌套。
6 L7 [7 e* t/ F' l; ?. p6 H0 r& m7 `
每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。
$ R$ e3 w, u. W1 Q* K. V# x, Y9 T, `/ G
Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。
( @5 R$ {# J" D; Z% N% f& R. y0 n, X- ]" g6 |; t- h
除了endmodule语句外,每个语句和数据定义的最后必须有分号。
% j8 R9 a( H/ V+ f- p9 R
$ r, h2 o& j8 |% p可以用/…../和//…….对Verilog HDL程序的任何部分作注释。一个好的,有使 % n" ]5 U V% f: V
用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。0 p; D. o; ? o) d, A( v
/ N. G5 Z% `8 K$ ? P" m/ c0 I; F
模块的结构
) x; |$ g+ C, Z. W1 Mmodule <模块名> (<端口列表>)
+ I/ m; q6 x1 G0 C8 W<I/O说明>0 z+ Q6 g. } G
<内部信号声明>6 Q9 i. l$ |6 J0 m' d- Y
<功能定义>
1 E: L1 l- F% F7 |# k( A1 Xendmodule5 P4 R2 } B- c0 m3 Z0 Y: p( e
1. s/ L3 @7 L( k) @& I
2
; z. _1 A9 b* H# W" k3
& Z4 K; |, i- O, [. d43 ^5 T2 j% P5 n2 |8 |5 }1 F
5
3 v0 q6 R! n3 r5 c. e模块的端口定义:) U: U# Q. H, t' o6 C x/ y, a
模块的端口声明了模块的输入输出口。格式:% g8 t# ^. b" O2 r; G( d
5 k4 g% i7 N8 X$ y
module 模块名(口1,口2,口3,口4,......)
( y3 E. G" q* i& T0 m1$ p: s4 q8 z1 W5 W F* v; s5 g
模块的内容:9 s4 H6 O% l( B: T6 V
I/O说明
- Z" y+ p% L+ v5 h0 ~2 j( c输入口(input 端口名1,端口名2,……端口名n)
7 ~- j) v1 }0 N) J D$ N( h/ ? O6 N2 v& T; \
输出口(output 端口名1,端口名2,……端口名n)5 W7 a+ `9 `: F4 d
- C6 G! E6 W9 }1 x0 hI/O\说明也可以卸载端口声明语句中: module module_name(input port1,input port2,…output port1,output port2…)
* {; q" j2 m' Y; V4 O" f
t V) a( j5 T4 B0 ]内部信号说明+ {7 d8 r7 q2 Q7 P7 o5 N( w
在模块内用到的和与端口有关的wire和reg变量的声明,比如:reg[width-1:0] R1,R2…; wire[width-1:0] W1,W2…
& i" {: A! V; |1 P+ A6 [ |5 ^5 W# a0 H& q+ u/ I2 o6 m
功能定义
8 V x! p( A, R7 m) T' ]模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑:
2 O, |8 w. s7 Q0 D1 s% [% f& j t: {; [. p6 D5 R$ M/ p
用“assign”声明语句* y) t! X* z* H3 P
“assign”,后面再加一个方程式即可
# r1 z: o+ i o5 m4 ?# P5 K& \+ S/ V% t/ q
assign a = b & c;//两个输入的与门
4 C0 q9 H* G! H! v* `1
' K3 W( [4 R8 u) j! J“assign”语句是描述组合逻辑最常用的方法之一
+ z8 Y0 E% w9 U- v' |, p3 ]1 J# ]% S' J, P0 ^2 E: J, Y
用实例元件; L r3 s4 \6 b% T
and and_inst( q, a, b );! E8 M% N. V7 _
18 w Q0 u5 W" E3 n6 ?
采用实例元件的方法象在电路图输入方式下,调入库元件一样。键入元件的名字和相连的引脚即可, ; ~3 z9 a J: d! O- D
表示在设计中用到一个跟与门(and)一样的名为and_inst的与门,其输入端为a, b,输出为q。要求 6 z4 Q* ?5 N; y. r1 g Z
每个实例元件的名字必须是唯一的,以避免与其他调用与门(and) 的实例混淆。
6 @% `* S7 P( b3 F* O2 @0 ?
1 Q0 J. ^& d) H8 v用“always”块) g0 D& f& ], p A
always @(posedge clk or posedge clr)
3 B( Q# K3 N0 ^begin6 b6 N$ N; C5 G' t4 Y7 M) ~ L8 d
if(clr) q <= 0;' [3 s8 U' J2 K+ a$ B$ E
else if(en) q <= d;3 l5 u, P: C( t4 r
end8 n/ B2 g, u2 t7 j8 v
//带有异步清除端的D触发器
8 f2 d: \& C% _1 {' x. B. e5 `
% }8 i+ q3 U7 `8 t3 h: {“always”块既可用于描述组合逻辑也可 + [* w3 H+ k0 v0 x
描述时序逻辑.“always”模块内,逻辑是按照指定的顺序执行的,两个或更多的“always”模块也是同时执行的,但是模块内部的语
0 F7 F' b) O1 N# @; Z句是顺序执行的 |
7 {/ p+ d! |: s$ T% ^ |
|