第八章 VHDL结构
第八章 VHDL结构
第八章 VHDL结构
第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 ( 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;
由于 PORT 说明语句是对一个设计实体界面的说明及对设
计实体与外部电路的接口通道的说明,其中包括对每一接口
的输入输出模式和数据类型的定义。其格式如下:
其中的端口名是设计者为实体的每一个对外通道所取的
名字,端口模式是指这些通道上的数据流动方式。数据类型
是指端口上流动的数据的表达格式或取值类型, VHDL 要求
只有相同数据类型的端口信号和操作数才能相互作用。
康芯科技
KX
8.2 结构体
结构体的组成部分是:
• 对数据类型、常数、信号、子程序和元件等元素的说明
部分。
• 描述实体逻辑行为的、以各种不同的描述风格表达的功
能描述语句。
• 以元件例化语句为特征的外部元件(设计实体)端口间
的连接。
ARCHITECTURE 结构体名 OF 实体
名 IS
1. 结构体的一般语言格式 [ 说明语句 ]
BEGIN
[ 功能描述语句 ]
END ARCHITECTURE 结构体名 ;
康芯科技
KX
8.2 结构体
2. 结构体说明语句
进程语句
信号赋值语句
3. 功能描述语句结
构 子程序调用语句
元件例化语句
康芯科技
KX
8.3 子程序 (SUBPROGRAM)
函数的语言表达格式如下:
函数的语言表达格式如下:
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
接上页
【例 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
接上页
过程的语句格式是:
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
程序包
定义程序包的一般语句结构如下:
PACKAGE 程序包名 IS -- 程序
包首
程序包首说明部分
END 程序包名 ;
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 配置
配置可以把特定的结构体
配置可以把特定的结构体
关联到(指定给)一个确定的实体。
关联到(指定给)一个确定的实体。
配置语句的一般格式如下:
整数:整数都是十进制的数,如:
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)
规则:
有效的字符:包括 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 数据类型
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 的预定义数据类型
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 数据类型
STD_LOGIC_VECTOR 类型定义如下:
TYPE STD_LOGIC_VECTOR IS ARRAY ( NATURAL
RANGE <> ) OF STD_LOGIC ;
康芯科技
KX
8.8 数据类型
8.8.3 其他预定义标准数据类型
1. 无符号数据类型 (UNSIGNED 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 ;
类 型 操作符 功 能 操作数数据类型
= 等于 任何数据类型
/= 不等于 任何数据类型
< 小于 枚举与整数类型,及对应的一维数组
关系操作符 > 大于 枚举与整数类型,及对应的一维数组
<= 小于等于 枚举与整数类型,及对应的一维数组
>= 大于等于 枚举与整数类型,及对应的一维数组
逻辑操作符 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 逻辑操作符
运算符 优先级
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 采样系统顶层电路设计
选择建立一个巨功能块
最后按键 NEXT
图 8-4 生成或修改一个定制的巨功能块
康芯科技
KX
选择功能块类型
选择巨功能表达语言为 VHDL
选择含溢出标志输出
含异步清零
康芯科技
图 8-8 选择在读请求信号有效后数据输出 KX
选择同步工作模式
康芯科技
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 定制文件仿真测试
打开芯片地板
资源编辑窗
芯片地板资源编辑窗
康芯科技
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
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
实 验
((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 硬件电子琴电路设计
END IF;
END PROCESS;
接下页
康芯科技
KX
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 硬件电子琴电路设计
图 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部分组成:
部分组成:
图 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
接有滤波电阻
后的输出波形