vhdl array用法
VHDL语言数据类型及相互转换

标准数据类型1,整数(INTEGER)范围:-462,实数(REAL)范围: (综合器不支持)书写时一定要有小数.3,位(BIT)在数字系统中,信号经常用位值表示,位值用带单引号'1'和'0'来表示标准数据类型4,位矢量(BIT_VECTOR)位矢量是用双引号括起来一组位数据"010101"5,布尔量(BOOLEAN)只有"真"和"假"两个状态,可以进行关系运算6,字符(CHARACTER)字符量通常用单引号括起来,对大小写敏感明确说明1是字符时: CHARACTER'('1')标准数据类型7,字符串(STRING)字符串是双引号括起来由字母,数字或@,%,$组成一串字符.区分大小写"laksdklakld" "10"8,时间(TIME)时间单位:fs,ps,ns,ms,sec,min,hr例: 10 ns整数数值和单位之间应有空格标准数据类型9,错误等级(SEVERITY LEVEL)在VHDL仿真器中,错误等级用来表示系统状态,它共有4种:NOTE(注意)WARNING(警告)ERROR(错误)FAILURE(失败)标准数据类型10,自然数(NATURAL) 正整数(POSITIVE)自然数是整数一个子类型,包括0和正整数;正整数也是整数一个子类型.只能是正整数数据除定义类型外,有时还需要定义约束范围.INTEGER RANGE 100 DOWNTO 0BIT_ VECTOR (3 DOWNTO 0)REAL RANGE TOIEEE定义的逻辑位与矢量在IEEE程序包std_logic_1164中定义了两个非常重要数据类型:1 ,std_logic取值:0,1,Z,X,W,L,HZ:高阻 X:不定 W:弱信号不定L:弱信号0 H:弱信号12,Std_logic_vector注意1,在使用"std_logic"和"std_logic_vector"时,在程序中必须声明库及程序包说明语句,即LIBRARY ieee和这两句在程序中必不可少.2, std_logic有多个取值,与BIT不同,在编程时应特别注意,需要考虑全所有情况.用户自定义的数据类型1,枚举类型格式:TYPE 数据类型名 IS(元素,元素,…);TYPE STD_LOGIC IS('U','X','0','1','Z','W','L','H','-');TYPE week IS (Sun,Mon,Tue,wed,Thu,Fri,Sat);TYPE color IS (red,green,yellow,blue)TYPE lift_state IS(stopon1,doorpeen,doorclose, doorwait1, doorwait2, doorwait3, doorwait4, doorwait5,up,down,stop)枚举类型声明TYPE color IS (red,green,yellow,blue);VARIABLE A:COLOR;SIGNAL B:COLOR;A:=RED;B<=YELLOW;TYPE lever IS ('0','1','z');SIGNAL V:lever;V<='1';用户自定义数据类型2,整数(INTEGER)格式:TYPE 数据类型名 IS 数据类型定义约束范围例 TYPE digit IS INTEGER RANGE 0 TO 9VARIABLE A:DIGIT;A:=5;A:=28;用户自定义数据类型3,实数(REAL)格式:TYPE 数据类型名 IS 数据类型定义约束范围TYPE current IS REAL RANGE -1E4 TO 1E4VARIABLE A:CURRENT;A:=1E3;A:=1E10;用户自定义数据类型4,数组(ARRAY)格式:TYPE 数据类型名 IS ARRAY 范围 OF 原数据类型名; 例:TYPE word IS ARRAY (1 TO 8) OF STD_LOGIC;TYPE word IS ARRAY (INTEGER 1 TO 8) OF STD_LOGIC; 数组常在总线,ROM和RAM中使用.用户自定义数据类型5,记录(RECODE) 类型将不同数据类型放在一块,就是记录类型数据格式:TYPE 记录类型名 IS RECORD元素名:数据类型名;元素名:数据类型名;::END RECORD[记录类型名];记录(RECODE) 类型例:TYPE bank IS RECORDaddr0: STD_LOGIC_VECTOR(7 DOWNTO 0);addr1: STD_LOGIC_VECTOR(7 DOWNTO 0);r0: INTEGER;END RECORD;记录(RECODE) 类型例:CONSTANT LEN:integer:=100;TYPE array logic IS ARRAY (99 downto 0)OF STD_LOGIC_VECTOR(7 DOWNTO 0) TYPE table IS RECORDa: array logic;b: STD_LOGIC_VECTOR(7 DOWNTO 0);c: integer RANGE 0 to len ;END RECORD;数据类型的转换数据类型转换函数有VHDL语言包提供例如:STD_LOGIC_1164,STD_LOGIC_ARITHSTD_LOGIC_UNSIGNED等等函数说明1、STD_LOGIC_1164包TO_STDLOGIC_VECTOR(A)TO_BITVECTOR(A)TO_LOGIC(A)TO_BIT(A)由BIT_VECTOR转换成STD_LOGIC_VECTOR由STD_LOGIC_VECTOR转换成BIT_VECTOR由BIT转换成STD_LOGIC由STD_LOGIC转换成BIT2、STD_LOGIC_ARITH包CONV_STD_LOGIC_VECTOR(A,位长)CONV_INTEGER(A)由INTEGER,UNSIGNED和SIGNED转换成STD_LOGIC_VECTOR由UNSIGNED和SIGNED转换成INTEGER3、STD_LOGIC_UNSIGNED包CONV_INTEGER(A)_STD_LOGIC_VECTOR转换成INTEGERVHDL属性VHDL没有一般程序语言中那些运算类标准函数,取而代之是多种能反映和影响硬件行为属性.属性在描述时序电路VHDL设计文件中几乎处处可见,如检测上升沿,下降沿,知道前一次发生事件.VHDL属性属性指是关于实体,结构体,类型及信号一些特征.有属性对综合(设计)非常有用. VHDL属性可分为数值类属性,函数类属性,范围类属性,信号类属性,类型类属性.其引用一般形式为:对象'属性.数值类属性数值类属性用于返回数组,块或一般数据有关值,如边界,数组长度等信息.对一般数据有4种数值类属性:对象类型左边界,右边界,上边界,下边界,对应关键字是:LEFT,RIGHT,HIGH,LOW.数组在加一个长度属性LENGTH.数值类属性sdown:IN std_logic_vector(8 DOWNTO 0);sup:IN std_logic-vector(0 to 8);这两个信号各属性值如下:sdown'left=8; sdown'right=0; sdown'low=0; sdown'high=8; sdown'length=9;sup'left=0; sup'right=8; sup'low=0; sup'high=8; sup'length=9;数值类属性TYPE bit32 IS ARRAY (63 DOWNTO 32)OF BITVARIABLE:left_range,right_range,up_range,low_range,len:INTEGER;BEGINleft-range:=bit32'LEFT; --return 63right-range:=bit32'RIGHT; --return 32up-range:=bit32'HIGH; --return 63low-range:=bit32'LOW; --return 32len:=bit32'LENGTH; --return 32函数类属性信号属性函数属于函数类属性,用来返回有关信号行为功能信息.共有5种信号属性函数,分别是: 'EVENT(事件) ; ' ACTIVE(活跃);' LAST_EVENT (最近一次事件到现在经过多少时间);' LAST_ACTIVE (最近一次活跃到现在经过多少时间); ' LAST_VALUE(信号变化前取值是什么)EVENTEVENT:它值为布尔型,取值为TRUE或FALSE;如果刚好有事件发生在该属性所附着信号上(即信号有变化),取值为TRUE.利用此属性可决定时钟边沿是否有效,即时钟是否发生.EVENTSIGNAL clk: IN std_logic;clk 'EVENT AND clk='1'clk='1' AND clk 'EVENTclk 'EVENT AND clk='0'clk='0' AND clk 'EVENTrising_edge(clk) falling_edge(clk)EVENT 和ACTIVEEVENT 要求信号值发生变化;1到0,0到1ACTIVE 信号值任何变化,1到1,1 到0,0到1,0到0;所有事件都是活跃,但并非所有活跃都是事件范围类属性'RANGE属性,其生成一个限制性数据对象范围.例 SIGNAL data_bus:std_logic_vector(15 DOWNTO 0);data_bus 'RANGE=15 downto 0用VHDL语言设计分频电路,把1KHZ的时钟分至约1HZ左右的时钟LIBRARY IEEE;USEENTITY FreDevider ISPORT(Clkin:IN Std_Logic;Clkout:OUT Std_Logic);END;ARCHITECTURE Devider OF FreDevider IS CONSTANT N:Integer:=499;signal counter:Integer range 0 to N; signal Clk:Std_Logic;BEGINPROCESS(Clkin)beginIF rising_edge(Clkin)THENIF Counter=N thencounter<=0;Clk<=not clk;elsecounter<=counter+1;end if;end if;end process;clkout<=clk;end;。
VHDL语言详解

