TA的每日心情 | 开心 2019-11-20 15:00 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
VHDL入门学习-程序组成 ! i$ t- s+ M1 u5 T2 Q q0 U& p7 n7 U" ~
" ?. N$ m/ F4 W( t/ l) _$ O# w
1. VHDL程序的组成 一个完整的VHDL程序是以下五部分组成的:# T( n$ e' v7 n1 E; d
) p* S* T1 z8 l% p2 b
2. 库(LIBRARY):比较好理解,调用系统已有的库,WORK库就是用户当前编辑文件所在的文件夹, IEEE库:由IEEE(美国电子电机工程师学会)制定的标准库 LPM库0 z& H: P5 z4 a5 I% B, l; r `
! m* b" Y7 A2 b( Rlibrary IEEE;
3 g _( a) a3 X) H# v4 w8 p5 Kuse IEEE.STD_LOGIC_1164.ALL;
+ ]0 U& ]5 [% D W1 [& ~9 _use IEEE.math_real.all;
" v3 G5 A8 H: p' I3 H' D3 S1 K8 vuse IEEE.std_logic_arith.all;; y3 ?) z4 j2 j2 J8 w, R
3. 程序包(PACKAGE):声明在设计中将用到的常数、数据类型、元件及子程序' i( e* j6 A. Q6 A4 p& H: K" p8 C
4 h6 b# F& W1 d1 V$ x4. 实体(ENTITY):声明本设计的接口引脚,输入输出引脚,写法一般是引脚名字:接口方向:标准逻辑0 u' g" a/ z# C9 j4 o
) D! W+ F: M" e- e; M
复制代码
+ f# k/ W" ~# l8 y* Q: Zentity TempSensorCtl is: ]; h, N, u, m, [
Generic (CLOCKFREQ : natural := 100); -- input CLK frequency in MHz' B- g0 b# {6 [* d0 ~
Port (" p1 y& A \% T
TMP_SCL : inout STD_LOGIC;# ~* @9 T0 w% P7 ^( x3 K
TMP_SDA : inout STD_LOGIC;0 ]& m Y( G6 P2 x9 Z
-- TMP_INT : in STD_LOGIC; -- Interrupt line from the ADT7420, not used in this project6 V2 S0 ^' D! \5 g. y4 Z! L
-- TMP_CT : in STD_LOGIC; -- Critical Temperature interrupt line from ADT7420, not used in this project
* s: I! Z: Y4 U1 A7 x; f
$ a' Z1 t4 V" Z2 l+ ] TEMP_O : out STD_LOGIC_VECTOR(12 downto 0); --12-bit two's complement temperature with sign bit
) B, i; [* H) u- }; n RDY_O : out STD_LOGIC; --'1' when there is a valid temperature reading on TEMP_O6 X& U1 z4 V8 V: [/ }0 ?4 x
ERR_O : out STD_LOGIC; --'1' if communication error
3 {6 E& k7 l( J4 s' E' Q " i: f/ q0 d$ m; X) S8 y5 S
CLK_I : in STD_LOGIC;# ]. Y6 b3 d- c
SRST_I : in STD_LOGIC
# z. u5 C7 }. W, Y' g: h) a5 m );$ j `# T- c# U$ _1 A6 T3 E
复制代码
" ~+ d) S8 r' x, v/ ~实体类似于原理图中的一个部件符号,它并不描述设计的具体功能,只是定义所需的全部输入/输出信号。实体格式如下:
2 A( y8 @# }( w! X; X% U& G: k! B- u+ r8 O2 k" H1 R
复制代码
# k) d) {9 s- \ENTITY 实体名 IS [
$ M/ x3 k3 J7 W! hGENERIC(常数名:数据类型[:设定值])] 类属说明 % K% T. E4 m+ l2 g2 e6 i
PORT % w K& |# r# t, |( _
端口说明 (8 V$ @$ D9 i/ G) q
端口信号名1: 模式 类型;* n4 V1 b. E" {6 r: B" S
端口信号名2: 模式 类型;
% D5 `! d, c$ ~& X& w9 K端口信号名3: 模式 类型;3 P; M! i. B. x! C, s
端口信号名4: 模式 类型);$ ?/ \! `3 g2 K9 g6 C" d
TYPE语句或常量定义 9 u+ `& I4 Q' e+ j4 r( F5 r
实体申明 并行语句
- n/ @- r; E i$ \7 c2 F实体语句 END 实体名;2 x& r( V/ k$ r
复制代码9 S3 r2 v' B& O; `& |
8 ~# B) y6 M+ y6 K6 C1 N
& l# Z, n+ R. D; u' Z0 v1 W( d端口信号名:端口信号名在实体之中必须是唯一的,信号名应是合法的标识符 端口模式:分别有IN、OUT、INOUT、BUFFER和LINKAGE,这五种类型在后面的章节将介绍到。
4 B! p) [5 K- g+ P! z. j. G# p3 |5 H4 a& [! Q9 w E
端口类型:常用的有INTEGER、STD_LOGIC、STD_LOGIC_VECTOR,有待后面章节介绍。0 e3 |& B: |! m2 Z1 q. K6 c
# W" e" {, ]1 N8 l$ i5. 构造体(ARCHITECTUR):定义实体的实现,电路的具体描述,结构体 所有能被仿真的实体都由结构体(ARCHITECTURE)描述,即结构体描述实体的结构或行为,一个实体可以有多个结构体,每个结构体分别代表该实体功能的不同实现方案。结构体的任务是:定义结构体中的各项内部使用元素,如数据类型(TYPE),常数(CONSTAND),信号(SIGNAL),元件(COMPONENT),过程(POCEDURE),变量(VARIABLE)和进程(PROCESS)等。通过VHDL语句描述实体所要求的具体行为和逻辑功能。描述各元件之间的连接。
" H. F3 ?" F' y9 Z2 b' j' Y4 A; R" u6 ?) c3 t, Q8 y4 x
复制代码- E8 C& v: |9 Y' u
rchitecture Behavioral of TempSensorCtl is
* o" \ j: j# Q7 [' K+ B
9 z& e1 Q2 q, g) Y r3 E" D. K-- TWI Controller component declaration% Z* Q) W8 m2 r+ Q8 w
component TWICtl
$ u9 i% _5 @. p0 y: `3 P generic + f% b# d9 L' O% A) y, f
//中间省略* e" g1 C. b, R
end Behavioral;
. v9 w' [3 E0 Q. V2 R) |+ e: u. ?复制代码
$ p6 j3 f) E' Z3 N, Z& R元件就是其他文件定义好的模块,比如元件component TWICtl,就是其他文件的模块,这里只是调用4 E7 P0 N( G+ d
; L, x, R5 t3 @' _' \复制代码 ]; R0 E4 r! E. o' E6 X5 x' F/ D
component TWICtl. P# s) W7 {5 `; m& X* j
generic
3 p: P3 A1 A7 o" Z) U$ p0 [ (
* D% z- W3 Q9 W0 ~ CLOCKFREQ : natural := 50; -- input CLK frequency in MHz
) h* n+ S& w; ]' y) f7 B; ? ATTEMPT_SLAVE_UNBLOCK : boolean := false --setting this true will attempt
4 N- w) I) M! M2 ?- x, \2 `* [ --to drive a few clock pulses for a slave to allow to finish a previous2 H# @# D4 ?1 I0 m
--interrupted read transfer, otherwise the bus might remain locked up
4 |0 ^6 ~! ~6 T );
- s% ]. W- k3 `) S5 r port (
X0 G: ]6 _8 q9 O" F MSG_I : in STD_LOGIC; --new message
& t& g' A% }. {4 ?5 d/ O STB_I : in STD_LOGIC; --strobe1 X/ f8 v3 R* c
A_I : in STD_LOGIC_VECTOR (7 downto 0); --address input bus
- x( r* u3 [' [ D_I : in STD_LOGIC_VECTOR (7 downto 0); --data input bus/ {. q1 G p- J3 O
D_O : out STD_LOGIC_VECTOR (7 downto 0); --data output bus5 k; g3 u: V' l
DONE_O : out STD_LOGIC; --done status signal5 n* U! M& k- D( a& F# E) u Q
ERR_O : out STD_LOGIC; --error status1 W) U3 [( e1 i* d8 ~( C4 S1 O: ?
ERRTYPE_O : out error_type; --error type% w3 I0 H }) a7 x0 }8 ?
CLK : in std_logic;
3 {! [/ C. T& ~9 U SRST : in std_logic;
$ M; l0 b0 ?# c' m# f----------------------------------------------------------------------------------
( f. }# U$ g0 c* A( H-- TWI bus signals! {( ]0 v7 F& [' o; K, E8 l
----------------------------------------------------------------------------------
# D1 P3 }: J1 @4 @ SDA : inout std_logic; --TWI SDA$ v: t+ n6 J, X8 _& c0 K. G. V
SCL : inout std_logic --TWI SCL3 u( q$ O( @. n& A3 r8 O; y( ~
);
. M6 X% ?5 S F% Pend component;
. G. L) o$ \8 n0 B' X" ]9 a复制代码) h3 ^# L W. _7 I9 e. K
调用的模块需要初始化一个实例
, i9 H7 B- r; W. V/ M
3 ]& o0 C$ v% Y, v Q+ X复制代码& @, V/ z7 v+ i
Inst_TWICtl : TWICtl* m' x+ q+ y- v! e& P
generic map (
5 [8 j$ g$ j9 F ATTEMPT_SLAVE_UNBLOCK => true,, f$ V: g1 Y+ \
CLOCKFREQ => 100+ |' \# V- p+ q* `6 Z0 l
)
1 d9 f. [+ O2 }& l! V# s$ \0 f+ r port map (
8 W$ l- q' w3 l& L+ Q9 e MSG_I => twiMsg,8 w! L- _5 w* G7 u- ]0 {
STB_I => twiStb,
5 H5 _; m2 d! O L m2 _ A_I => twiAddr,
; B+ [5 |1 \3 F: k D_I => twiDi,
5 L! a5 Z9 o- @ D_O => twiDo,* n3 Q* [; X, s0 S+ p7 E
DONE_O => twiDone,
: R1 q+ B/ e* P3 a ERR_O => twiErr,
5 I# I) k8 V- q$ [4 H$ T& Z p ERRTYPE_O => open,, G* p% w/ v9 ?7 F1 Q
CLK => CLK_I,8 j& Y1 {0 h$ e# l. K9 L
SRST => SRST_I,
% B! ?4 p- c; O2 v7 h# a SDA => TMP_SDA,
6 v- a; w% ?) d& b& c SCL => TMP_SCL& f) \( J9 N! l5 Y
);9 `( n3 h8 q& N" o
复制代码
6 E" p8 z/ [9 O9 J% a6 z) g6. 配置(CONFIGURATION):一个实体可以有多个构造体,可以通过配置来为实体选择其中一个构造体# Y+ A, D. ~- ]5 R
9 ^, p, K2 F( I7. VHDL的注释用的是--,如下
) s% Y N7 w/ M" m
; `% m+ O2 S: @$ ?) ]-- Uncomment the following library declaration if using
& o; f( m* B" U, y, ]8. constant常量,全局变量,在结构体描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用,在设计中描述某一规定类型的特定值不变,如利用它可设计不同模值的计数器,模值存于一常量中,对不同的设计,改变模值仅需改变此常量即可,就如上一章所说的参数化元件。 定义格式: CONSTANT 常数名:数据类型:=表达式;$ p- t+ _" L$ ?) m
! B) V/ o3 J+ F
constant ADT7420_ADDR : std_logic_vector(7 downto 1) := "1001011"; -- TWI Slave Address
( e9 `* K2 N Z6 Z, a constant ADT7420_RID : std_logic_vector(7 downto 0) := x"0B"; -- ID Register Address for the ADT7420
' x& y# ?, q# O5 k# l constant ADT7420_RRESET : std_logic_vector(7 downto 0) := x"2F"; -- Software Reset Register D' K6 Z+ q- ?& {. e* j |3 V
constant ADT7420_RTEMP : std_logic_vector(7 downto 0) := x"00"; -- Temperature Read MSB Address
5 M: H' L6 |( N: Y( I0 v5 `& q$ V constant ADT7420_ID : std_logic_vector(7 downto 0) := x"CB"; -- ADT7420 Manufacturer ID
9 ^' |' j: m, P/ x$ `9. 条件判断的写法9 x1 j4 x9 H) m
" E+ p, ~/ C, b" P/ R j
TEMP_O <= tempReg(15 downto 3);
/ F( T) i, ~% W$ rRDY_O <= '1' when fReady else
1 t X" [* P; P5 m- l8 C* f- R '0';
' Y7 Q2 y3 L. EERR_O <= '1' when state = stError else
6 E; V. `$ @. N+ g# u0 O* e '0';
# f, Z% l9 _+ A& a0 f: v- G10. 信号的写法4 l" Q" l) ?0 J. n
: j& T. A, \7 m+ }+ b7 z signal initWord: std_logic_vector (DATA_WIDTH-1 downto 0);
1 _4 A, d1 a# x' T, s' b. K3 O signal initA : natural range 0 to NO_OF_INIT_VECTORS := 0; --init vector index
! ~6 ~7 Z; @8 ]3 f signal initEn : std_logic;
4 B( y, s$ U. D' B8 ]1 i11. 数据类型定义,用户自定义的数据类型 有四种,分别是枚举类型、整数类型和实数类型、数组类型、记录类型 枚举类型: TYPE 数据类型名 IS (枚举文字,枚举文字,. . . .)
& m+ S* L7 l! D/ q E7 ^: R e8 W$ s' z5 R
复制代码) S! ^( P; p+ G9 _9 u) {
type state_type is (5 |4 X' G# ~8 f0 w8 W
stIdle, -- Idle State
! p7 O. ?$ N& d1 G7 m, p( E stInitReg, -- Send register address from the init vector
9 \" Y) W3 E2 ^" v$ M% Y) @ stInitData, -- Send data byte from the init vector- X; e; U- m+ A7 x# ]/ q
stRetry, -- Retry state reached when there is a bus error, will retry RETRY_COUNT times
9 U3 G( T( @/ N. N. C# F. @; w! B/ H stReadTempR, -- Send temperature register address
8 _" v' \) g1 ~; o. O; ?+ Z stReadTempD1, -- Read temperature MSB( M$ y0 \* e9 L3 s3 q
stReadTempD2, -- Read temperature LSB
7 ^- T, X) \0 ?" x0 ^3 C; \7 s stError -- Error state when reached when there is a bus error after a successful init; stays here until reset
8 W5 C- I! P( z S );
% r1 o) k* Z( t复制代码
1 e/ e8 X# s4 A1 R12. 怎么把实体的信号和元件(COMPONENT)的信号连接起来,定义一个元件(COMPONENT)的实例化对象,用信号(signal)连接起来,其实在实体定义的port也是信号 | ; J' t! n q# `' C
|
|