第八章 VHDL结构

Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 105

EDA 技术实用教

第8章
VHDL 结构与要素
康芯科技
KX
8.1 实 体

8.1.1 实体语句结构
实体说明单元的一般语句结构:
ENTITY 实体名 IS
[GENERIC ( 类 属
表 );]
[PORT ( 端口表 );]
END ENTITY 实体名 ;
8.1.2 GENERIC 类属说明语句

类属说明的一般书写格式如下:
GENERIC([ 常数名 : 数据类型 [ : 设
定值 ]
{ ; 常数名 : 数据类型 [ : 设定值 ] }
) ;
康芯科技
【例 8-1 】 KX
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY andn IS
GENERIC ( n : INTEGER ); -- 定义类属参量及其数据类型
PORT(a : IN STD_LOGIC_VECTOR(n-1 DOWNTO 0);-- 用类属参量
限制矢量长度
c : OUT STD_LOGIC);
END;
ARCHITECTURE behav OF andn IS
BEGIN
PROCESS (a)
VARIABLE int : STD_LOGIC;
BEGIN
int := '1';
FOR I IN a'LENGTH - 1 DOWNTO 0 LOOP
IF a(i)='0' THEN int := '0';
END IF;
END LOOP;
c <=int ;
END PROCESS;
END;
康芯科技
KX
【例 8-2 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY exn IS
PORT(d1,d2,d3,d4,d5,d6,d7 : IN STD_LOGIC;
q1,q2 : OUT STD_LOGIC);
END;
ARCHITECTURE exn_behav OF exn IS
COMPONENT andn -- 元件调用声明
GENERIC ( n : INTEGER);
PORT(a: IN STD_LOGIC_VECTOR(n-1 DOWNTO 0);
c: OUT STD_LOGIC);
END COMPONENT ;
BEGIN -- 类属映射语句,定义类属变量, n 赋值为 2
u1: andn GENERIC MAP (n =>2)
PORT MAP (a(0)=>d1,a(1)=>d2,c=>q1);
u2: andn GENERIC MAP (n =>5) -- 定义类属变量, n 赋值为
5
PORT MAP (a(0)=>d3,a(1)=>d4,a(2)=>d5,
a(3)=>d6,a(4)=>d7, c=>q2);
END;
康芯科技
KX

8.1.3 类属映射语句

类属映射语句可用于设计从外部端口改变元件内
部参数或结构规模的元件,或称类属元件,这些元件
在例化中特别方便,在改变电路结构或元件升级方面
显得尤为便捷。其语句格式是:
GENERIC MAP (类属表)。

类属映射语句与端口映射语句 PORT MAP() 具有相似的功


能和使用方法,它描述相应元件类属参数间的衔接和传送方式
,它的类属参数衔接(连接)表达方式也相同。
康芯科技
KX
【例 8-3 】
LIBRARY IEEE; -- 待例化元件
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_arith.ALL;
USE IEEE.STD_LOGIC_unsigned.ALL;
ENTITY addern IS
PORT (a, b: IN STD_LOGIC_VECTOR;
result: out STD_LOGIC_VECTOR);
END addern;
ARCHITECTURE behave OF addern IS
BEGIN
result <= a + b;
END;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_arith.ALL;
USE IEEE.STD_LOGIC_unsigned.ALL;
ENTITY adders IS
GENERIC(msb_operand: INTEGER := 15; msb_sum: INTEGER :=15);
PORT(b: IN STD_LOGIC_VECTOR (msb_operand DOWNTO 0);
result: OUT STD_LOGIC_VECTOR (msb_sum DOWNTO 0));
END adders;
接下页
ARCHITECTURE behave OF adders IS 康芯科技
COMPONENT addern K
接上页
X

PORT ( a, b: IN STD_LOGIC_VECTOR;
result: OUT STD_LOGIC_VECTOR);
END COMPONENT;
SIGNAL a: STD_LOGIC_VECTOR (msb_sum /2 DOWNTO 0);
SIGNAL twoa: STD_LOGIC_VECTOR (msb_operand DOWNTO 0);
BEGIN
twoa <= a & a;
U1: addern PORT MAP (a => twoa, b => b, result => result);
U2: addern PORT MAP (a=>b(msb_operand downto msb_operand/2 +1),
b=>b(msb_operand/2 downto 0), result => a);
END behave;

图 8-1 例 8-3 的逻辑电路


康芯科技
KX
8.1.4 PORT (端口)说明

由于 PORT 说明语句是对一个设计实体界面的说明及对设
计实体与外部电路的接口通道的说明,其中包括对每一接口
的输入输出模式和数据类型的定义。其格式如下:

PORT ( 端口名 : 端口模式 数据类型 ;


{ 端口名 : 端口模式 数据类
型} ) ;

其中的端口名是设计者为实体的每一个对外通道所取的
名字,端口模式是指这些通道上的数据流动方式。数据类型
是指端口上流动的数据的表达格式或取值类型, VHDL 要求
只有相同数据类型的端口信号和操作数才能相互作用。
康芯科技
KX
8.2 结构体

结构体的组成部分是:
• 对数据类型、常数、信号、子程序和元件等元素的说明
部分。
• 描述实体逻辑行为的、以各种不同的描述风格表达的功
能描述语句。
• 以元件例化语句为特征的外部元件(设计实体)端口间
的连接。

ARCHITECTURE 结构体名 OF 实体
名 IS
1. 结构体的一般语言格式 [ 说明语句 ]
BEGIN
[ 功能描述语句 ]
END ARCHITECTURE 结构体名 ;
康芯科技
KX
8.2 结构体

2. 结构体说明语句

进程语句

信号赋值语句
3. 功能描述语句结
构 子程序调用语句

元件例化语句
康芯科技
KX
8.3 子程序 (SUBPROGRAM)

8.3.1 函数( FUNCTION )

函数的语言表达格式如下:
函数的语言表达格式如下:
FUNCTION 函数名(参数表) RETURN
FUNCTION 函数名(参数表) RETURN 数据类型
数据类型 ----
函数首
函数首
FUNCTION 函数名(参数表)RETURN
FUNCTION 函数名(参数表) 数据类型 IS
RETURN 数据类型 IS ---- 函数
函数


[ [ 说明部分
说明部分 ] ]
BEGIN
BEGIN
顺序语句 ; ;
顺序语句
END
ENDFUNCTION 函数名; ;
FUNCTION 函数名
康芯科技
【例 8-4 】 KX
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
PACKAGE packexp IS -- 定义程序包
FUNCTION max( a,b : IN STD_LOGIC_VECTOR) -- 定义函数首
RETURN STD_LOGIC_VECTOR ;
FUNCTION func1 ( a,b,c : REAL ) -- 定义函数首
RETURN REAL ;
FUNCTION "*" ( a ,b : INTEGER ) -- 定义函数首
RETURN INTEGER ;
FUNCTION as2 (SIGNAL in1 ,in2 : REAL ) -- 定义函数首
RETURN REAL ;
END ;
PACKAGE BODY packexp IS
FUNCTION max( a,b : IN STD_LOGIC_VECTOR) -- 定义函数体
RETURN STD_LOGIC_VECTOR IS
BEGIN
IF a > b THEN RETURN a;
ELSE RETURN b;
END IF;
END FUNCTION max; -- 结束 FUNCTION 语句
END; -- 结束 PACKAGE BODY 语句

接下页
康芯科技
KX
接上页

LIBRARY IEEE; -- 函数应用实例


USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.packexp.ALL ;
ENTITY axamp IS
PORT(dat1,dat2 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
dat3,dat4 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
out1,out2 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );
END;
ARCHITECTURE bhv OF axamp IS
BEGIN
out1 <= max(dat1,dat2); -- 用在赋值语句中的并行函数调用语句
PROCESS(dat3,dat4)
BEGIN
out2 <= max(dat3,dat4); -- 顺序函数调用语句
END PROCESS;
END;
康芯科技
KX

图 8-2 例 8-4 的逻辑电路图


康芯科技
KX
【例 8-5 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY func IS
PORT ( a : IN STD_LOGIC_VECTOR (0 to 2 ) ;
m : OUT STD_LOGIC_VECTOR (0 to 2 ) ) ;
END ENTITY func ;
ARCHITECTURE demo OF func IS
FUNCTION sam(x ,y ,z : STD_LOGIC) RETURN STD_LOGIC IS
BEGIN
RETURN ( x AND y ) OR y ;
END FUNCTION sam ;
BEGIN
PROCESS ( a )
BEGIN
m(0) = sam( a(0), a(1), a(2) ) ;
m(1) = sam( a(2), a(0), a(1) ) ;
m(2) = sam( a(1), a(2), a(0) ) ;
END PROCESS ;
END ARCHITECTURE demo ;
康芯科技
KX
8.3.2 重载函数( OVERLOADED FUNCTION )

【例 8-6 】
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
PACKAGE packexp IS -- 定义程序包
FUNCTION max( a,b : IN STD_LOGIC_VECTOR) -- 定义函数首
RETURN STD_LOGIC_VECTOR ;
FUNCTION max( a,b : IN BIT_VECTOR) -- 定义函数首
RETURN BIT_VECTOR ;
FUNCTION max( a,b : IN INTEGER ) -- 定义函数首
RETURN INTEGER ;
END ;
PACKAGE BODY packexp IS
FUNCTION max( a,b : IN STD_LOGIC_VECTOR) -- 定义函数体
RETURN STD_LOGIC_VECTOR IS
BEGIN
IF a > b THEN RETURN a;
ELSE RETURN b; END IF;
END FUNCTION max; -- 结束 FUNCTION 语句
FUNCTION max( a,b : IN INTEGER) -- 定义函数体
RETURN INTEGER IS 接下页
接上页 康芯科技
KX
BEGIN
IF a > b THEN RETURN a;
ELSE RETURN b; END IF;
END FUNCTION max; -- 结束 FUNCTION 语句
FUNCTION max( a,b : IN BIT_VECTOR) -- 定义函数体
RETURN BIT_VECTOR IS
BEGIN
IF a > b THEN RETURN a;
ELSE RETURN b; END IF;
END FUNCTION max; -- 结束 FUNCTION 语句
END; -- 结束 PACKAGE BODY 语句
-- 以下是调用重载函数 max 的程序:
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
USE WORK.packexp.ALL ;
ENTITY axamp IS
PORT(a1,b1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
a2,b2 : IN BIT_VECTOR(4 DOWNTO 0);
a3,b3 : IN INTEGER RANGE 0 TO 15;
c1 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
c2 : OUT BIT_VECTOR(4 DOWNTO 0);
c3 : OUT INTEGER RANGE 0 TO 15);
END;
接上页 康芯科技
KX
ARCHITECTURE bhv OF axamp IS
BEGIN
c1 <= max(a1,b1); -- 对函数 max( a,b : IN STD_LOGIC_VECTOR) 的调

c2 <= max(a2,b2); -- 对函数 max( a,b : IN BIT_VECTOR) 的调用
c3 <= max(a3,b3); -- 对函数 max( a,b : IN INTEGER) 的调用
END;

【例 8-7 】
LIBRARY IEEE ; -- 程序包首
USE IEEE.std_logic_1164.all ;
USE IEEE.std_logic_arith.all ;
PACKAGE STD_LOGIC_UNSIGNED is
function "+" (L : STD_LOGIC_VECTOR ; R : INTEGER)
return STD_LOGIC_VECTOR ;
function "+" (L : INTEGER; R : STD_LOGIC_VECTOR)
return STD_LOGIC_VECTOR ;
function "+" (L : STD_LOGIC_VECTOR ; R : STD_LOGIC )

return STD_LOGIC_VECTOR ;
function SHR (ARG : STD_LOGIC_VECTOR ;
COUNT : STD_LOGIC_VECTOR ) return STD_LOGIC_VECTOR ;
... 接下页
康芯科技
KX
接上页

LIBRARY IEEE ; -- 程序包体


use IEEE.std_logic_1164.all ;
use IEEE.std_logic_arith.all ;
package body STD_LOGIC_UNSIGNED is
function maximum (L, R : INTEGER) return INTEGER is
begin
if L  R then return L;
else return R;
end if;
end;
function "+" (L : STD_LOGIC_VECTOR ; R : INTEGER)
return STD_LOGIC_VECTOR is
Variable result : STD_LOGIC_VECTOR (L’range) ;
Begin
result := UNSIGNED(L) + R ;
return std_logic_vector(result) ;
end ;
...
end STD_LOGIC_UNSIGNED ;
康芯科技
KX
8.3.3 过程( PROCEDURE )

过程的语句格式是:
PROCEDURE 过程名 ( 参数表 ) -- 过程首

PROCEDURE 过程名 ( 参数表 ) IS


[ 说明部分 ]
BIGIN -- 过程体
顺序语句 ;
END PROCEDURE 过程名 ;

以下是三个过程首的定义示例:
PROCEDURE pro1 (VARIABLE a, b : INOUT REAL) ;
PROCEDURE pro2 ( CONSTANT a1 : IN INTEGER ;
VARIABLE b1 : OUT INTEGER ) ;
PROCEDURE pro3 (SIGNAL sig : INOUT BIT) ;
【例 8-8 】 康芯科技
K X
PROCEDURE prg1(VARIABLE value:INOUT BIT_VECTOR(0 TO 7)) IS
BEGIN
CASE value IS
WHEN "0000" => value: "0101" ;
WHEN "0101" => value: "0000" ;
WHEN OTHERS => value: "1111" ;
END CASE ;
END PROCEDURE prg1 ;
【例 8-9 】
PROCEDURE comp ( a, r : IN REAL;
m : IN INTEGER ;
v1, v2: OUT REAL) IS
VARIABLE cnt : INTEGER ;
BEGIN
v1 := 1.6 * a ; -- 赋初始值
v2 := 1.0 ; -- 赋初始值
Q1 : FOR cnt IN 1 TO m LOOP
v2 := v2 * v1 ;
EXIT Q1 WHEN v2 > v1; -- 当 v2 > v1 ,跳出循环
LOOP
END LOOP Q1
ASSERT (v2 < v1 )
REPORT "OUT OF RANGE" -- 输出错误报告
SEVERITY ERROR ;
康芯科技
KX
8.3.4 重载过程( OVERLOADED PROCEDURE )

【例 8-10 】
PROCEDURE calcu ( v1, v2 : IN REAL ;
SIGNAL out1 : INOUT INTEGER) ;
PROCEDURE calcu ( v1, v2 : IN INTEGER ;
SIGNAL out1 : INOUT REAL) ;
...
calcu (20.15, 1.42, signl) ; -- 调用第一个重载过程
calcu
calcu (23 , 320 , sign2 ) ; -- 调用第二个重载过程
calcu
...
康芯科技
KX
8.4 VHDL 库

8.4.1 库的种类

1. IEEE 库

2. STD 库

3. WORK 库

4. VITAL 库
康芯科技
KX
8.4 VHDL 库

8.4.2 库的用法

USE 语句的使用有两种常用格式:
USE 库名 . 程序包名 . 项目名 ;
USE 库名 . 程序包名 .ALL ;

LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.STD_ULOGIC ;
USE IEEE.STD_LOGIC_1164.RISING_EDGE ;
康芯科技
KX

8.5 VHDL 程序包

程序包

常数说明 VHDL 数据类型说明 元件定义 子程序

定义程序包的一般语句结构如下:
PACKAGE 程序包名 IS -- 程序
包首
程序包首说明部分
END 程序包名 ;

PACKAGE BODY 程序包名 IS -- 程序


包体
程序包体说明部分以及包体内
康芯科技
KX
【例 8-11 】
PACKAGE pacl IS -- 程序包首开始
TYPE byte IS RANGE 0 TO 255 ; -- 定义数据类型
byte
SUBTYPE nibble IS byte RANGE 0 TO 15 ; -- 定义子类型
nibble
CONSTANT byte_ff : byte := 255 ; -- 定义常数
byte_ff
SIGNAL addend : nibble ; -- 定义信号
addend
COMPONENT byte_adder -- 定义元件
PORT( a, b : IN byte ;
c : OUT byte ;
overflow : OUT BOOLEAN ) ;
END COMPONENT ;
FUNCTION my_function (a : IN byte) Return byte ; --
定义函数
END pacl ; -- 程序包首结束
康芯科技
【例 8-12 】
KX
PACKAGE seven IS
SUBTYPE segments is BIT_VECTOR(0 TO 6) ;
TYPE bcd IS RANGE 0 TO 9 ;
END seven ;
USE WORK.seven.ALL ; -- WORK 库默认是打开的,
ENTITY decoder IS
PORT (input: bcd; drive : out segments) ;
END decoder ;
ARCHITECTURE simple OF decoder IS
BEGIN
WITH input SELECT
drive <= B"1111110" WHEN 0 ,
B"0110000" WHEN 1 ,
B"1101101" WHEN 2 ,
B"1111001" WHEN 3 ,
B"0110011" WHEN 4 ,
B"1011011" WHEN 5 ,
B"1011111" WHEN 6 ,
B"1110000" WHEN 7 ,
B"1111111" WHEN 8 ,
B"1111011" WHEN 9 ,
B"0000000" WHEN OTHERS ;
END simple ;
康芯科技
KX
8.5 VHDL 程序包

STD_LOGIC_1164
STD_LOGIC_1164程序包
程序包

STD_LOGIC_ARITH
STD_LOGIC_ARITH程序
程序
包包
常用的预定义的程序包
常用的预定义的程序包 STD_LOGIC_UNSIGNED
STD_LOGIC_UNSIGNED和

STD_LOGIC_SIGNED
STD_LOGIC_SIGNED程序包
程序包

STANDARD
STANDARD和

TEXTIO
TEXTIO程序包
程序包
康芯科技
KX
8.6 配置

配置可以把特定的结构体
配置可以把特定的结构体
关联到(指定给)一个确定的实体。
关联到(指定给)一个确定的实体。

配置语句的一般格式如下:

CONFIGURATION 配置名 OF 实体名 IS


配置说明
END 配置名 ;
康芯科技
KX
8.7 VHDL 文字规则
8.7.1 数字

整数:整数都是十进制的数,如:
5 , 678 , 0, 156E2(=15600) , 45_234_287 (=45234287)
实数文:实数也都是十进制的数,但必须带有小数点,如:
1.335 , 88_670_551.453_909(=88670551.453909) , 1.0 , 44.99E-
2(=0.4499)
以数制基数表示的文字:用这种方式表示的数由五个部分组成。
SIGNAL d1,d2,d3,d4,d5, : INTEGER RANGE 0 TO 255;
d1 <= 110#170# ; -- ( 十进制表示,等于 170)
d2 <= 16#FE# ; -- ( 十六进制表示,等于 254)
d3 <= 2#1111_1110#; -- ( 二进制表示,等于 254)
d4 <= 8#376# ; -- ( 八进制表示,等于 254)
d5 <= 16#E#E1 ; -- ( 十六进制表示,等于 2#1110000# ,等于 224)

物理量文字 (VHDL 综合器不接受此类文字 ) 。如:


60s (60 秒 ) , 100m (100 米 ) , k ( 千欧姆 ) , 177A
(177 安培 )
康芯科技
KX
8.7 VHDL 文字规则
(11)文字字符串
( )文字字符串
8.7.2
8.7.2 字符串
字符串 "ERROR" , "Both S and Q equal to 1" , "X" ,
"BB$CC"
(22)数位字符串
( )数位字符串
B :二进制基数符号,表示二进制位 0 或 1 ,在字符串中的每位表示一个
Bit 。
O :八进制基数符号,在字符串中的每一个数代表一个八进制数,即代表一个
3 位 (BIT) 的二进制数。

X :十六进制基数符号 (0 ~ F) ,代表一个十六进制数,即一个 4 位的二进制数。

data1 <= B"1_1101_1110" -- 二进制数数组,位矢数组长度是 9


data2 <= O"15" -- 八进制数数组,位矢数组长度是 6
data3 <= X"AD0" -- 十六进制数数组,位矢数组长度是 12
data4 <= B"101_010_101_010" -- 二进制数数组,位矢数组长度是 12
data5 <= "101_010_101_010" -- 表达错误,缺 B 。
data6 <= "0AD0" -- 表达错误,缺 X 。
康芯科技
KX
8.7 VHDL 文字规则
8.7.3 标识符

规则:
 有效的字符:包括 26 个大小写英文字母,数字包括 0 ~ 9 以及下划线
“ _” 。
 任何标识符必须以英文字母开头。
 必须是单一下划线“ _” ,且其前后都必须有英文字母或数字。
 标识符中的英语字母不分大小写。
 允许包含图形符号 ( 如回车符、换行符等 ) ,也允许包含空格符。
8.7.4 下标名 格式: 标识符 ( 表达
式)
下例的两个下标名中一个是 m ,属不可计算,另一个是 3 ,属可计算的

SIGNAL a , b : BIT_VECTOR (0 TO 3) ;
SIGNAL m : INTEGER RANGE 0 TO 3 ;
SIGNAL y , z : BIT ;
y <= a(m) ; -- 不可计算型下标表示
z <= b(3) ; -- 可计算型下标表示
康芯科技
KX
8.8 数据类型

标量型 (Scalar Type)

复合类型 (Composite Type)

存取类型 (Access Type)

文件类型 (Files Type)


康芯科技
KX
8.8.1 VHDL 的预定义数据类型

1. 布尔 (BOOLEAN) 数据类型

2. 位 (BIT) 数据类型
3. 位矢量 (BIT_VECTOR) 数据类

4. 字符 (CHARACTER) 数据类型
5. 整数 (INTEGER) 数据类

6. 实数 (REAL) 数据类型 1.0 十进制浮点数
0.0 十进制浮点数
65971.333333 十进制浮点数
65_971.333_3333 与上一行等价
8#43.6#e+4 八进制浮点数
43.6E - 4 十进制浮点数
康芯科技
KX
8.8.1 VHDL 的预定义数据类型

7. 字符串 (STRING) 数据类型


VARIABLE string_var : STRING (1 TO 7 ) ;
string_var := "a b c d" ;

8. 时间 (TIME) 数据类
型TYPE time IS RANGE - 2147483647 TO 2147483647
units
fs ; -- 飞秒, VHDL 中的最小时间单位
ps = 1000 fs ; -- 皮秒
ns = 1000 ps ; -- 纳秒
us = 1000 ns ; -- 微秒
ms = 1000 us ; -- 毫秒
sec = 1000 ms ; -- 秒
min = 60 sec ; -- 分
hr = 60 min ; -- 时
end units ;
康芯科技
KX
8.8 数据类型

8.8.2 IEEE 预定义标准逻辑位与矢量

1. 标准逻辑位 STD_LOGIC 数据类


2. 标准逻辑矢量 (STD_LOGIC_VECTOR) 数据类型

STD_LOGIC_VECTOR 类型定义如下:
TYPE STD_LOGIC_VECTOR IS ARRAY ( NATURAL
RANGE <> ) OF STD_LOGIC ;
康芯科技
KX
8.8 数据类型

8.8.3 其他预定义标准数据类型
1. 无符号数据类型 (UNSIGNED TYPE)

十进制的 8 可以作如下 两则无符号数据定义的示例:


表示: VARIABLE var : UNSIGNED(0 TO 10) ;
UNSIGNED'("1000") SIGNAL sig : UNSIGNED(5 TO 0) ;

2. 有符号数据类型 (SIGNED TYPE)

例如:
SIGNED'("0101") 代 表
+5 , 5
SIGNED'("1011") 代表 –
5
康芯科技
KX
8.8 数据类型

8.8.4 数组类型

限定性数组

限定性数组定义语句格式如下:
TYPE 数组名 IS ARRAY ( 数组范围 )OF 数据类
型 ;
非限定性数组

非限制性数组的定义语句格式如下:
TYPE 数组名 IS ARRAY ( 数组下标名 RANGE )OF 数据
类型 ;
康芯科技
KX
8.8.4 数组类型

【例 8-13 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY amp IS
PORT ( a1 , a2 : IN BIT_VECTOR(3 DOWNTO 0);
c1 , c2,c3 : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
b1 , b2 , b3 : INTEGER RANGE 0 TO 15;
d2,d3,d4 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END amp;
d1 <= TO_STDLOGICVECTOR(a1 AND a2); --(1)
d2 < = CONV_STD_LOGIC_VECTOR(b1,4) WHEN
CONV_INTEGER(b2)=9
else CONV_STD_LOGIC_VECTOR(b3,4); --(2)
d3 < = c1 WHEN CONV_INTEGER(c2)= 8 ELSE c3; --(3)
d4 < = c1 WHEN c2 = 8 else c3; --(4)
康芯科技
KX

【例 8-14 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY decoder3to8 IS
PORT ( input: IN STD_LOGIC_VECTOR (2 DOWNTO 0);
output: OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END decoder3to8;
ARCHITECTURE behave OF decoder3to8 IS
BEGIN
PROCESS (input)
BEGIN
output <= (OTHERS => '0');
output(CONV_INTEGER(input)) <= '1';
END PROCESS;

END behave;
康芯科技
【例 8-15 】
KX
FUNCTION To_bit (s : std_ulogic; xmap : BIT := '0') RETURN BIT ;
FUNCTION To_bitvector ( s : std_logic_vector ;
xmap : BIT := '0') RETURN BIT_VECTOR ;
FUNCTION To_bitvector ( s : std_ulogic_vector ;
xmap : BIT := '0') RETURN BIT_VECTOR ;

下面是转换函数 To_bitvector 的函数体:


FUNCTION To_bitvector ( s : std_logic_vector ;
xmap : BIT := '0' )
RETURN BIT_VECTOR IS
ALIAS sv : std_logic_vector(s'LENGTH-1 DOWNTO 0 ) IS s ;
VARIABLE result : BIT_VECTOR(s'LENGTH-1 DOWNTO 0 );
BEGIN
FOR i IN result'RANGE LOOP
CASE sv(i) IS
WHEN '0'|'L' => result(i) := '0';
WHEN '1'|'H' => result(i) := '1';
WHEN OTHERS => result(i) := xmap;
END CASE ;
END LOOP ;
RETURN result ;
END ;
康芯科技
KX
8.9 VHDL 操作符
8.9.1 逻辑操作符
表 8-1 VHDL 操作符列
类 型 操作符
表 功 能 操作数数据类型
+ 加 整数
- 减 整数
& 并置 一维数组
* 乘 整数和实数(包括浮点数)
/ 除 整数和实数(包括浮点数)
MOD 取模 整数
REM 取余 整数
SLL 逻辑左移 BIT 或布尔型一维数组
算术操作符
SRL 逻辑右移 BIT 或布尔型一维数组
SLA 算术左移 BIT 或布尔型一维数组
SRA 算术右移 BIT 或布尔型一维数组
ROL 逻辑循环左移 BIT 或布尔型一维数组
ROR 逻辑循环右移 BIT 或布尔型一维数组
** 乘方 整数
ABS 取绝对值 整数
康芯科技
KX
接上页
表 8-1 VHDL 操作符列

类 型 操作符 功 能 操作数数据类型
= 等于 任何数据类型
/= 不等于 任何数据类型
< 小于 枚举与整数类型,及对应的一维数组
关系操作符 > 大于 枚举与整数类型,及对应的一维数组
<= 小于等于 枚举与整数类型,及对应的一维数组
>= 大于等于 枚举与整数类型,及对应的一维数组
逻辑操作符 AND 与 BIT,BOOLEAN,STD_LOGIC
OR 或 BIT,BOOLEAN,STD_LOGIC
NAND 与非 BIT,BOOLEAN,STD_LOGIC
NOR 或非 BIT,BOOLEAN,STD_LOGIC
XOR 异或 BIT,BOOLEAN,STD_LOGIC
XNOR 异或非 BIT,BOOLEAN,STD_LOGIC
NOT 非 BIT,BOOLEAN,STD_LOGIC
符号操作符 + 正 整数
- 负 整数
康芯科技
KX
8.9.1 逻辑操作符

表 8-2 VHDL 操作符优先级

运算符 优先级
NOT,ABS,** 最高优先级
* ,/ ,MOD, REM
+(正号), -(负号)
+ ,-, &
SLL, SLA, SRL, SRA, ROL, ROR
=, /=, <, <=, >, >=
AND, OR, NAND, NOR, XOR, XNOR 最低优先级
康芯科技
KX
8.9.1 逻辑操作符

【例 8-16 】
SIGNAL a , b , c : STD_LOGIC_VECTOR (3 DOWNTO 0) ;
SIGNAL d , e , f , g : STD_LOGIC_VECTOR (1 DOWNTO 0) ;
SIGNAL h , I , j , k : STD_LOGIC ;
SIGNAL l , m , n , o , p : BOOLEAN ;
...
a<=b AND c; --b 、 c 相与后向 a 赋值, a 、 b 、 c 的数据类型同属 4 位长的
位矢量
d<=e OR f OR g ; -- 两个操作符 OR 相同,不需括

h<=(i NAND j)NAND k ; -- NAND 不属上述三种算符中的一种,必须加括号
l<=(m XOR n)AND(o XOR p); -- 操作符不同,必须加括号
h<=i AND j AND k ; -- 两个操作符都是 AND ,不必加括

h<=i AND j OR k ; -- 两个操作符不同,未加括号,表达错误
a<=b AND e ; -- 操作数 b 与 e 的位矢长度不一致,表达错

康芯科技
KX
8.9.2 关系操作符

【例 8-17 】
ENTITY relational_ops_1 IS
PORT ( a , b : IN BIT _ VECTOR (0 TO 3) ;
六种关系运 m : OUT BOOLEAN) ;
算操作符: END relational_ops_1 ;
ARCHITECTURE example OF relational_ops_1 IS
“ = ”( 等于 ) 、 BEGIN
output <= (a = b) ;
“/=”( 不等 END example ;
于)、
“ >”( 大于 ) 、 【例 8-18 】
ENTITY relational_ops_2 IS
“< ”( 小于 ) 、 PORT (a , b : IN INTEGER RANGE 0 TO 3 ;
m : OUT BOOLEAN) ;
“>=”( 大于等 END relational_ops_2 ;
于) ARCHITECTURE example OF relational_ops_2 IS
BEGIN
“<=”( 小于等 output <= (a >= b) ;
于) END example ;
康芯科技
KX
8.9.3 算术操作符
表 8-3 算术操作符分类

类 别 算 术 操 作 符 分 类
1 求和操作符(Adding operators) +(加),-(减), (并置)
2 求积操作符(Multiplying operators) * , / , MOD , REM
3 符号操作符(Sign operators) +(正), - (负)
4 混合操作符(Miscellaneous operators) ** , ABS
5 移位操作符(Shift operators) SLL,SRL,SLA,SRA,ROL,ROR

1. 求和操作

【例 8-19 】
VARIABLE a , b , c ,d , e ,f : INTEGER RANGE 0 TO
255 ;
...
a := b + c ; d := e – f ;
康芯科技
KX
【例 8-20 】
PROCEDURE adding_e (a :IN INTEGER ; b :INOUT INTEGER )IS
...
b := a + b ;

【例 8-21 】
PACKAGE example_arithmetic IS
TYPE small_INt IS RANGE 0 TO 7 ;
END example_arithmetic ;
USE WORK.example_arithmetic.ALL ;
ENTITY arithmetic IS
PORT (a , b : IN SMALL_INT ;
c : OUT SMALL_INT) ;
END arithmetic ;
ARCHITECTURE example OF arithmetic IS
BEGIN
c <= a + b ;
END example ;
康芯科技
KX
8.9.3 算术操作符

2. 求积操作符

求积操作符包括 * ( 乘 ) 、 / ( 除 ) 、 OD
( 取模 ) 和 RED( 取余 ) 四种操作符。

3. 符号操作符

符号操作符“ +” 和“-”的操作数只
有一个
康芯科技
KX
8.9.3 算术操作符

4. 混合操作

混合操作符包括乘方“ **” 操作符和
取绝对值“ ABS” 操作符两种

【例 8-22 】
SIGNAL a , b : INTEGER RANGE - 8 to 7 ;
SIGNAL c : INTEGER RANGE 0 to 15 ;
SIGNAL d : INTEGER RANGE 0 to 3 ;
a <= ABS(b) ;
c <= 2 ** d ;
康芯科技
KX
8.9.3 算术操作符
求积操作符包括 * ( 乘 ) 、 / ( 除 ) 、 MOD
2. 求积操作符 ( 取模 ) 和 RED( 取余 ) 四种操作符。

符号操作符“ +” 和“-”的操作数只有一个
3. 符号操作符
混合操作符包括乘方“ **” 操作符和取绝对值
4. 混合操作 “ ABS” 操作符两种

【例 8-22 】
SIGNAL a , b : INTEGER RANGE - 8 to 7 ;
SIGNAL c : INTEGER RANGE 0 to 15 ;
SIGNAL d : INTEGER RANGE 0 to 3 ;
a <= ABS(b) ;
c <= 2 ** d ;

5. 移位操作

移位操作符的语句格式是: 标识符 移位操作符 移位位数

康芯科技
KX
8.9.3 算术操作符
5. 移位操作

移位操作符的语句格式是: 标识符 移位操作符 移位位
数 ;

【例 8-23 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY decoder3to8 IS
port ( input: IN STD_LOGIC_VECTOR (2 DOWNTO 0);
output: OUT BIT_VECTOR (7 DOWNTO 0));
END decoder3to8;
ARCHITECTURE behave OF decoder3to8 IS
BEGIN
output <= "00000001" SLL CONV_INTEGER(input);-- 被移位部分是常数

END behave;
康芯科技
KX
8.10 LPM 的 VHDL 文本方式调用
8.10.1 AD 采样系统顶层电路设计

图 8-3 ADC0809 采样电路系


康芯科技
8.10.2 编辑 LPM_FIFO 设计实体 KX
选择 LPM 巨功能块编辑器

选择建立一个巨功能块

最后按键 NEXT

图 8-4 生成或修改一个定制的巨功能块
康芯科技
KX
选择功能块类型

选择巨功能表达语言为 VHDL

选择建立 FIFO 功能块


在选定的目录中确定生成
的功能块的文件名: fifo2.vhd

图 8-5 用 VHDL 定制 LPM_FIFO ,文件名: fifo2.vhd


图 8-6 选择 FIFO 数据位宽为 8 ,深度为 康芯科技
512
KX
图 8-7 fifo 端口设置 康芯科技
KX

选择含溢出标志输出

含异步清零
康芯科技
图 8-8 选择在读请求信号有效后数据输出 KX

选择同步工作模式
康芯科技
KX

选择优化方式

选择使用 EAB 设计 fifo

图 8-9 选择 Area 优化方式


图 8-10 单击“ Finish” 后完成 fifo2.vhd 的 康芯科技
定制
KX
康芯科技
8.10.3 LPM_FIFO 定制文件仿真测试 KX

将编制好的输出文件设置成工程
康芯科技
KX

打开文件
康芯科技
KX

选目标器件

原文件
康芯科技
KX
8.10.3 LPM_FIFO 定制文件仿真测试

【例 8-24 】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY fifo2 IS
PORT(data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); -- 输入数据
wrreq : IN STD_LOGIC ; -- 写入请求
rdreq : IN STD_LOGIC ; -- 读出请求
clock : IN STD_LOGIC ; -- 工作时钟
aclr : IN STD_LOGIC ; -- 异步清 0
q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); -- 数据输出
full : OUT STD_LOGIC ); -- 溢出标志
END fifo2;
ARCHITECTURE SYN OF fifo2 IS
SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0);
SIGNAL sub_wire1 : STD_LOGIC ;
COMPONENT lpm_fifo -- 调用 LPM_FIFO 声明
GENERIC (lpm_width :NATURAL; -- 类属 数据宽度 自然数数据类型
lpm_numwords :NATURAL; -- 类属 数据深度 自然数数据类型
接下页
接上页 康芯科技
KX
lpm_widthu :NATURAL; -- 类属 地址宽度 自然数数据类型
lpm_showahead :STRING; -- 类属 数据读出方式 字符串数据类型
lpm_hint : STRING ); -- 类属 优化方式 字符串数据类型
PORT ( rdreq : IN STD_LOGIC ;
aclr : IN STD_LOGIC ;
clock : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
wrreq : IN STD_LOGIC ;
data : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
full : OUT STD_LOGIC );
END COMPONENT;
BEGIN
q <= sub_wire0(7 DOWNTO 0); full <= sub_wire1;
lpm_fifo_component : lpm_fifo
GENERIC MAP ( LPM_WIDTH => 8, -- 类属映射语句,数据宽度 8 位
LPM_NUMWORDS => 512, --8 位字节数 512 个
LPM_WIDTHU => 9, -- 地址线位宽 9 位
LPM_SHOWAHEAD => "OFF", -- 关闭先行数据输出开关
-- 打开内部 EAB ,最大速度约束等级为 5
LPM_HINT => "USE_EAB=ON,MAXIMIZE_SPEED=5" )
PORT MAP (rdreq => rdreq, aclr => aclr, clock => clock,
wrreq => wrreq, data => data, q => sub_wire0,
full => sub_wire1 );
END SYN;
康芯科技
KX
8.10.3 LPM_FIFO 定制文件仿真测试

图 8-11 例 8-24 的仿真波形


康芯科技
KX

打开芯片地板
资源编辑窗

芯片地板资源编辑窗
康芯科技
KX

选择全屏幕显示
康芯科技
KX

此 FIFO 使用了
1K30 内部 16 个
单元的 EAB
康芯科技
KX
8.10.4 AD_FIFO 系统实现

【例 8-25 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY AD_FIFO IS
PORT (EOC,CLK,WR_EN,RD_EN,CLR : IN STD_LOGIC;
D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
FULL,ALE,START,OE,ADDA : OUT STD_LOGIC ;
Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );
END AD_FIFO;
ARCHITECTURE behav OF AD_FIFO IS
SIGNAL a1, b1, c1, d1 : STD_LOGIC ;
COMPONENT ADCINT
PORT ( CLK ,EOC : IN STD_LOGIC;
LOCK, ALE, START, OE,ADDA : OUT STD_LOGIC );
END COMPONENT;

接下页
康芯科技
KX
接上页

COMPONENT FIFO2
PORT (data : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
wrreq,rdreq,clock, aclr : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
full : OUT STD_LOGIC );
END COMPONENT;
BEGIN
b1 <= CLK AND WR_EN ;
c1 <= NOT WR_EN ;
a1 <= RD_EN WHEN WR_EN = '0'ELSE –-21mux 多路选择器
d1 ;
U1:ADCINT PORT MAP(CLK =>b1,EOC=>EOC,LOCK=>d1,ALE=>ALE,

START=>START,OE=>OE,ADDA=>ADDA);
U2: FIFO2 PORT MAP(data=>D,wrreq=>WR_EN,rdreq=>c1,

clock=>a1,aclr=>CLR,full=>FULL,q=>Q);
END behav;
康芯科技
KX
8.10.5 双口 RAM 定制

图 8-12 双口 RAM

图 8-13 双口 RAM 的仿真波形


康芯科技
【例 8-26 】
KX
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY RAM1 IS
PORT(address : IN STD_LOGIC_VECTOR (8 DOWNTO 0); --9 位地址输入
inclock : IN STD_LOGIC ; -- 数据写入时

we : IN STD_LOGIC ; -- 写允许信号
data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); --8 位写入数据
q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); --8 位 RAM 数据输出
END RAM1;
ARCHITECTURE SYN OF RAM1 IS
SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0);
COMPONENT lpm_ram_dq
GENERIC (lpm_width : NATURAL; -- 类属 RAM 数据宽度 自然数数据类型
lpm_widthad : NATURAL; -- 类属 RAM 地址线位宽 自然数数据类

lpm_indata,lpm_address_control,lpm_outdata,lpm_hint :
STRING);
PORT (address : IN STD_LOGIC_VECTOR (8 DOWNTO 0);
we,inclock : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
data : IN STD_LOGIC_VECTOR (7 DOWNTO 0) );
END COMPONENT;
接下页
康芯科技
KX
接上页

