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

VHDL入门学习-程序组成

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    VHDL入门学习-程序组成
    6 ~7 `3 N) B* b0 ]; `9 M) C0 a

    8 l" ~" ], f& K3 L' N5 j
    1. 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

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-8 12:05 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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