概述(4/4)
VHDL vs. Verilog HDL
USA—IBM,TI,AT&T,INTEL…VHDL; USA—Silicon Valley…Verilog; Europe—VHDL; Japan—Verilog; Korea—70-80%VHDL;
VHDL的一些基本概念
基本概念(1/7)
操作数的类型应该和运算操作符所要求并置一维数组整数和实数包括浮点数整数和实数包括浮点数mod整数rem整数sll逻辑左移bit或布尔型一维数组srl逻辑右移bit或布尔型一维数组sla算术左移bit或布尔型一维数组sra算术右移bit或布尔型一维数组rol逻辑循环左移bit或布尔型一维数组ror逻辑循环右移bit或布尔型一维数组乘方整数算术操作符abs取绝对值整数vhdl语言的运算操作符2等于任何数据类型不等于任何数据类型小于枚举与整数类型及对应的一维数组大于枚举与整数类型及对应的一维数组小于等于枚举与整数类型及对应的一维数组关系操作符大于等于枚举与整数类型及对应的一维数组bitbooleanstdlogibitbooleanstdlogibitbooleanstdlogibitbooleanstdlogibitbooleanstdlogibitbooleanstdlogibitbooleanstdlogi整数符号操作符整数vhdl语言的运算操作符3运算符优先级xnor最低优先级vhdlvhdl语言的运算操作符4norxorstdlogicvector1downtostdlogicsignalnandjnandbooleansignalstdlogicvector1downtostdlogicsignalbooleanvhdl语言的运算操作符5主要用于位和位矢量的连接
两个进程语句并行执行
VHDL语言的基本语法解析