BEGIN
q <= sub_wire0(7 DOWNTO 0);
lpm_ram_dq_component : lpm_ram_dq GENERIC MAP -- 类属映射语句
(LPM_WIDTH => 8, -- 8 位数据宽度 自然数数据类型
LPM_WIDTHAD => 9, -- 9 位地址线宽度 自然数数据类型
LPM_INDATA => "REGISTERED", -- 寄存器锁存方式写入数据,字符串数据类型
LPM_ADDRESS_CONTROL => "REGISTERED",
-- 寄存器锁存方式写入地址,字符串数据类型
LPM_OUTDATA => "UNREGISTERED",-- 非寄存器锁存方式输出数据
LPM_HINT => "USE_EAB=ON" ) -– 允许使用 FPGA 中的 EAB
PORT MAP (address => address,inclock => inclock,
data => data, we => we,q => sub_wire0);
END SYN;
康芯科技
KX
实 验

实验 8-1 LPM 模块应用练习

((11)实验目的:学习在
)实验目的:学习在VHDL 文本描述的电路中调用LPM
VHDL文本描述的电路中调用 模块。
LPM模块。
( )实验原理:作为练习,根据图4-53
(22)实验原理:作为练习,根据图 4-53的电路原理,用
的电路原理,用LPM 模块设计
LPM模块设计
加法计数器。
加法计数器。
( )实验内容:将图4-53
(33)实验内容:将图 4-53中的元件
中的元件74374
74374,用
,用LPM_LATCH 代替,用
LPM_LATCH代替,用
纯文本方式表达图4-53
VHDL纯文本方式表达图
VHDL 4-53。给出其仿真波形,并在
。给出其仿真波形,并在EDA 实验系统上验
EDA实验系统上验
证此项设计。
证此项设计。
(( 44 )
)实实验
验思思考考题
题::修修改 改以以上 上设设计计, ,但但仍仍然
然利 利用用 LPM 模块
LPM 模 块 ,, 即

