打印

VHDL语言简单的教程

[复制链接]
楼主: GoldSunMonkey
手机看帖
扫描二维码
随时随地手机跟帖
21
猴大作家

使用特权

评论回复
22
opple| | 2011-12-10 14:51 | 只看该作者
:lol

使用特权

评论回复
23
GoldSunMonkey|  楼主 | 2011-12-11 13:05 | 只看该作者
猴版真是了不起呢
hihu 发表于 2011-12-10 14:48

谢谢啦

使用特权

评论回复
24
GoldSunMonkey|  楼主 | 2011-12-11 13:06 | 只看该作者
猴大作家
opple 发表于 2011-12-10 14:51

你们天天捧我~~

使用特权

评论回复
25
GoldSunMonkey|  楼主 | 2011-12-11 13:06 | 只看该作者
:lol
opple 发表于 2011-12-10 14:51

谢谢了啊。

使用特权

评论回复
26
GoldSunMonkey|  楼主 | 2011-12-11 13:24 | 只看该作者
用户定义区

LIBRARY IEEE;  ——IEEE 标准库;

USE IEEE.STD_LOGIC_1164.ALL;
                               ——所有逻辑运算库;
USE IEEE.STD_LOGIC_ARITH.ALL;
                               ——所有数值运算操作;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
                    ——所有不带符号的整数运算;

使用特权

评论回复
27
GoldSunMonkey|  楼主 | 2011-12-11 13:25 | 只看该作者
本帖最后由 GoldSunMonkey 于 2011-12-11 13:27 编辑


逻辑运算符:

NOT(取反)、AND(与)、OR(或)、NAND(与非)、NOR(或非)和XOR(异或),可对  “STD_LOGIC”和“BIT”等逻辑数据、“STD_LOGIC_VECTOR”逻辑型数组及布尔型数据执行逻辑
运算。运算符的左边和右边的数据类型必须一致。

使用特权

评论回复
28
GoldSunMonkey|  楼主 | 2011-12-11 13:26 | 只看该作者
实体说明 (Entity Declaration)
entity <ENTITY_NAME> is
        port ( <SIGNAL_NAME_l>, <SIGNAL_NAME_2>:  <mode> <type_l>;
             <SIGNAL_NAME_3>, <SIGNAL_NAME_4>: <mode> <type_2>);
        end <ENTITY_NAME>;

使用特权

评论回复
29
GoldSunMonkey|  楼主 | 2011-12-11 13:38 | 只看该作者

一个完整的实体说明例子
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY my_design IS
PORT (
        d: IN  std_logic_vector(11 DOWNTO 0);
        oe, clk: IN          std_logic;
        ad: INOUT  std_logic_vector(11 DOWNTO 0);
        a: OUT          std_logic_vector(11 DOWNTO 0);
        int:        OUT   std_logic;
        as:        BUFFER std_logic);
END my_design;

使用特权

评论回复
30
GoldSunMonkey|  楼主 | 2011-12-11 13:38 | 只看该作者
VHDL的数据类型定义非常严格,规定每一个对象都必须有明确的数据类型。不同类 型之间的数据不可直接代
入,连接不同数据类型的信号为非法。可以赋予一个值的对象具有一个类型,而且只能够具有该类型的值。但可
以执行转换指令实行数据类型之间的转换。

使用特权

评论回复
31
GoldSunMonkey|  楼主 | 2011-12-11 13:39 | 只看该作者
标准数据类型:
        bit, bit_vector, std_ulogic, std_logic,
        std_logic_vector, boolean, integer, etc.
复合数据类型:
        Array,record,sub_type,new type
位类型(BIT) :其值只能为 ‘0’或 '1‘。
位矢量类型(BIT_VECTOR) :包含一组位类型。
布尔类型(BOOLEAN):其值可为 ‘TRUE’或‘FALSE’。
标准逻辑位数据类型(STD_LOGIC):

