TA的每日心情 | 开心 2019-11-20 15:00 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
VHDL入门学习-程序组成
4 i5 h* S9 v& t, o ]) J' s
* ^' i. ?" G: [3 ]8 m$ f( I# S1. VHDL程序的组成 一个完整的VHDL程序是以下五部分组成的:
% N( W, z! m, B5 t; Q: s% y0 a" R, M9 P
2. 库(LIBRARY):比较好理解,调用系统已有的库,WORK库就是用户当前编辑文件所在的文件夹, IEEE库:由IEEE(美国电子电机工程师学会)制定的标准库 LPM库
5 [/ X S) w8 r0 [
% M) @) s8 ?, M! T4 R2 Wlibrary IEEE;3 X4 R3 p$ y; s% n) F
use IEEE.STD_LOGIC_1164.ALL;
4 u+ N, Y& D8 V7 t! I: |1 Xuse IEEE.math_real.all;1 v& b& c! S. ~
use IEEE.std_logic_arith.all;
+ p$ y7 [$ ]9 v- R4 p4 H3. 程序包(PACKAGE):声明在设计中将用到的常数、数据类型、元件及子程序
% o5 h: V/ }( i2 X* \% Z' {! T5 T$ t9 J4 f" ^; V/ F
4. 实体(ENTITY):声明本设计的接口引脚,输入输出引脚,写法一般是引脚名字:接口方向:标准逻辑
6 e, a6 p$ h& N8 o: U# _3 W3 n' C0 O* L/ l6 y' ?/ ?) F* ]
复制代码
2 K+ P0 e& j: I+ Rentity TempSensorCtl is
+ ]# e7 R, T2 ^6 a6 ]. r3 g( J0 y Generic (CLOCKFREQ : natural := 100); -- input CLK frequency in MHz
# v4 n2 k2 T$ T ?1 J( e Port (
* T5 B& d1 T; H8 ~ TMP_SCL : inout STD_LOGIC;7 m* D0 N, ~3 a- o+ [: J
TMP_SDA : inout STD_LOGIC;
, G8 i* f4 A' j8 [/ @+ z. I-- TMP_INT : in STD_LOGIC; -- Interrupt line from the ADT7420, not used in this project" B& |0 r$ I* L- Q
-- TMP_CT : in STD_LOGIC; -- Critical Temperature interrupt line from ADT7420, not used in this project, [- D# [5 O6 j+ Y4 J
& X3 V9 h6 \( V" Y! T# j
TEMP_O : out STD_LOGIC_VECTOR(12 downto 0); --12-bit two's complement temperature with sign bit
5 g+ O( q" p1 c' k) i. N" x RDY_O : out STD_LOGIC; --'1' when there is a valid temperature reading on TEMP_O% t( P( ~) P, ]
ERR_O : out STD_LOGIC; --'1' if communication error7 x3 _9 U& ~) B/ Q. X) v+ H8 c
1 P2 G( M8 X9 n) [' e9 x5 P
CLK_I : in STD_LOGIC;$ s5 s/ u5 s T7 o7 A# Z6 X9 x
SRST_I : in STD_LOGIC
, p) n; _8 G1 d );8 E% Z1 l! e0 t2 I& o$ P* Z
复制代码! ^$ W8 r% Q( d# X
实体类似于原理图中的一个部件符号,它并不描述设计的具体功能,只是定义所需的全部输入/输出信号。实体格式如下:
1 M5 [/ v3 r- D4 n! w& l, U( a" r# o, I9 X
复制代码
9 {" a, B% z+ O+ r+ i/ x9 a7 ?ENTITY 实体名 IS [
. ^; \3 A0 t5 k: v- YGENERIC(常数名:数据类型[:设定值])] 类属说明
3 C& T ]8 t5 IPORT
- _ i2 q% R1 U! f, L2 D/ u端口说明 (
( V& t' |( Q9 H r$ d. m) S' C端口信号名1: 模式 类型;% z. d' y! u$ n9 |# g
端口信号名2: 模式 类型;3 _; B/ c- [1 ?' m; V
端口信号名3: 模式 类型;; [( H% {' D; w8 S
端口信号名4: 模式 类型);9 H" l# a: E; Y! M1 b
TYPE语句或常量定义
; }0 y( B% k, {0 d4 e( _实体申明 并行语句 - y( ?! Q6 b2 ^/ b& X' Q- ^
实体语句 END 实体名;
9 y) [) x2 }9 z5 p: N' j7 I$ j复制代码
+ F: m, Z- L; W. _9 g5 o/ t" h; z1 x1 |) U) D( ^) Y0 j
* |# r9 B; v# h4 B. ]
端口信号名:端口信号名在实体之中必须是唯一的,信号名应是合法的标识符 端口模式:分别有IN、OUT、INOUT、BUFFER和LINKAGE,这五种类型在后面的章节将介绍到。
% E( f/ ]6 t6 K ~/ a5 h; i8 T4 b M& y3 k" D7 s& f: `; n$ m) E
端口类型:常用的有INTEGER、STD_LOGIC、STD_LOGIC_VECTOR,有待后面章节介绍。
( G% c6 [" G) c- Z% V4 E" m' n- `' M$ W# x# Z$ D& ?# ^, M
5. 构造体(ARCHITECTUR):定义实体的实现,电路的具体描述,结构体 所有能被仿真的实体都由结构体(ARCHITECTURE)描述,即结构体描述实体的结构或行为,一个实体可以有多个结构体,每个结构体分别代表该实体功能的不同实现方案。结构体的任务是:定义结构体中的各项内部使用元素,如数据类型(TYPE),常数(CONSTAND),信号(SIGNAL),元件(COMPONENT),过程(POCEDURE),变量(VARIABLE)和进程(PROCESS)等。通过VHDL语句描述实体所要求的具体行为和逻辑功能。描述各元件之间的连接。" e+ w) ^5 m* Y
, v& [, b; `) l3 C6 v" Q
复制代码
: Q/ O) }& K5 l, c, e/ `- Grchitecture Behavioral of TempSensorCtl is
0 ]& Y8 T% v8 x5 j
& g0 {7 ~7 C1 o' @-- TWI Controller component declaration9 Z% F" `7 r' n0 e& h) ~: f
component TWICtl+ P# N: X- f* C* m
generic * n% t) ~2 `4 j6 T; b
//中间省略' u. T3 u! y; f; l4 u
end Behavioral;5 s! U/ ?5 x7 Z9 [8 I" L
复制代码
5 y# w* Y5 W' N# p6 R, \元件就是其他文件定义好的模块,比如元件component TWICtl,就是其他文件的模块,这里只是调用
9 M6 F( K7 j& x! b
+ {- ~9 J4 D1 ]' K) @. v& X( Q0 Y/ G) I复制代码4 Y% A- m) k/ s* G$ d/ L Y# {: m
component TWICtl3 F' ]! T, s7 a1 P: o: h
generic $ }( R' k4 A0 n
(
) G- T% D* t$ Q7 b CLOCKFREQ : natural := 50; -- input CLK frequency in MHz
5 U5 L# q+ b& Y# T! @0 C# | ATTEMPT_SLAVE_UNBLOCK : boolean := false --setting this true will attempt
8 Z9 s9 v3 c7 A' r0 G; o$ v/ D1 H --to drive a few clock pulses for a slave to allow to finish a previous2 R- ~5 q4 [/ n0 o/ g
--interrupted read transfer, otherwise the bus might remain locked up
& E" e! {' o5 G# H& r8 X );" }2 Q2 `8 p2 v- d' `
port (
* o8 k2 |: `- @5 k MSG_I : in STD_LOGIC; --new message
0 I6 t# W) G* w; S9 Q. l STB_I : in STD_LOGIC; --strobe
" j, f( ^: L2 f. D9 w+ q; b/ Q A_I : in STD_LOGIC_VECTOR (7 downto 0); --address input bus
/ Q/ D, H8 ]* d4 s/ Z! B D_I : in STD_LOGIC_VECTOR (7 downto 0); --data input bus
1 b; a/ p c, t) K2 K r) s D_O : out STD_LOGIC_VECTOR (7 downto 0); --data output bus
3 u- S! L. M! m DONE_O : out STD_LOGIC; --done status signal7 e2 d# @4 a; H9 p2 P6 L
ERR_O : out STD_LOGIC; --error status
; z5 H% ]# K- q& D# P u7 P ERRTYPE_O : out error_type; --error type
$ `; r6 D9 `# ]- _ CLK : in std_logic;1 f: A) m1 _4 Q# x, j
SRST : in std_logic;; j8 X& s: }/ g3 @% x2 v: h
----------------------------------------------------------------------------------* ~+ ]9 O8 O9 J: o# N) s
-- TWI bus signals% a( U B3 O. g" \6 x# S
----------------------------------------------------------------------------------
5 S9 l1 w, c5 `0 Y( D5 W, P SDA : inout std_logic; --TWI SDA
5 U/ t! L C5 e SCL : inout std_logic --TWI SCL
7 y" D @' c0 K5 J8 V );
9 y% K4 a6 M4 A! R: w# U8 Send component;
3 Z+ S, w u. z2 Q. |复制代码
' \! P! \# m1 g% F4 j: G0 a调用的模块需要初始化一个实例
H) U/ _1 [* h- @# X& W$ Q! A& D
/ a( S9 }! e& P复制代码5 _* Z* _/ x1 a1 ]( c4 f8 z
Inst_TWICtl : TWICtl! r6 I2 Y2 W. E( F! U+ ]& U
generic map (( V$ j; s8 O6 x& V/ L
ATTEMPT_SLAVE_UNBLOCK => true,
1 N; C7 c4 d0 z2 ^2 S" l. @: X CLOCKFREQ => 100
8 }$ o9 @$ `, _( L6 p, T )
. D8 N, n+ K# h+ Y+ Q/ H port map (
# p0 i( U _4 U3 E. Y3 c MSG_I => twiMsg,
' _1 Q7 W- V/ w+ j STB_I => twiStb,
% E) {) P: [$ L$ u6 }) J3 j A_I => twiAddr,, Q" L$ d$ p; {( B" m+ O
D_I => twiDi,
7 B$ M: N0 S; T# ]1 b. ~9 w D_O => twiDo,
& T8 ^: A* x# a6 r, r DONE_O => twiDone,
$ y v% T+ `& N7 t; v- p ERR_O => twiErr,
4 P. N9 D3 r4 P1 }* H ERRTYPE_O => open,
# @- `1 `! z, a2 t# z/ u% q0 c CLK => CLK_I,
) \# b' F5 S# k# g; ~: i SRST => SRST_I,
& y/ e( `! Q7 f! ~5 e+ ] SDA => TMP_SDA,
" S1 W+ u! n( D4 c SCL => TMP_SCL
, ]3 Q0 }( W7 o9 U; N9 x! T/ {6 K );
$ ]0 K+ N3 C4 N7 O9 l- q! @复制代码0 r1 a) X; x( t$ P6 \
6. 配置(CONFIGURATION):一个实体可以有多个构造体,可以通过配置来为实体选择其中一个构造体
$ F7 z: l1 Y2 @, r! L: G8 i% K# h; E. e* d0 R9 Z6 L
7. VHDL的注释用的是--,如下
$ R' o, ~8 m; H4 z( g# ]7 ?
4 b9 X( X7 m9 Q3 H o9 b4 E-- Uncomment the following library declaration if using ?1 f* E# I* o
8. constant常量,全局变量,在结构体描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用,在设计中描述某一规定类型的特定值不变,如利用它可设计不同模值的计数器,模值存于一常量中,对不同的设计,改变模值仅需改变此常量即可,就如上一章所说的参数化元件。 定义格式: CONSTANT 常数名:数据类型:=表达式;9 K2 }3 d% I, f( S/ \: A
( _0 c: ^; L+ E8 |
constant ADT7420_ADDR : std_logic_vector(7 downto 1) := "1001011"; -- TWI Slave Address
$ g; t9 I$ o5 x constant ADT7420_RID : std_logic_vector(7 downto 0) := x"0B"; -- ID Register Address for the ADT7420, q7 j# _3 E$ h5 r. H
constant ADT7420_RRESET : std_logic_vector(7 downto 0) := x"2F"; -- Software Reset Register
" R" M6 r2 o% G0 E, @: Q) x1 p7 Q! D constant ADT7420_RTEMP : std_logic_vector(7 downto 0) := x"00"; -- Temperature Read MSB Address
3 q2 M R- ^9 Z constant ADT7420_ID : std_logic_vector(7 downto 0) := x"CB"; -- ADT7420 Manufacturer ID
) O5 V, Z% N9 q: B9. 条件判断的写法0 r( f( _0 N6 f3 H- V% W. R
k. I, G# P( v" G! O* Y* y
TEMP_O <= tempReg(15 downto 3);& \. C# V" v7 ]4 M' F+ V
RDY_O <= '1' when fReady else
- }) c6 s6 [$ R2 @ '0';# ~+ J, E6 e1 J3 U4 G; k
ERR_O <= '1' when state = stError else
r" c; ^4 j2 c' A' G '0';
" o8 U: z- |) d4 B0 p10. 信号的写法; }$ }7 T5 P: @/ r$ g: H
0 P! m" b2 B: `: L; e
signal initWord: std_logic_vector (DATA_WIDTH-1 downto 0);
0 p3 g* C# k; G+ L* y6 p signal initA : natural range 0 to NO_OF_INIT_VECTORS := 0; --init vector index
8 t+ x' n W5 z) T8 h signal initEn : std_logic;- C% Q1 j) k# x: K$ q m
11. 数据类型定义,用户自定义的数据类型 有四种,分别是枚举类型、整数类型和实数类型、数组类型、记录类型 枚举类型: TYPE 数据类型名 IS (枚举文字,枚举文字,. . . .)
. D' B( b' M; Y: U7 p# M
: A3 B' t1 p0 D, `6 ~复制代码( h1 J2 }( s' j! V- N4 P; H
type state_type is (/ S0 [- w! P! h/ B* a" _
stIdle, -- Idle State
- m5 D! _" i3 g8 i! w( K+ C$ H5 J stInitReg, -- Send register address from the init vector$ T: c, \8 @, h8 I, U
stInitData, -- Send data byte from the init vector
' ?! R7 L4 K2 C stRetry, -- Retry state reached when there is a bus error, will retry RETRY_COUNT times
# L |" a a/ `/ l stReadTempR, -- Send temperature register address
3 F1 y# Y8 b7 r9 W! C stReadTempD1, -- Read temperature MSB( b- V l! d, _$ E( s8 q7 s3 S& _) N
stReadTempD2, -- Read temperature LSB
2 s. ^+ w4 M9 G/ d3 g8 u; H) p/ s( y stError -- Error state when reached when there is a bus error after a successful init; stays here until reset: f) `% B6 ?8 ]
);
7 _5 C! H( n) N& Z- F2 j$ F复制代码
' S2 M6 w' l# I6 O4 I- p! g12. 怎么把实体的信号和元件(COMPONENT)的信号连接起来,定义一个元件(COMPONENT)的实例化对象,用信号(signal)连接起来,其实在实体定义的port也是信号 | ( L1 _+ n% S6 e
|
|