lpm_add_sub、
lpm_add_sub busmux、
、busmux 及其它的模块构成一个可预置
lpm_latch及其它的模块构成一个可预置
、lpm_latch
初值的减法计数器。
初值的减法计数器。
((55)实验报告:给出以上的实验内容,时序分析和实测结果,完成实验
)实验报告:给出以上的实验内容,时序分析和实测结果,完成实验
报告。
报告。
康芯科技
KX
实 验
实验 8-2 硬件电子琴电路设计

((11)实验目的:学习利用数控分频器设计硬件电子琴实验。
)实验目的:学习利用数控分频器设计硬件电子琴实验。
( )实验原理:主系统由33个模块组成,例
(22)实验原理:主系统由 个模块组成,例8-29 8-29是顶层设计文件,其内
是顶层设计文件,其内
部部有有两两个个功功能能模模块
块((如 如图
图 8-14
8-14 所
所示示)
):: TONE.VHD( 例 8-28)
TONE.VHD( 例 8-28) 和

(例8-27
SPEAKER.VHD(例
SPEAKER.VHD 8-27)。
)。

图 8-14 硬件电子琴电路结构
康芯科技
KX
实 验
实验 8-2 硬件电子琴电路设计

模块 TONE 是音阶发生器,当 8 位发声控制输入 INDEX 中某一位