VHDL语言要素
一、VHDL语言的基本语法
1、VHDL语言的标识符
VHDL中的标识符可以是常数、变量、信号、端口、子程序或参 数的名字。使用标识符要遵守如下规则:
信号与变量的区别
(1)声明的形式与位置不同 信号 signal count : std_logic_vector(7 downto 0); 变量 variable tema:std_logic_vector(3 downto 0); 信号在结构体中声明;变量在进程中声明
(2)赋值符不同 count<=“00000000”, count<=“ZZZZZZZZ” count<=tema; tema:=0000;
2、变量( Variable )
变量是一个局部变量,它只能在进程语句、函数语句和过程 语句结构中使用,用作局部数据存储。变量常用在实现某种算 法的赋值语句中。
一般格式:
VARIABLE 变量名:数据类型 约束条件:= 表达式;
例: VARIABLE x, y: INTEGER;
--定义x,y为整数变量
(3)赋值生效的时间不同 信号:进程结束时 变量:立即生效
(4)进程对信号敏感,对变量不敏感
(5)作用域不同 信号可以是多个进程的全局信号, 变量只在定义后的顺序域可见
三、VHDL语言的数据类型 ? VHDL中的数据类型可以分成四大类。
标量型(Scalar Type) 复合类型(Composite Type)
1) 布尔(BOOLEAN)数据类型
VHDL的配置.