常用数据类型
整数(Integer)——VHDL的算术运算符均定义范围为32位的整数。
实数(Real)——       type REAL is Range -1.7E38 to 1.7E38
位(B和位矢量(Bit_Vector)——位和位矢量类型的通用性强。位只能取值0或1,其值放在单引号中;位
矢量为双引号括的一组位数据,一般表示总线的状态,如:“001100”。
布尔(Boolean)——布尔数据类型经常用于逻辑关系运算中,其取值只有TRUE或FALSE。
字符(CHARACTER)——当对一个变量执行字符赋值操作时,应先声明后赋值。
     Variable    C:    Character;
                        C:= 'A';

使用特权

评论回复
32
GoldSunMonkey|  楼主 | 2011-12-11 13:41 | 只看该作者
记录(RECORD):记录属复合类型,记录类型的格式如下:
        TYPE  记录名  IS  RECORD
      ---记录中元素的类型说明;
END  RECORD。一个具体的实例如下:
TYPE  month_name(Jan, Feb, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
TYPE  date  IS  RECORD
   day   : integer  range  0  to  31;
   month : month_name;
   year  : Integer  range  0  to  3000;
END  RECORD;
数组(ARRAY)
        数组用于定义同一类型值的集合。数组可以是一维的(有一个下标),也可以是多维的(有多个下标)。具体格式如下:
TYPE  数据类型名  IS  ARRAY  范围  OF  原数据类型;
举例如下:
TYPE  word  IS  ARRAY (1  TO  8)  OF   STD_LOGIC;
枚举类型:用户定义的数据类型 例:        TYPE traffic_light IS (red, yellow,green )                 TYPE int IS RANGE 0 TO 100
子类型
    所谓子类型是用户对定义的数据类型作一些范围限制而形成的一种新的数据类型。一般格式为:
SUBTYPE  子类型名  IS  数据类型名 [范围];

使用特权

评论回复
33
GoldSunMonkey|  楼主 | 2011-12-11 13:42 | 只看该作者
本帖最后由 GoldSunMonkey 于 2011-12-11 13:44 编辑

对象类别            含    义                           说  明  场  合
信  号            信号说明全局量           Architecture, package, entity
变  量            变量说明局部量           Process, function, procedure
常  数            常数说明全局量           上面两种场合下,均可存在

使用特权

评论回复
34
GoldSunMonkey|  楼主 | 2011-12-11 13:46 | 只看该作者
含义                        信号                                              变量
赋值符号               <=                                             :=
功能                 电路的内部连接                           内部数据交换
作用范围         全局,进程和进程之间的通信         进程的内部
行为           延迟一定时间后才赋值                  立即赋值

使用特权

评论回复
35
GoldSunMonkey|  楼主 | 2011-12-11 13:47 | 只看该作者
算术运算符
在IEEE库的程序包std_logic_arith中包含如下算术和比较运算操作:
      +:  (加)。   -:  (减)。   *:  (乘)。  /: ( 除)。  MOD:(求模)。
     REM:(取余)。        +: (正)。         -:( 负)。       **:  (指数)。
     ABS:(取绝对值)。
      关系运算符
       =:(等于)。   /=:(不等于)。  <:(小于)。  <=:(小于等于)。
      >=:(大于等于)。
     连接运算符
       连接运算符&用于位的连接。用于一维数组时,右边的内容接在左边之后形成一个新的数组。
例如:a和b都是具有两位长度的位矢量,用连接符号连接后:
    y  <=  a  &  b;则  y(3)为a(1),y(0)为b(0)。

使用特权

评论回复
36
GoldSunMonkey|  楼主 | 2011-12-11 13:47 | 只看该作者
结构定义是具体指明一个基本设计单元实体的行为、元件及内部连接关系,也就是说定义了设计单元具体
的功能。结构定义一定跟在所描述的实体之后,结构的标准语法格式为:
architecture arch_name of entity_name is
[ type   定义]
[signal 定义]
begin --描述此电路的内部配置与功能
[常数定义]
[结构定义]--并行语句
end  arch_name;

使用特权

评论回复
37
GoldSunMonkey|  楼主 | 2011-12-11 13:48 | 只看该作者

使用特权

评论回复
38
GoldSunMonkey|  楼主 | 2011-12-11 13:49 | 只看该作者
所有的并行语句独立存在,不能使用在process语句中,其出现的先后顺序并不影响结构的行为,通常表示一种数据流(Dataflow)。
1.  when_else(多输入条件,单输出语句)
以优先权编码电路(Priority encoder)为例:
    J<=W  when  a='1'  else
          X  when   b='1'  else
          Y  when   c='1'  else
          Z  when    d='1'  else
         '0'
            也就是a='1'为第一优先,只要a='1'出现,不管其他的信号如何,J输出绝对等于w输入。

使用特权

评论回复
39
GoldSunMonkey|  楼主 | 2011-12-11 13:50 | 只看该作者
with a select
X<= ”10000000" when 7,
         ”01000000" when 6,
         ”00100000" when 5,
         ”00010000" when 4,
         ”00001000" when 3,
         ”00000100" when 2,
         ”00000010" when 1,
         ”00000001" when 0,
         "00000000" when others;

这种语法因为限定状态,所以当状态冲突时,就会进入others,使输出结果为"00000000",而不会有优先权
的编码效果。

使用特权

评论回复
40
GoldSunMonkey|  楼主 | 2011-12-11 13:51 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则