|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Verilog基本语法——模块
0 J- Q: L* i {9 O4 E; G
) A0 w& u* V% d' C+ M% T$ j3 r模块特点
5 ?" i4 H# q3 W# `Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module和endmodule两个语句之间。每个模块实现特定的功能。模块可以进行层次嵌套。
3 B* j% f, X8 ~# s& O' ]: ~5 b9 Q5 L
每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。6 a( b4 g' k+ T, m' r
7 F0 Y$ \+ N) u$ s) p+ h0 xVerilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。
* ~) e5 s5 l* x# C. w0 e7 f" y$ z% Z2 o% V7 h4 J
除了endmodule语句外,每个语句和数据定义的最后必须有分号。9 Q6 ^3 h* ?) y; M" e& X% d" r
" ]7 x' o ?: j1 E( e2 w可以用/…../和//…….对Verilog HDL程序的任何部分作注释。一个好的,有使 : {4 G0 ~* ]7 A
用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。# ]: C9 q8 l6 J. C3 B3 _
# } p& i4 o3 E* {模块的结构
& _$ l' ?4 [* w! xmodule <模块名> (<端口列表>)1 N; ~$ t* y, A F% g' k
<I/O说明>
6 L5 |6 |4 J" {# G9 ~& T5 v1 i* w<内部信号声明>
4 E# e G* P5 B3 c7 P. d<功能定义>
3 G# J0 }% K; H4 B+ gendmodule
I7 c( [6 c+ f. }# |8 _! i1
- V' ?4 v0 |4 i+ D1 u: U8 R3 U! g2
# n8 q- d, R) p. J34 R, h$ J- A2 N0 K: w0 y& t
4! S8 u8 E% W7 W2 \# ]2 {
5
8 N; D8 ~! P& s% h) ]8 i% L: Z4 `模块的端口定义:9 D$ D. m% v6 O
模块的端口声明了模块的输入输出口。格式: z1 K! U$ l# B' y
5 m5 t$ u5 S B' O
module 模块名(口1,口2,口3,口4,......)
) H) D+ \# ]2 A: y1 Q' a1 E( R1/ ^0 J- [- K; Z: E) o0 @, W
模块的内容:
# j# w3 u1 s9 \0 x8 M; ]7 EI/O说明
, K, R" y! z* Q: `输入口(input 端口名1,端口名2,……端口名n)) R& g& ]; F; @& W" X- H
! L, U5 h: b& h( h1 Y) H. f输出口(output 端口名1,端口名2,……端口名n)$ D' ]0 g: Q/ v' X1 ^ C
9 I9 L7 e/ n3 {. r: oI/O\说明也可以卸载端口声明语句中: module module_name(input port1,input port2,…output port1,output port2…)+ x! B$ S% k' W
: i1 w/ a# W" j8 }! p) b. v+ o内部信号说明
. X2 }3 S* m, {7 A) Z, @* _9 d# I3 r1 T在模块内用到的和与端口有关的wire和reg变量的声明,比如:reg[width-1:0] R1,R2…; wire[width-1:0] W1,W2…1 C' r' e, q P) t, }
' t: {" `7 {2 f* i4 B+ V1 f; A 功能定义$ b2 b' T9 n9 w6 F
模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑:
i. P6 ]+ h' W5 K! \- I
1 F& Y! Y H, Z' v, U用“assign”声明语句
1 u4 @$ L: D# I0 {“assign”,后面再加一个方程式即可
3 _5 ?6 \: E- J# \" Q- R9 p; P: l$ o
assign a = b & c;//两个输入的与门
G6 ^2 j, m' z. Z) N5 V/ B" X1
0 N6 ]% i% S6 _: k' D7 u“assign”语句是描述组合逻辑最常用的方法之一& r) T0 ^ K7 ?# `
! G* [ v( P( w$ n. w7 |2 b v用实例元件
3 t8 V- e5 u4 F, D. V6 F: `6 E1 Pand and_inst( q, a, b );$ F6 R/ V1 D7 V/ E6 p0 c3 B
1$ H7 j: Z; J4 z" z- z+ K7 l
采用实例元件的方法象在电路图输入方式下,调入库元件一样。键入元件的名字和相连的引脚即可,
) v$ v2 Y/ z" @- u& w表示在设计中用到一个跟与门(and)一样的名为and_inst的与门,其输入端为a, b,输出为q。要求 5 X3 w' H$ M. u) J
每个实例元件的名字必须是唯一的,以避免与其他调用与门(and) 的实例混淆。- d( h) g3 Z3 d3 f; r
' q5 X2 Q+ M3 n5 E% j用“always”块$ P; j, g- z/ V8 s, A) q7 a/ e0 O
always @(posedge clk or posedge clr)
$ {' g/ }! E. O Ubegin9 n6 U- ?8 @9 {, t7 D; t$ U; J
if(clr) q <= 0;$ H2 o4 H* c, e# @: u
else if(en) q <= d;- T, [! P; h! Z; j
end. ~5 Y* E/ h9 ]( U2 b' |
//带有异步清除端的D触发器+ |8 i B( N/ K) }$ A5 v
; I: r7 j$ C5 L3 k6 X1 A7 `; l5 i+ o
“always”块既可用于描述组合逻辑也可 ; W% |/ t9 r: s3 j1 z
描述时序逻辑.“always”模块内,逻辑是按照指定的顺序执行的,两个或更多的“always”模块也是同时执行的,但是模块内部的语
6 M. ~) g4 v# F+ B句是顺序执行的 | ( |- v# V$ P7 _0 ^+ ^+ a% d0 i
|
|