VHDL的配置(2) ELSE IF (clk'EVENT) AND (clk = '1') AND (clk'LAST_VALUE = '0') THEN IF (count = 255) THEN count := 0; ELSE count := count + 1; END IF; END IF; END IF; data_out <= count; END PROCESS; END count_255; CONFIGURATION small_count OF counter IS FOR count_255 END FOR; END small_count;
VHDL的配置(1) •配置是把元件具体安装到实体的最基本设计 单元,模块的配置是模块的零件清单,在安 装元件时,配置将为实体在多个结构体中指 出用哪个结构体,当一种实体─结构体组合 编辑到库中时就产生一个可仿真的对象。 •设计描述总是把公共部分(如Package)往前 提,把具体部分(装配的元件和类属参数)往后 放 •配置则为所配置的结构体指定具体安装元件 的类属值,这种机制能提供了一种在实际布 线之后,最后加延时值的能力,以便为后仿 真提供实际的延时值。 •配置中可以用端口映射把新元件映射到相应 的信号上去,这种功能为设计选用和修改元 件库。 •配置提供替换能力,实现对实体所需的结构 体进行选择,而当选择改变时,只需对配置 文件进行重新编辑和仿真 配置分为默认配置、元件配置、块配置和结 构配置
VHDL的配置(3)
ARCHITECTURE count_64k OF counter IS BEGIN PROCESS(clk) VARIABLE count : INTEGER := 0; BEGIN IF clear = '1' THEN count := 0; ELSIF load = '1' THEN count := data_in; ELSE IF (clk'EVENT) AND (clk = '1') AND (clk'LAST_VALUE = '0') THEN IF (count = 65535) THEN count := 0; ELSE count := count + 1; END IF; END IF; END IF; data_out <= count; END PROCESS; END count_64k;
VHDL语法简单情况总结

VHDL语法简单总结一个VHDL程序代码包含实体(entity)、结构体(architecture)、配置(configuration)、程序包(package)、库(library)等。
一、数据类型1.用户自定义数据类型使用关键字TYPE,例如:TYPE my_integer IS RANGE -32 TO 32;–用户自定义的整数类型的子集TYPE student_grade IS RANGE 0 TO 100;–用户自定义的自然数类型的子集TYPE state IS (idle, forward, backward, stop);–枚举数据类型,常用于有限状态机的状态定义一般来说,枚举类型的数据自动按顺序依次编码。
2.子类型在原有已定义数据类型上加一些约束条件,可以定义该数据类型的子类型。
VHDL不允许不同类型的数据直接进行操作运算,而某个数据类型的子类型则可以和原有类型数据直接进行操作运算。
子类型定义使用SUBTYPE关键字。
3.数组(ARRAY)ARRAY是将相同数据类型的数据集合在一起形成的一种新的数据类型。
TYPE type_name IS ARRAY (specification) OF data_type;–定义新的数组类型语法结构SIGNAL signal_name: type_name [:= initial_value];–使用新的数组类型对SIGNAL,CONSTANT, VARIABLE进行声明例如:TYPE delay_lines IS ARRAY (L-2 DOWNTO 0) OF SIGNED (W_IN-1 DOWNTO 0);–滤波器输入延迟链类型定义TYPE coeffs IS ARRAY (L-1 DOWNTO 0) OF SIGNED (W_COEF-1 DOWNTO 0);–滤波器系数类型定义SIGNAL delay_regs: delay_lines; –信号延迟寄存器声明CONSTANT coef: coeffs := ( ); –常量系数声明并赋初值4.端口数组在定义电路的输入/输出端口时,有时需把端口定义为矢量阵列,而在ENTITY中不允许使用TYPE进行类型定义,所以必须在包集(PACKAGE)中根据端口的具体信号特征建立用户自定义的数据类型,该数据类型可以供包括ENTITY在内的整个设计使用。
VHDL语法简单总结

