找回密码
 注册
关于网站域名变更的通知
查看: 368|回复: 1
打印 上一主题 下一主题

VHDL入门学习-程序组成

[复制链接]
  • TA的每日心情
    开心
    2019-11-20 15:00
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2019-3-11 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    VHDL入门学习-程序组成

    4 i5 h* S9 v& t, o  ]) J' s
    * ^' i. ?" G: [3 ]8 m$ f( I# S
    1. 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

    该用户从未签到

    2#
    发表于 2019-3-11 14:55 | 只看该作者
    最近正在找这方面的资料 谢谢楼主分享
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-28 19:43 , Processed in 0.140625 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表