为高电平时,则对应某一音阶的数值将从端口 TONE 输出,作为获得
该音阶的分频预置值;同时由 CODE 输出对应该音阶简谱的显示数码
,如‘ 5’ ,并由 HIGH 输出指示音阶高 8 度显示。由例 8-28 可见,
其语句结构只是类似与真值表的纯组合电路描述,其中的音阶分频预
置值,如 Tone <= 1290 是根据产生该音阶频率所对应的分频比获得
的。
模块 SPEAKER 中的主要电路是一个数控分频器,它由一个初值可
预置的加法计数器构成,详细的设计和工作原理已在第 8 章实验 3 中
作了描述。当模块 SPEAKER 由端口 TONE 获得一个 2 进制数后,将以
此值为计数器的预置数,对端口 CLK12MHZ 输入的频率进行分频,之
后由 SPKOUT 向扬声器输出发声。
康芯科技
KX
【例 8-27 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY Speaker IS
PORT ( clk1 : IN STD_LOGIC;
Tone1 : IN INTEGER RANGE 0 TO 16#7FF#;
SpkS : OUT STD_LOGIC );
END;
ARCHITECTURE one OF Speaker IS
SIGNAL PreCLK , FullSpkS : STD_LOGIC;
BEGIN
DivideCLK : PROCESS(clk1)
VARIABLE Count4 : INTEGER RANGE 0 TO 15;
BEGIN
PreCLK <= '0'; -- 将 CLK 进 11 分频, PreCLK 为 C L 11K 6 分