VHDL语法(yǔfǎ)简单总结VHDL语法简单(jiǎndān)总结VHDL语法(yǔfǎ)简单总结一个(yī ɡè)VHDL程序代码包含实体(shítǐ)(entity)、结构(jiégòu)体(architecture)、配置(pèizhì)(configuration)、程序包(package)、库(library)等。
一、数据类型1.用户自定义数据类型使用关键字TYPE,例如:TYPE my_integer IS RANGE -32 TO 32;–用户自定义的整数类型的子集TYPE student_grade IS RANGE 0 TO 100;–用户自定义的自然数类型的子集TYPE state IS (idle, forward, backward, stop);–枚举数据类型,常用于有限状态机的状态定义一般来说,枚举类型的数据自动按顺序依次编码。
2.子类型在原有已定义数据类型(lèixíng)上加一些约束条件,可以定义(dìngyì)该数据类型的子类型。
VHDL不允许不同类型的数据直接进行操作运算,而某个数据类型的子类型则可以和原有类型数据直接进行操作运算。
子类型定义使用(shǐyòng)SUBTYPE关键字。
3.数组(ARRAY)ARRAY是将相同数据类型的数据集合在一起(yīqǐ)形成的一种新的数据类型。
TYPE type_name IS ARRAY (specification) OF data_type;–定义新的数组类型(lèixíng)语法结构SIGNAL signal_name: type_name [:=initial_value];–使用新的数组类型对SIGNAL,CONSTANT, VARIABLE进行声明例如:TYPE delay_lines IS ARRAY (L-2 DOWNTO 0) OF SIGNED (W_IN-1 DOWNTO 0);–滤波器输入延迟链类型定义TYPE coeffs IS ARRAY (L-1 DOWNTO 0) OF SIGNED (W_COEF-1 DOWNTO 0);–滤波器系数(xìshù)类型定义SIGNAL delay_regs: delay_lines; –信号延迟(yánchí)寄存器声明CONSTANT coef: coeffs := ( ); –常量(chángliàng)系数声明并赋初值4.端口数组在定义电路的输入/输出端口时,有时需把端口定义为矢量阵列,而在ENTITY中不允许使用TYPE进行类型定义,所以(suǒyǐ)必须在包集(PACKAGE)中根据端口的具体信号特征建立用户自定义的数据类型,该数据类型可以供包括ENTITY在内的整个设计使用。
第三章VHDL语言数据类型及运算操作符

实数常量的书写方式举例
65971.333333
--十进制浮点数
8#43.6E+4#
--八进制浮点数
43.6E-4
--十进制浮点数
第三章VHDL语言数据类型及运算操作符
3、位(BIT)数据类型
位数据类型也属于枚举型,取值只能是1 或0。位数据类型的数据对象,如变量、信 号等,可以参与逻辑运算,运算结果仍是 位的数据类型。VHDL综合器用一个二进制 位表示BIT。在程序包STANDARD中定义 的源代码是:
第三章VHDL语言数据类型及运算操作符
总结:
在运行中不变,若要改变必须要改变设计, 也就是说改变常量说明,重新编译。
常量必须在程序的实体、结构体或过程的 说明区中,对其标识符类型常量值进行指 定。
定义在实体中的常量仅在实体中使用。以 此类推。
第三章VHDL语言数据类型及运算操作符
3.1.2变量(Variable)
线)信号,共有16个信号元素
第三章VHDL语言数据类型及运算操作符
以下示例定义的信号数据类型是设计者自 行定义的,这是VHDL所允许的:
TYPE FOUR IS(‘X’,‘0’,‘I’, ‘Z’);
SIGNAL S1﹕FOUR; SIGNAL S2﹕FOUR:=‘X’; SIGNAL S3﹕FOUR:=‘L’;
第三章VHDL语言数据类型及运算操作符
格式: CONSTANT 常数名:数据类型:=表达式; 例: CONSTANT VCC: REAL:=5.0; CONSTANT DALY:TIME:=100ns; CONSTANT BUS:BIT_VECTOR:=“1010 ” CONSTANT G1:BIT:= ‘ 1’; 数据类型和表达式表示的数据类型应该一致。 ‘ ’表示是位信息, 而 “ ”表示的是位矢量
VHDL数据类型vhdl语法

