TA的每日心情 | 开心 2019-11-20 15:00 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
VHDL入门学习-程序组成 6 ~7 `3 N) B* b0 ]; `9 M) C0 a
8 l" ~" ], f& K3 L' N5 j1. VHDL程序的组成 一个完整的VHDL程序是以下五部分组成的:* Z* X& s* P4 r" G
5 y( D, l0 _1 T5 J7 p
2. 库(LIBRARY):比较好理解,调用系统已有的库,WORK库就是用户当前编辑文件所在的文件夹, IEEE库:由IEEE(美国电子电机工程师学会)制定的标准库 LPM库" a1 H5 ~- H, o, T* g6 r
- T: B, `; d$ N$ l
library IEEE;
' b6 V- X! F$ \$ o8 ^use IEEE.STD_LOGIC_1164.ALL;
$ x) r: L' K! @, G" juse IEEE.math_real.all;
& ]" I6 W) \* Q$ R* ^use IEEE.std_logic_arith.all;
- U- C* {. `9 ^: C! O n3. 程序包(PACKAGE):声明在设计中将用到的常数、数据类型、元件及子程序
% W& `, I& ^; |4 c, l( c
0 f4 i$ [0 Y# O" d/ Z0 `4. 实体(ENTITY):声明本设计的接口引脚,输入输出引脚,写法一般是引脚名字:接口方向:标准逻辑
9 w/ g0 _: C$ f2 w% p
4 h& T( a$ O p复制代码
4 Q- w9 Z$ j6 Xentity TempSensorCtl is! `0 G! B9 s7 O. x: c
Generic (CLOCKFREQ : natural := 100); -- input CLK frequency in MHz8 V( `) Y% Y" {; P$ P! M: |5 g
Port (" R1 ?* ?+ _3 v6 ^. K, m$ ~/ Q4 Q
TMP_SCL : inout STD_LOGIC;
( E t+ F4 v9 {% a; ? TMP_SDA : inout STD_LOGIC;
+ ?( h- H, E: }3 E0 S-- TMP_INT : in STD_LOGIC; -- Interrupt line from the ADT7420, not used in this project% J. E& B# ]$ V; d+ d) L
-- TMP_CT : in STD_LOGIC; -- Critical Temperature interrupt line from ADT7420, not used in this project
7 R1 u, O# {: b% X' g, Z 8 S) _# I2 l: d$ [( i
TEMP_O : out STD_LOGIC_VECTOR(12 downto 0); --12-bit two's complement temperature with sign bit& M" P% ~$ }+ s5 A/ M* z+ ]
RDY_O : out STD_LOGIC; --'1' when there is a valid temperature reading on TEMP_O
2 [ k. c, \ k, Y ERR_O : out STD_LOGIC; --'1' if communication error
; l2 w& v3 v0 c 3 }' Y/ @4 @* e# t; x
CLK_I : in STD_LOGIC;
( a4 q& f0 d# F! o/ e% b SRST_I : in STD_LOGIC1 T$ G7 B, _4 I& z1 `1 L/ i
);
- |0 i% b; d3 r, |$ A3 x复制代码
' e3 w/ ~5 L( s v$ E6 U- |实体类似于原理图中的一个部件符号,它并不描述设计的具体功能,只是定义所需的全部输入/输出信号。实体格式如下:! v( ]4 P; t4 o4 f( X# p' a
3 B! y% V+ H0 w- \+ h q1 s/ Q
复制代码
2 Y- T/ ~8 l: O* D5 g- F z% r+ ~ENTITY 实体名 IS [# H2 w. b" U6 i. [
GENERIC(常数名:数据类型[:设定值])] 类属说明 : y2 y5 u# @( R$ X+ c& H
PORT
) m9 J( b4 S, x0 ^端口说明 (
' G. f/ m+ ?1 E端口信号名1: 模式 类型;0 E; R/ j4 o- q+ M
端口信号名2: 模式 类型;
, u. j: }' Y* r8 l* k: l4 I端口信号名3: 模式 类型;
9 g& k9 }) {' Q* F端口信号名4: 模式 类型);+ W) S$ @+ a$ S: {9 j
TYPE语句或常量定义
% `4 n: Y# w" w; V8 r! z实体申明 并行语句
U5 b$ f. f! `. S5 E4 T7 R实体语句 END 实体名;& p& s% b3 e5 E- K( t4 Q4 I
复制代码
3 J9 p1 N) G7 G3 Y3 @# F
; y* [9 X4 K( J4 s p$ ] s7 |6 `$ f1 n: c% l- J N+ k2 Y
端口信号名:端口信号名在实体之中必须是唯一的,信号名应是合法的标识符 端口模式:分别有IN、OUT、INOUT、BUFFER和LINKAGE,这五种类型在后面的章节将介绍到。
0 @5 k# }7 F/ V0 F5 t8 D0 Q! a4 E& t/ N
端口类型:常用的有INTEGER、STD_LOGIC、STD_LOGIC_VECTOR,有待后面章节介绍。- F" U3 `2 S! @% Y$ o( _. z
] e$ y5 v/ E1 R5. 构造体(ARCHITECTUR):定义实体的实现,电路的具体描述,结构体 所有能被仿真的实体都由结构体(ARCHITECTURE)描述,即结构体描述实体的结构或行为,一个实体可以有多个结构体,每个结构体分别代表该实体功能的不同实现方案。结构体的任务是:定义结构体中的各项内部使用元素,如数据类型(TYPE),常数(CONSTAND),信号(SIGNAL),元件(COMPONENT),过程(POCEDURE),变量(VARIABLE)和进程(PROCESS)等。通过VHDL语句描述实体所要求的具体行为和逻辑功能。描述各元件之间的连接。* R7 r$ |* d+ a# B
: r3 q! \9 N D, p+ G) F+ Y& w复制代码2 ^0 K v* }2 I
rchitecture Behavioral of TempSensorCtl is
! d& C1 l7 M5 P9 G1 N! N- E1 C% ?& i. J4 { V) g& i: u
-- TWI Controller component declaration: {( r/ h* }' S5 ~0 a4 S$ b
component TWICtl) |7 y& I* M' j- [; r
generic " n0 A) |. V. U; @
//中间省略6 `/ {3 m/ v4 }: s) C; I& |4 t
end Behavioral;: c; c q/ n8 D2 N( b3 D
复制代码
4 c5 z, A Y3 s, O5 n! Y元件就是其他文件定义好的模块,比如元件component TWICtl,就是其他文件的模块,这里只是调用4 X- _ V H) i, m+ k$ l }
1 W5 O- h+ I2 x u复制代码
7 ?% R4 ^" ]6 N4 J& \component TWICtl, i: }, J& F2 J4 C5 |
generic
/ u: g2 _+ I7 G8 @9 O( Y! ?* J (( U S+ t* W0 y" k& Z, z
CLOCKFREQ : natural := 50; -- input CLK frequency in MHz
5 V" |7 _0 I8 R- n5 c; n2 _, g# A ATTEMPT_SLAVE_UNBLOCK : boolean := false --setting this true will attempt) k5 A, U- I/ P; q3 x) |& ?' G
--to drive a few clock pulses for a slave to allow to finish a previous0 W3 s9 f& F6 @6 a k6 q
--interrupted read transfer, otherwise the bus might remain locked up - Z5 f6 B3 w) _- G; N! R5 W3 |2 t. S6 S. i
);1 p/ B3 L( `) ~ \2 k. X
port (
, N( Q. U8 a& h MSG_I : in STD_LOGIC; --new message
+ P$ K% l# U3 D" t- j1 y) R7 y STB_I : in STD_LOGIC; --strobe
. P/ z; w* U0 [* Y8 y$ P A_I : in STD_LOGIC_VECTOR (7 downto 0); --address input bus
: z' G) B" Z; v; b D_I : in STD_LOGIC_VECTOR (7 downto 0); --data input bus
& l1 M' Q" p6 f9 U7 m( O5 f D_O : out STD_LOGIC_VECTOR (7 downto 0); --data output bus
* ~" D' W, m) o" u* X4 j) E4 P5 S7 U DONE_O : out STD_LOGIC; --done status signal; D9 R* h% }) k- F# e, N( `# _
ERR_O : out STD_LOGIC; --error status* l' @. m( G% M
ERRTYPE_O : out error_type; --error type
5 {3 Y# G% F: B# M CLK : in std_logic;
* Q, {; O) j; ?) @ SRST : in std_logic;* w4 t& g2 E7 b7 s+ Y% Q5 y) T. S
----------------------------------------------------------------------------------* R: s6 q6 {3 `) i% r7 n
-- TWI bus signals
J- v- ~# E/ K( W& v. z- c4 ?: Z----------------------------------------------------------------------------------
" Y, A* M. ^: y- O4 h1 v SDA : inout std_logic; --TWI SDA' ?& \$ f* L' Z/ z3 u9 `
SCL : inout std_logic --TWI SCL( h! o+ V$ e0 r
);
& z$ u" D, n, ^. Jend component;
$ \: H1 N f% v: `1 N$ h! F复制代码0 x4 a1 x2 s5 Z1 q5 A
调用的模块需要初始化一个实例1 i+ ]/ N% w/ G R* ?6 y
1 y7 x" j( s) C+ k复制代码' v* X; ?4 b; n# `4 L+ t* H1 Q; s1 ~
Inst_TWICtl : TWICtl
; M' M- q- l1 H9 m3 f7 t' C generic map (
) N4 N# y) d6 i4 V; h3 t ATTEMPT_SLAVE_UNBLOCK => true,
: Y- \& o% z3 F6 H) m Z CLOCKFREQ => 1008 r" x) |; T" r: A
)4 V5 S% k* L$ O$ a9 {3 x, i
port map (2 }. |8 G6 ?5 m: v
MSG_I => twiMsg,
5 A6 Z- F2 ~" x STB_I => twiStb,1 x7 N8 r6 R" ~: T: _
A_I => twiAddr,
5 e; D. }# [2 z2 `* e) B D_I => twiDi,
6 X+ `. T% i, N0 {; E; W0 e D_O => twiDo,( K0 Y! L* A) E. I5 o* P+ p
DONE_O => twiDone,; D9 J8 w1 w/ j; \& B
ERR_O => twiErr,
: [ v/ M8 e$ v( G/ ^( l8 s ERRTYPE_O => open,
; S; N& J2 D+ f CLK => CLK_I,
8 o7 z _: b( L/ ]( N1 L SRST => SRST_I,
' s0 y6 m8 {# M; e) O/ P& O' A SDA => TMP_SDA,
& |8 b. O0 X- p7 B. A" S' ? SCL => TMP_SCL
. s9 E' s, t9 V$ a9 z ); j- U: P. X/ `" ?! F# R- t
复制代码
* ?' e+ @9 U4 [; H6. 配置(CONFIGURATION):一个实体可以有多个构造体,可以通过配置来为实体选择其中一个构造体
/ z- f. C. ~0 p$ I' L5 X8 I4 a1 P% P- b- K0 G. U
7. VHDL的注释用的是--,如下& q+ B! s i: J, m* j V
) x3 F: @2 x$ P8 x% p-- Uncomment the following library declaration if using6 n6 b$ Y4 {: T) V8 [
8. constant常量,全局变量,在结构体描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用,在设计中描述某一规定类型的特定值不变,如利用它可设计不同模值的计数器,模值存于一常量中,对不同的设计,改变模值仅需改变此常量即可,就如上一章所说的参数化元件。 定义格式: CONSTANT 常数名:数据类型:=表达式;
0 \" u1 T5 d% h0 S* _" i' ]' p- M+ _/ v
constant ADT7420_ADDR : std_logic_vector(7 downto 1) := "1001011"; -- TWI Slave Address
/ J/ r s3 }4 n5 h6 F2 g- R constant ADT7420_RID : std_logic_vector(7 downto 0) := x"0B"; -- ID Register Address for the ADT74207 ]: W1 a9 M. f1 J( Z, V% ?* ]
constant ADT7420_RRESET : std_logic_vector(7 downto 0) := x"2F"; -- Software Reset Register8 D {7 {* f& r% q1 _# G! a1 [% @2 ?- {
constant ADT7420_RTEMP : std_logic_vector(7 downto 0) := x"00"; -- Temperature Read MSB Address
: V- V8 J6 ?+ _/ f4 w constant ADT7420_ID : std_logic_vector(7 downto 0) := x"CB"; -- ADT7420 Manufacturer ID7 w% J, p8 k! V5 i% h7 u
9. 条件判断的写法
# ?" T% ^4 g, w4 B. t- c% W5 `) {, b) W. [ b/ ~
TEMP_O <= tempReg(15 downto 3);# m- {4 J% v+ k5 O- E3 P
RDY_O <= '1' when fReady else1 K5 p Y$ {0 V: Z& n0 O$ h, n2 g" x$ y
'0';3 L) Z7 Z! a7 \2 d! J/ B
ERR_O <= '1' when state = stError else
& {( I0 i0 {- c! R: G' { '0';
. V! m4 T( ^- x" L* K2 j N10. 信号的写法9 @0 F5 _4 a J
% [+ r3 {. m* y7 s5 g* p2 c
signal initWord: std_logic_vector (DATA_WIDTH-1 downto 0);! R) Q; I9 b: b8 h
signal initA : natural range 0 to NO_OF_INIT_VECTORS := 0; --init vector index6 x3 s& ]& `) N! @7 T8 H3 w
signal initEn : std_logic;+ F! |, g" h3 o5 j; Q* ^
11. 数据类型定义,用户自定义的数据类型 有四种,分别是枚举类型、整数类型和实数类型、数组类型、记录类型 枚举类型: TYPE 数据类型名 IS (枚举文字,枚举文字,. . . .)' n8 c _1 D7 `1 o! ]
: Y" D4 I/ N! Y5 |- R- F! _& V
复制代码
3 o& i+ \) l* F type state_type is (* [' N" K( W0 Q. x
stIdle, -- Idle State6 f# Z* s& r- q( f: m( H( E
stInitReg, -- Send register address from the init vector
- m$ N2 y6 u) \3 d! v1 u& } I7 t6 J s stInitData, -- Send data byte from the init vector9 R' K4 \% l- ~% o
stRetry, -- Retry state reached when there is a bus error, will retry RETRY_COUNT times3 [1 l# ?" |4 k; C- y( s: w
stReadTempR, -- Send temperature register address
& o$ j! L! V( D stReadTempD1, -- Read temperature MSB
% v1 w5 l, Z/ K: j stReadTempD2, -- Read temperature LSB
" p: w; l) T5 |/ _0 h: `% o1 C3 J stError -- Error state when reached when there is a bus error after a successful init; stays here until reset5 y8 i& ]" _4 ?; Q1 v
); , O$ K8 E" p1 T+ Y
复制代码
% |# |# Y8 G4 u1 _2 r12. 怎么把实体的信号和元件(COMPONENT)的信号连接起来,定义一个元件(COMPONENT)的实例化对象,用信号(signal)连接起来,其实在实体定义的port也是信号 |
- E. A: W, b2 ^ G" m |
|