IF Count4 > 11 THEN PreCLK <= '1'; Count4 := 0;
ELSIF clk1'EVENT AND clk1='1' THEN Count4 := Count4 + 1;

END IF;
END PROCESS;
接下页
康芯科技
KX

GenSpkS : PROCESS(PreCLK, Tone1)


VARIABLE Count11 : INTEGER RANGE 0 TO 16#7FF#;
BEGIN -- 11 位可预置计数器
IF PreCLK'EVENT AND PreCLK = '1' THEN
IF Count11=16#7FF# THEN
Count11 := Tone1; FullSpkS <= '1';
ELSE Count11:=Count11 + 1; FullSpkS <= '0';

END IF;
END IF;
END PROCESS;
DelaySpkS : PROCESS(FullSpkS)
VARIABLE Count2 : STD_LOGIC;
BEGIN
IF FullSpkS'EVENT AND FullSpkS = '1' THEN Count2 := NOT
Count2;
IF Count2 = '1' THEN SpkS <= '1';
ELSE SpkS <= '0';
END IF;
END IF;
END PROCESS;
END;
【例 8-28 】 康芯科技
LIBRARY IEEE;
K X

USE IEEE.STD_LOGIC_1164.ALL;
ENTITY Tone IS
PORT ( Index : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CODE : OUT INTEGER RANGE 0 TO 15;
HIGH : OUT STD_LOGIC;
Tone : OUT INTEGER RANGE 0 TO 16#7FF# );
END;
ARCHITECTURE one OF Tone IS
BEGIN
Search : PROCESS(Index)
BEGIN
CASE Index IS -- 译码电路,查表方式,控制音调的预置数
WHEN "00000001" => Tone <= 773; CODE <= 1; HIGH <= '0';

WHEN "00000010" => Tone <= 912; CODE <= 2; HIGH <= '0';

WHEN "00000100" => Tone <= 1036; CODE <= 3; HIGH <= '0';
WHEN "00001000" => Tone <= 1116; CODE <= 4; HIGH <= '0';
WHEN "00010000" => Tone <= 1197; CODE <= 5; HIGH <= '0';

WHEN "00100000" => Tone <= 1290; CODE <= 6; HIGH <= '0';

WHEN "01000000" => Tone <= 1372; CODE <= 7; HIGH <= '0';
【例 8-29 】 康芯科技
LIBRARY IEEE; K X
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY TOP IS -- 顶层设计
PORT ( CLK12MHZ : IN STD_LOGIC;
INDEX1 : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CODE1 : OUT INTEGER RANGE 0 TO 15;
HIGH1,SPKOUT : OUT STD_LOGIC );
END;
ARCHITECTURE one OF TOP IS
COMPONENT Tone
PORT ( Index : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CODE : OUT INTEGER RANGE 0 TO 15;
HIGH : OUT STD_LOGIC;
--11 位 2 进制数
Tone : OUT INTEGER RANGE 0 TO 16#7FF# );
END COMPONENT;
COMPONENT Speaker
PORT( clk1 : IN STD_LOGIC;
Tone1 : IN INTEGER RANGE 0 TO 16#7FF#;--11 位 2 进制数
SpkS : OUT STD_LOGIC );
END COMPONENT;
SIGNAL Tone2 : INTEGER RANGE 0 TO 16#7FF#;
BEGIN -- 安装 u1, u2
u1 : Tone PORT MAP (Index=>Index1,Tone=>Tone2,
CODE=>CODE1,HIGH=>HIGH1);
u2 : Speaker PORT MAP (clk1=>CLK12MHZ,Tone1=>Tone2,
SpkS=>SPKOUT );
END;
康芯科技
KX
实 验
实验 8-2 硬件电子琴电路设计

( 3 )实验内容 1 :编译适配以上 3 个示例文件,给出仿真波形


,最后进行下载和硬件测试实验。建议使用实验电路模式“ 3” (附
图 1-5 ),用短路帽选择“ CLOCK9” 的输入频率选择 12MHz ,此信
号作为系统输入信号 CLK12MHZ ;键 8 至键 1 作为 INDEX 输入信号
控制各音阶;选择数码管 1 显示琴音简谱码,发光管 D1 显示高 8 度。
( 4 )实验内容 2 :在原设计的基础上,增加一个 NOTETABS 模
块(如图 8-15 所示),用于产生节拍控制( INDEX 数据存留时间)
和音阶选择信号,即在 NOTETABS 模块放置一个乐曲曲谱真值表,由
一个计数器的计数值来控制此真值表的输出,而由此计数器的计数时
钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲自
动演奏电路。试完成此项设计,并在 EDA 实验系统上的 FPGA 目标器
件中实现之。
( 5 )思考题 1 :例 8-27 中的进程 DelaySpkS 对扬声器发声有
什么影响?
( 6 )思考题 2 :在电路上应该满足哪些条件,才能用数字器件
直接输出的方波驱动扬声器发声?
康芯科技
KX
实 验
实验 8-2 硬件电子琴电路设计

图 8-15 硬件乐曲演奏电路结构

( 7 )实验报告:用仿真波形和电路原理图,详细叙述硬件电子琴的工
作原理及其 3 个 VHDL 文件中相关语句的功能,叙述硬件实验情况,提出硬
件乐曲演奏电路的设计和实验方案。
康芯科技
KX

简谱码 可以选择
模式 9

用键选择演
奏何首乐曲:
第 3 首乐曲
康芯科技
KX
实 验
实验 8-3 波形发生与扫频信号发生器电路设计

((11)实验目的:学习用
)实验目的:学习用VHDL 设计波形发生器和扫频信号发生器,掌握
VHDL设计波形发生器和扫频信号发生器,掌握
FPGA对
FPGA 的接口和控制技术,学会LPM_ROM
D/A的接口和控制技术,学会
对D/A 在波形发生器设计中的
LPM_ROM在波形发生器设计中的
实用方法。
实用方法。

8-16所示,完整的波形发生器由
)实验原理:如图8-16
(22)实验原理:如图
( 所示,完整的波形发生器由44部分组成:
部分组成:

首先是 FPGA 中的波形发生器控制电路,它通过外来控制信号和


高速时钟信号,向波形数据 ROM 发出地址信号,输出波形的频率由
发出的地址信号的速度决定;当以固定频率扫描输出地址时,模拟输
出波形是固定频率,而当以周期性时变方式扫描输出地址时,则模拟
输出波形为扫频信号。
康芯科技
KX
实 验
实验 8-3 波形发生与扫频信号发生器电路设计

波形数据 ROM 中存有发生器的波形数据,如正弦波或三角波数


据。当接受来自 FPGA 的地址信号后,将从数据线输出相应的波形
数据,地址变化得越快,则输出数据的速度越快,从而使 D/A 输出
的模拟信号的变化速度越快。波形数据 ROM 可以由多种方式实现,
如在 FPGA 外面外接普通 ROM ;由逻辑方式在 FPGA 中实现(如
例 8-30 );或由 FPGA 中的 EAB 模块担当,如利用 LPM_ROM 实
现。相比之下,第 1 种方式的容量最大,但速度最慢;,第 2 种方式
容量最小,但速度最快;第 3 种方式则兼顾了两方面的因素;

D/A 转换器负责将 ROM 输出的数据转换成模拟信号,经滤波电


路后输出。输出波形的频率上限与 D/A 器件的转换速度有重要关系,
本例采用 DAC0832 器件。
康芯科技
KX
实 验
实验 8-3 波形发生与扫频信号发生器电路设计

DAC0832 是 8 位 D/A 转换器,转换周期为 1µs ,其引脚信号以及


与 FPGA 目标器件典型的接口方式如附图 1-15 所示。其参考电压与
+ 5V 工作电压相接(实用电路应接精密基准电压)。 DAC0832 的
引脚功能简述如下:

ILE ( PIN 19 ):数据锁存允许信号,高电平有效,系统板上已直接连在+


5V 上。
WR1 、 WR2 ( PIN 2 、 18 ):写信号 1 、 2 ,低电平有效。
XFER(PIN 17) :数据传送控制信号,低电平有效。
VREF ( PIN 8 ):基准电压,可正可负,- 10V ~+ 10V 。
RFB ( PIN 9 ):反馈电阻端。
IOUT1/IOUT2(PIN 11 、 12) :电流输出端。 D/A 转换量是以电流形式输
出的,所以必须如实验结构图 NO.5C 所示连接方式将电流信号变为电压信号。
AGND/DGND ( PIN 3 、 10 ):模拟地与数字地。在高速情况下,此二 GND
地的连接线必须尽可能短,且系统的单点接地点须接在此连线的某一点上。
康芯科技
KX
实 验
实验 8-3 波形发生与扫频信号发生器电路设计

例 8-30 中的正弦波波型数据由 64 个点构成,此数据经


DAC0832 ,并经滤波器后,可在示波器上观察到光滑的正弦波 ( 若
接精密基准电压,可得到更为清晰的正弦波形 ) 。
(33)实验内容
( )实验内容11:根据示例例 8-30,及以上的设计原理,完成波形发生
:根据示例例8-30 ,及以上的设计原理,完成波形发生
器和扫频信号源的设计,仿真测试及实验系统上的硬件测试。
器和扫频信号源的设计,仿真测试及实验系统上的硬件测试。

硬件实验中注意 DAC0832 及滤波电路须接有 +/-12V 电压。然后将实验系统


左下角选择插针处用短路帽短路“ D/A 直通”,而“滤波 1” ,“滤波 0” 处通
过短路或不接短路帽达到不同的滤波方式。将示波器的地与 EDA 实验系统的地相
接,信号端与“ AOUT” 信号输出端相接;建议 CLK 接 clock0 ,由此 50MHz 频
率,此频率扫描波形数据; CLK1 接 clock5 ,由此接“ 1024Hz” ,此频率决定
扫频速度;选电路模式 1 ; KK 接键 8 ,当为高电平时,正弦波点频输出, 11 位
输入数据 DATA 由键 3 、键 2 和键 1 控制,信号源的输出频率由此 3 键输入的 12
位二进制数决定,数值越大,输出频率越高;“ FD0” 时为最高频率;键 8 低电平
时,正弦波扫频输出,扫频速度由 clock5 的频率决定。输向 0832 的 8 位数据由
DD 输出。
康芯科技
KX
实 验
实验 8-3 波形发生与扫频信号发生器电路设计

图 8-16 波形发生器电路系统结构图

((44)实验内容 8-30中插如一个
:在例8-30
)实验内容22:在例 中插如一个LPM_ROM ,将原例中的波形数
LPM_ROM,将原例中的波形数
据放在内部ROM
据放在内部 中(利用本章第10
ROM中(利用本章第 10节和第
节和第44章第
章第33节介绍的方法,为例
节介绍的方法,为例88
-30定制波形数据
-30 定制波形数据ROM ,并完成mif
ROM,并完成 数据文件的编辑。必要时增加波形点
mif数据文件的编辑。必要时增加波形点
数,以利低频输出时,仍保持良好波形。波形数据可由其它方式自动生成
数,以利低频输出时,仍保持良好波形。波形数据可由其它方式自动生成
),然后重复以上的测试和硬件实验。
),然后重复以上的测试和硬件实验。
康芯科技
KX
实 验

实验 8-3 波形发生与扫频信号发生器电路设计

(55)思考题:如果
( )思考题:如果CLK 的输入频率是50MHz
CLK的输入频率是 50MHz, 中一个周期的正弦
ROM中一个周期的正弦
,ROM
波数据是128
波数据是 128个,要求输出的正弦波频率不低于
个,要求输出的正弦波频率不低于150KHz
150KHz,
,0832 是否能
0832是否能
适应此项工作?为什么?
适应此项工作?为什么?

(66)实验报告:作出本项实验设计的完整电路图,详细说明其工作原理
( )实验报告:作出本项实验设计的完整电路图,详细说明其工作原理
,叙述例8-30
,叙述例 8-30的工作原理,以及基于
的工作原理,以及基于LPM_ROM
LPM_ROM的 电路设计的详细
VHDL电路设计的详细
的VHDL
内容和测试、实验内容。
内容和测试、实验内容。
康芯科技
KX
【例 8-30 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DAC IS
PORT ( CLK,CLK1,KK : IN STD_LOGIC;
DATA : IN STD_LOGIC_VECTOR(11 DOWNTO 0);
DD : OUT INTEGER RANGE 255 DOWNTO 0 );
END;
ARCHITECTURE DACC OF DAC IS
SIGNAL Q : INTEGER RANGE 63 DOWNTO 0 ;
SIGNAL D : INTEGER RANGE 255 DOWNTO 0 ;
SIGNAL FSS : STD_LOGIC ;
SIGNAL COUNT12,DATA2,DATA1 : STD_LOGIC_VECTOR(11 DOWNTO
0) ;
BEGIN
PROCESS(FSS)
BEGIN
IF (FSS'EVENT AND FSS = '1') THEN Q <= Q + 1;
END IF;
END PROCESS;
PROCESS(Q)
接下页
康芯科技
KX
BEGIN
CASE Q IS
WHEN 00=> D<=255; WHEN 01=> D<=254; WHEN 02=> D<=252; WHEN 03=> D<=249;
WHEN 04=> D<=245; WHEN 05=> D<=239; WHEN 06=> D<=233; WHEN 07=> D<=225;
WHEN 08=> D<=217; WHEN 09=> D<=207; WHEN 10=> D<=197; WHEN 11=> D<=186;
WHEN 12=> D<=174; WHEN 13=> D<=162; WHEN 14=> D<=150; WHEN 15=> D<=137;
WHEN 16=> D<=124; WHEN 17=> D<=112; WHEN 18=> D<= 99; WHEN 19=> D<= 87;
WHEN 20=> D<= 75; WHEN 21=> D<= 64; WHEN 22=> D<= 53; WHEN 23=> D<= 43;
WHEN 24=> D<= 34; WHEN 25=> D<= 26; WHEN 26=> D<= 19; WHEN 27=> D<= 13;
WHEN 28=> D<= 8; WHEN 29=> D<= 4; WHEN 30=> D<= 1; WHEN 31=> D<= 0;
WHEN 32=> D<= 0; WHEN 33=> D<= 1; WHEN 34=> D<= 4; WHEN 35=> D<= 8;
WHEN 36=> D<= 13; WHEN 37=> D<= 19; WHEN 38=> D<= 26; WHEN 39=> D<= 34;
WHEN 40=> D<= 43; WHEN 41=> D<= 53; WHEN 42=> D<= 64; WHEN 43=> D<= 75;
WHEN 44=> D<= 87; WHEN 45=> D<= 99; WHEN 46=> D<=112; WHEN 47=> D<=124;
WHEN 48=> D<=137; WHEN 49=> D<=150; WHEN 50=> D<=162; WHEN 51=> D<=174;
WHEN 52=> D<=186; WHEN 53=> D<=197; WHEN 54=> D<=207; WHEN 55=> D<=217;
WHEN 56=> D<=225; WHEN 57=> D<=233; WHEN 58=> D<=239; WHEN 59=> D<=245;
WHEN 60=> D<=249; WHEN 61=> D<=252; WHEN 62=> D<=254; WHEN 63=> D<=255;
WHEN OTHERS => NULL ;
END CASE;
END PROCESS;
DD <= D ;
PROCESS(CLK, DATA)
接下页
康芯科技
KX
BEGIN
IF CLK'EVENT AND CLK = '1' THEN
IF COUNT12 = "111111100000" THEN COUNT12 <= DATA1; FSS
<= '1';
ELSE COUNT12 <= COUNT12 + 1; FSS <= '0';

END IF;
END IF;
END PROCESS;
DATA1 <= DATA WHEN KK = '1' ELSE
DATA2 WHEN KK = '0' ELSE
DATA2 ;
PROCESS(CLK1)
BEGIN
IF (CLK1'EVENT AND CLK1 = '1') THEN DATA2 <= DATA2 + 1;
END IF;
END PROCESS;
END;
康芯科技
KX
注意滤波电路

注意实验板上 DAC0832
的线路连接原理图,
并选择实验电路模式 1

注意目标器件与
0832 相接的引脚
端口与数码管的
引脚有部分重合
康芯科技
KX

确定引脚名,
锁定引脚
选择实验电路
模式 1

扫频或数控
输出选择键
输出频率数控低
输出频率数控中
4 位输入控制键
4 位输入控制键
示波器接入

输出频率数控高
4 位输入控制键
康芯科技
KX

输出频率数控低
4 位: 2
输出频率数
控方式输出

输出频率数控中
4 位: 3

输出频率数控高
4 位: B
康芯科技
0832 信号输出
未接滤波电阻: KX
拨码向上

示波器接入
康芯科技
KX
输出波形未滤波
康芯科技
KX
输出波形未滤波
康芯科技
KX
输出波形未滤波
康芯科技
0832 信号输出接
上了滤波电阻:
KX
拨码向下

模拟信号输出口
康芯科技
KX
接有滤波电阻
后的输出波形
康芯科技
KX
接有滤波电阻
后的输出波形
康芯科技
KX
接有滤波电阻
后的输出波形

You might also like