二、VHDL数据类型与数据对象
例如: Signal Y : Std_logic_vector(7 downto 0); Signal X : Integer range 0 to 255; Y<= CONV_STD_LOGIC_VECTOR(X,8);
二、VHDL数据类型与数据对象 CONV_INTEGER 将数据类型 UNSIGNED, SIGNED转换为 INTEGER 类型. CONV_UNSIGNED 将数据类型INTEGER, SIGNED转换为 UNSIGNED 类型. CONV_SIGNED 将数据类型INTEGER, UNSIGNED转换为 SIGNED类型. CONV_STD_LOGIC_VECTOR 将数据类型INTEGER, UNSIGNED, SIGNED, STD_LOGIC转换为STD_LOGIC_VECTOR 类型.
二、VHDL数据类型与数据对象
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; --必需定义+ entity exam1 is port (ip : in std_logic_vector(3 downto 0); op : out std_logic_vector(3 downto 0)); end exam1; architecture m1 of exam1 is constant num : integer := 6; begin op <= ip + num; end m1;
architecture bh1 of full_bit_adder is begin y <= ((not a)and (not b)and ci) or ((not a)and (b) and (not ci)) or ((a)and (not b)and(not ci)) or ((a) and (b)and(ci)); cout <= (b and ci) or (a and ci) or (a and b); end bh1;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
vhdl array用法
VHDL(Very High Speed Integrated Circuit Hardware Description Language)是一种硬件描述语言,广泛应用于数字电路设计和仿真。
在VHDL 中,数组(array)是一种非常常用的数据结构,它允许在单个信号名称下存储多个值。
这篇文章将详细介绍VHDL中的数组用法,重点关注中括号的使用,并逐步回答相关问题。
1. 什么是VHDL中的数组?
数组是一种用于存储多个值的数据结构。
在VHDL中,数组可以是一维、二维或多维的,并且可以包含指定数量的元素。
2. 如何声明一个一维数组?
在VHDL中,可以使用以下语法声明一个一维数组:
type array_name is array (range) of element_type;
其中,`array_name`是数组名称,`range`是数组的范围,可以是确定的或变量的,而`element_type`是数组元素的数据类型。
3. 如何声明一个二维数组?
声明一个二维数组的语法如下:
type array_name is array (range1) of element_type_1;
type array2d_name is array (range2) of array_name;
其中,`range1`和`range2`是数组的范围,`element_type_1`是数组元素的数据类型。
4. 如何初始化数组的元素?
可以使用以下方式初始化数组的元素:
array_name := (value1, value2, value3, ...);
其中,`array_name`是数组名称,`value1`、`value2`等是要初始化的元素值。
5. 如何访问数组的元素?
可以使用以下方式访问数组的元素:
array_name(index);
其中,`array_name`是数组名称,`index`是要访问的元素的索引。
6. 数组的索引如何定义?
数组的索引可以是任何VHDL支持的数据类型,如整数或枚举类型。
索引可以
是递增或递减的,也可以不连续。
7. 如何遍历数组的元素?
可以使用Foreach循环遍历数组的元素,语法如下:
for index in array_name'range loop
可以访问array_name(index)
在此处执行循环体的代码
end loop;
其中,`array_name`是数组名称,`index`是索引的变量。
8. 数组的大小是否可以动态改变?
在VHDL中,一旦数组被声明,其大小是固定的,不可以动态改变。
如果需要改变数组的大小,需要重新声明一个新的数组。
9. 数组与信号的区别是什么?
数组和信号都可以用于存储多个值,但数组是一个在仿真过程中用于存储数据的变量,而信号则用于描述数字电路中的连续传输的数据。
10. 如何在VHDL中使用数组?
在VHDL中,数组常用于存储和处理多个数据,并使代码更清晰、更具可读性。
可以将数组用于存储寄存器状态、处理多个输入/输出等场景。
总结:
VHDL中的数组是一种非常有用的数据结构,它可以通过一个信号名称存储多个值,并且提供了灵活的索引和遍历方式。
本文介绍了声明一维和二维数组的语法,讨论了数组元素的初始化和访问方法,并解答了一些与数组相关的常见问题。
通过充分理解VHDL中的数组用法,可以更好地应用它们来实现复杂的数字电路设计。