1
硬件执行:并发执行( VHDL本质)
仿真执行:顺序执行、并发执行
分为两大类:顺序( Sequential)描述语句
并发( Concurrent) 描述语句
ARCHITECTURE
Process Process
ENTITY
Sequential
Process
Combinational
Process
ports ports
component
§ 3.4 VHDL顺序语句( Sequential)
2
顺序描述语句,
执行顺序与书写顺序一致,与传统软件设计
语言的特点相似。顺序语句只能用在进程与子程
序中。
可描述组合逻辑、时序逻辑。
常用的顺序描述语句,
赋值语句; if语句; case语句; loop语句;
next语句; exit语句;子程序; return语句;
wait语句; null语句。
3
一 对象与赋值语句
1,VHDL中常用的 5 种对象,
1)简单名称,如 my_var;
2)索引名称,如 my_array_var(3);
3)片断名称,如 my_array_var(3 to 6);
4)记录域名,如 my_record.a_field;
5)集合,如 (my_var1,my_var2)。
所有对象均分为:变量和信号
对象, = 表达式; -- 变量赋值
对象 < = 表达式; -- 信号赋值
要求:表达式的值必须与对象的类型、宽度一
致。
4
2、变量赋值与信号赋值
变量与信号的差异,
1)赋值方式的不同,
变量,= 表达式;
信号 < = 表达式;
2)硬件实现的功能不同,
信号代表电路单元、功能模块间的互联,
代表实际的硬件连线;
变量代表电路单元内部的操作,代表暂
存的临时数据。
5
3)有效范围的不同,
信号:程序包、实体、结构体;全局量。
变量:进程、子程序;局部量。
ARCHITECTURE
{SIGNAL Declarations}
label1,PROCESS
{VARIABLE Declarations}
label2,PROCESS
{VARIABLE Declarations}

6
4)赋值行为的不同,
信号赋值延迟更新数值、时序电路;
变量赋值立即更新数值、组合电路。
5)信号的多次赋值
a,一个进程:最后一次赋值有效
b,多个进程:多源驱动
线与、线或、三态
7
例:信号的多次赋值
architecture rtl of ex is
signal a, std_logic;
begin
process(…)
begin
a <= b;

a <= c;
end process;
end rtl;
architecture rtl of ex is
signal a, std_logic;
begin
process(…)
begin
a <= b;

end process;
process(…)
begin
a <= c;
,.,
end process;
end ex;
8
例:信号赋值与变量赋值的比较
信号赋值,
architecture rtl of sig is
signal a,b, std_logic; -- 定义信号
begin
process(a,b)
begin
a <= b ;
b <= a ;
end process ;
end rtl ; -- 结果是 a 和 b 的值互换
9
变量赋值,
architecture rtl of var is
begin
process
variable a,b:std_logic; -- 定义变量
begin
a,= b ;
b,= a ;
end process ;
end rtl;
-- 结果是 a和 b的值都等于 b的初值
10
例:变量赋值实现循环语句功能
process(indicator,sig)
variable temp, std_logic;
begin
temp,= ?0? ;
for i in 0 to 3 loop
temp:=temp xor (sig(i) and indicator(i));
end loop ;
output <= temp;
end process;
11
以上语句等效为,
process(indicator,sig)
variable temp, std_logic ;
begin
temp,= ?0? ;
temp,=temp xor (sig(0) and indicator(0));
temp,=temp xor (sig(1) and indicator(1));
temp,=temp xor (sig(2) and indicator(2));
temp,=temp xor (sig(3) and indicator(3));
output <= temp ;
end process ;
12
如改为信号,则无法实现原功能,
……
signal temp, std_logic;
……
process(indicator,sig,temp)
begin
temp<= ?0? ;
temp<=temp xor (sig(0) and indicator(0));
temp<=temp xor (sig(1) and indicator(1));
temp<=temp xor (sig(2) and indicator(2));
temp<=temp xor (sig(3) and indicator(3));
output <= temp ;
end process ;
13
二,转向控制 语句
转向控制语句通过条件控制开关决定是否执
行一条或几条语句,或重得执行一条或几条语句,
或跳过一条或几条语句。
分为五种,
if 语句,case 语句,
loop 语句,next 语句,
exit 语句
14
1,if 语句
if 语句执行一序列的语句,其次序依赖于一
个或多个条件的值。
1) if 语句的门闩控制
例,if (ena = ?1?) then
q <= d;
end if;
综合后生成锁存器( latch)
if 条件 then
顺序处理语句;
end if ;
15
条件改为时钟沿,则生成 D触发器,
16
2) if 语句的二选择控制
格式,
用条件来选择两条不同程序执行的路径。
if 条件 then
顺序处理语句;
else
顺序处理语句;
end if ;
17
此描述的典型电路是二选一电路,
architecture rtl of mux2 is
begin
process(a,b,sel)
begin
if (sel = ?1?) then
y <= a ;
else
y <= b ;
end if ;
end process ;
end rtl ;
18
3) if 语句的多选择控制
if 语句的多选择控制又称为 if 语句的
嵌套。
格式,if 条件 then
顺序处理语句;
elsif 条件 then
顺序处理语句;

elsif 条件 then
顺序处理语句;
else
顺序处理语句;
end if;
19
典型电路是多选一 (四选一 )电路。
20
if_then_elsif 语句中隐含了优先级别的判断,
最先出现的条件优先级最高,可用于设计具有优
先级的电路。如 8-3优先级编码器。
library ieee;
use ieee.std_logic_1164.all;
entity coder is
port(input,in std_logic_vector(7 downto 0);
output,out std_logic_vector(2 downto 0));
end coder;
21
architecture art of coder is
begin
process(input)
begin
if input(7)=?0? then
output<=“000”;
elsif input(6)=?0? then
output<=“001”;
elsif input(5)=?0? then
output<=“010”;
elsif input(4)=?0? then
output<=“011”;
22
elsif input(3)=?0? then
output<=“100”;
elsif input(2)=?0? then
output<=“101”;
elsif input(1)=?0? then
output<=“110”?;
else
output<=“111”;
end if;
end process;
end art;
23
2,case 语句
case 语句常用来描述总线或编码、译码行为。
可读性比 if 语句强。
格式如下,
case 表达式 is
when 分支 条件 => 顺序处理语句;
when 分支 条件 => 顺序处理语句;
when 分支 条件 => 顺序处理语句;
end case;

24
其中的分支条件可有以下的形式,
when 值 => 顺序处理语句;
when 值 to 值 => 顺序处理语句;
when 值 |值 |值 |… |值 => 顺序处理语句;
以上三种方式的混合;
when others => 顺序处理语句;
25
Case 语句使用注意,
1)分支条件的值必须在表达式的取值范围内。
2)两个分支条件不能重叠。
3) CASE语句执行时必须选中,且只能选中一
个分支条件。
4)如果没有 others分支条件存在,则分支条
件必须覆盖表达式所有可能的值。
对 std_logc,std_logic_vector数据类型
要特别注意使用 others分支条件。
26
例:用 case 语句描述四选一电路
27
例,case 语句的误用
signal value:integer range 0 to 15;
signal out_1, bit ;
case value is -- 缺少 when条件 语句
end case ;
case value is -- 分支条件不包含 2到 15
when 0 => out_1 <= ?1? ;
when 1 => out_1 <=?0? ;
end case ;
case value is -- 在 5到 10上发生重叠
when 0 to 10 => out_1 <= ?1? ;
when 5 to 15 => out_1 <= ?0? ;
end case ;
28
例:根据输入确定输出值
library ieee;
use ieee.std_logic_1164.all;
entity mux41 is
port(s4,s3,s2,s1,in std_logic;
z4,z3,z2,z1,out std_logic);
end mux41;
architecture art of mux41 is
begin
process(s4,s3,s2,s1)
variable sel,integer range 0to15;
begin
sel:=0;
29
if s1=?1? then sel:=sel+1; end if;
if s2=?1? then sel:=sel+2; end if;
if s3=?1? then sel:=sel+4; end if;
if s4=?1? then sel:=sel+8; end if;
z1<=?0?; z2<=?0?; z3<=?0?; z4<=?0?;
case sel is
when 0 =>z1<=?1?;
when 1|3 =>z2<=?1?;
when 4 to 7|2 =>z3<=?1?;
when others =>z4<=?1?;
end case;
end process;
end art;
30
3,Loop 语句
loop 语句与其它高级语言中的循环语句
相似。 Loop 语句有三种格式。
1) 无限 loop 语句
VHDL重复执行 loop 循环内的语句,
直至遇到 exit 语句结束循环。
[loop_label],LOOP
--sequential statement
EXIT loop_label ;
END LOOP;
31
……
L2,loop
a:=a+1;
exit L2 when a >10;
end loop L2;
……
32
2) for … loop 语句
特点,
① 循环变量是 loop 内部自动声明的 局部量,
仅在 loop 内可见 ;不需要指定其变化方式 。
② 离散范围必须是可计算的整数范围,
整数表达式 to 整数表达式
整数表达式 downto 整数表达式
[标号 ],for 循环变量 in 离散范围 loop
顺序处理语句;
end loop [标号 ];
33
例:用 for … loop 语句描述的 8位奇偶校验电路
--奇校验
34
8位奇校验电路仿真结果,
35
将变量 tmp的初值改为 ‘ 0?,则为偶校验电路,
36
3) while … loop 语句
例,sum:=0;
i:=0;
abcd,while (i<10) loop
sum:=sum+i;
i:=i+1;
end loop abcd;
注:循环变量 i 需事先定义、赋初值,并指定
其变化方式。一般综合工具不支持 while …
loop 语句。
[标号 ],while 循环 条件 loop
顺序处理语句;
end loop [标号 ];
37
例:用 while… loop 语句描述的 8位奇偶校验电路
38
4,Next 语句
在 loop 语句中 next语句用来跳出本次循
环。
格式,
分三种情况,
1)
无条件终止当前的循环,跳回到本次循环
LOOP语句开始处,开始下次循环。
next [标号 ] [when 条件表达式 ];
next ;
39
2)
无条件终止当前的循环,跳转到指定标号
的 LOOP语句开始处,重新开始执行循环操作。
3)
当条件表达式的值为 true,则执行 next语
句,进入跳转操作,否则继续向下执行。
next [标号 ] ;
next [标号 ] [when 条件表达式 ];
40
例,
L1,while i<10 loop
L2,while j<20 loop

next L1 when i=j;

end loop L2;
end loop L1;
41
例,
L_X,for cnt_value in 1 to 8 loop
S,a(cnt_value):= ?0?;
k:=0;
L_Y,loop
S2,b(k):=?0?;
next L_X when (e > f);
S3,b(k+8);=?0?;
k:=k+1;
next loop L_Y;
next loop L_X;
42
5,Exit 语句
exit 语句将结束 循环状态。
格式,
next语句与 exit语句的格式与操作功能
非常相似,区别是,next语句是跳向 loop语句
的起始点,而 exit语句则是跳向 loop语句的终
点。
exit [标号 ] [when 条件表达式 ];
43
例,process(a)
variable int_a,integer;
begin
int_a,= a ;
for i in 0 to max_limit loop
if (int_a <= 0 ) then
exit;
else int_a,= int_a - 1 ;
end if ;
end loop ;
end process ;
44
例:比较两个数的大小
signal a,b, std_logic_vector(3 downto 0);
signal a_less_than_b, boolean;
……
a_less_than_b<=false;
for i in 3 downto 0 loop
if a(i)=?1? and b(i)=?0? then
a_less_than_b<=false; exit;
elsif a(i)=?0? and b(i)=?1? then
a_less_than_b<=true; exit;
else null;
end if;
end loop;
45
三 wait 语句
进程在仿真时的两个状态,
执行或挂起。
进程状态的变化受 wait 语句或敏感信号量变
化的控制。
可设臵 4种不同的条件,
wait -- 无限等待
wait on -- 敏感信号量变化
wait until -- 条件满足(可综合)
wait for -- 时间到
46
1,wait on 语句
格式,
例:以下两种描述是完全等价的
敏感信号量列表和 wait 语句只能选其一,两
者不能同时使用。
wait on 信号 [,信号 ];
process(a,b)
begin
y<= a and b;
end process;
process
begin
y<= a and b;
wait on a,b;
end process;
47
2,wait until 语句(可综合)
格式,
当表达式的值为 ? 真 ? 时,进程被启动,否

进程被挂起。
wait until 语句的三种表达方式,
wait until 信号 = value;
wait until 信号 ’ event and 信号 = value;
wait until not(信号 ’ stable) and 信号 =
value;
wait until 表达式;
48
时钟信号 clk 的上升沿的描述,
wait until clk = ?1?;
wait until rising_edge(clk);
wait until clk?event and clk = ?1?;
wait until not(clk?stable) and clk=?1?;
由以上描述可实现相同的硬件电路结构。
时钟信号下降沿的描述?
49
例:用 wait until语句描述时钟沿,实现 D触发器
architecture rtl of d is
begin
process
begin
wait until clk'event and clk='1';
q <= d;
end process;
end rtl;
50
例:求平均电路
process
begin
wait until clk'event and clk = ?1? ;
ave <= a;
wait until clk'event and clk = ?1? ;
ave <= ave + a ;
wait until clk'event and clk = ?1? ;
ave <= ave + a ;
wait until clk'event and clk = ?1? ;
ave <= (ave + a)/4;
end process;
51
例:同步复位功能电路
process
begin
rst_loop,loop
wait until clk?event and clk=?1?;
if rst=?1? then
x<=?0?;
else
x<=a;
end if;
end loop rst_loop;
end process;
52
四,子程序调用语句
定义:子程序是独立的、有名称的算法。
过程( Procedure) 和函数( Function)
过程,0 个或多个 in,inout、或 out 参数。
函数,0 个或多个 in 参数,一个 return 值。
子程序首:指明其名称、参数及返回值。
子程序体:描述子程序要实现的功能。
53
子程序调用:在任何地方根据其名称调用子程序
过程调用,
procedure_name (
[parameter_ name =>] expression
{,[parameter_ name =>] expression}) ;
函数调用,
function_name (
[parameter_name =>] expression
{,[parameter_name => ] expression}) ;
54
五,return 语句
return 语句只能用于子程序中,并用来 终止
一个子程序的执行。
格式,
分为,1) return ;
用于过程,只是结束过程,不返回任何值。
2) return 表达式;
用于函数,并且必须返回一个值。
return [表达式 ];
55
例:用于过程的 return语句
procedure rs (s,r,in std_logic;
q,nq, inout std_logic) is
begin
if s=?1? and r=?1? then
report,forbidden state,s and r
are equal to ?1?,;
return;
else
q<=s and nq after 5 ns;
nq<= a and q after 5 ns;
end if;
end procedure rs;
56
例:用于函数的 return语句
function opt (a,b,sel,std_logic )
return std_logic is
begin
if sel = ?1? then
return ( a and b );
else
return (a or b );
end if;
end function opt;
57
六 null 语句
null为空语句,不作任何操作。格式,null;
58
七、其它语句和说明
属性( attribute)描述,
属性是某一对象的特征表示,是一个内
部预定义函数。格式为,
综合器支持的属性有,
left,right,high,low,
range,rverse_range,length,
event,stable
对象名’属性标识

59
属性 ’ event
对在当前的一个极小的时间段 Δ 内发生的事件
的情况进行检测。如发生事件,则返回 true,否
则返回 false。
发生事件:信号电平发生变化。
clock?event
clock=?1?
clock?event clock=?0?
clock?event
60
时钟信号的上升沿描述,
clock?event and clock = ?1?
时钟信号的下降沿描述,
clock?event and clock = ?0?
上升沿触发器描述,
process(clock)
begin
if clock?event and clock = ?1? then
q <= data ;
end if ;
end process;
61
属性 ’ stable
属性 ’ stable 的测试功能与 ’ event刚好相
反,
信号在 Δ 时间段内无事件发生,则返回 true,否
则返回 false。
以下两语句的功能相同,
clock?event and clock = ?1?
not ( clock?stable ) and clock = ?1?
62
第 3章 习题二
1、信号与变量的区别有哪些?信号可以用来描
述哪些硬件特性?
2,if 语句可分为哪几种类型?如何用嵌套式
if语句描述具有优先级的电路?
3,case 语句有什么特点?其分支条件使用时有
哪些注意事项?
4,loop 语句的类型有哪些?其循环变量有什么
特点?
5,next 语句与 exit 语句的区别是什么?
6,wait 语句有哪些类型? wait 语句在进程中
的作用是什么?与敏感信号表有什么关系?
63
§ 3.5 VHDL并发语句( Concurrent)
Architecture
并发语句
并发语句
并发语句
信号
信号
信号
64
常用的并发描述语句有,
? 进程( process)语句,
? 块( block)语句,
? 顺序描述语句的并行版本,
? 并行过程调用语句,
? 元件例化语句,
? 生成语句。
65
一、进程( process)语句
进程( process)语句最具 VHDL语言特色。提
供了一种用算法描述硬件行为的方法。
特点,
1、进程与进程,或其它并发语句之间的并发性;
2、进程内部的顺序性;
3、进程的启动与挂起;
4、进程与进程,或其它并发语句之间的通信。
66
进程语句
process
信号
信号
信号
进程语句
process
进程语句
process
67
敏感信号表:进程内要读取的所有敏感信号
(包括端口)的列表。每一个敏感
信号的变化,都将启动进程。
格式,
[标记,] process [( 敏感信号表 )]
{ 进程说明项 }
begin
{ 顺序描述语句 }
end process [标记 ];
信号名称 {,信号名称 }
68
敏感信号表的特点,
1、同步进程的敏感信号表中只有时钟信号。
如,
process(clk)
begin
if(clk?event and clk = ?1?) then
if reset = ?1? then
data <=,00”;
else
data <= in_data;
end if;
end if;
end process;
69
2、异步进程敏感信号表中除时钟信号外,还有其
它信号。
例,
process(clk,reset)
begin
if reset = ?1? then
data <=,00”;
elsif(clk?event and clk = ?1?) then
data <= in_data;
end if;
end process;
70
3、如果有 wait 语句,则不允许有敏感信号表。
PROCESS (a,b)
BEGIN
--sequential statements
END PROCESS;
PROCESS
BEGIN
-- sequential statements
WAIT ON (a,b) ;
END PROCESS;
71
定义:给一个信号赋值,即为该信号创建一个驱动
器(驱动信号)。多个进程或并发语句给同
一个信号赋值,则该信号为多信号源驱动。
例,a_out <= a when enable_a else ?Z? ;
b_out <= b when enable_b else ?Z? ;
process ( a_out)
begin
sig <= a_out ;
end process ;
process ( b_out )
begin
sig <= b_out ;
end process ;
三态缓冲器总线结构与多驱动信号
72
二、块语句
块语句将一系列并行描述语句进行组合,目
的是改善并行语句及其结构的可读性。可使结构
体层次鲜明,结构明确。
语法如下,标记,block [( 块保护表达式 )]
{ 块说明项 }
begin
{ 并行语句 }
end block [ 标记 ];
73
1、块语句的使用不影响逻辑功能
以下两种描述结果相同,
描述一,
a1,out1<=?1? after 2 ns;
a2,out2<=?1? after 2 ns;
a3,out3<=?1? after 2 ns;
描述二,
a1,out1<=?1? after 2 ns;
blk1,block
begin
a2,out2<=?1? after 2 ns;
a3,out3<=?1? after 2 ns;
end block blk1;
74
2、嵌套块
子块声明与父块声明的对象同名时,子块声明
将忽略掉父块声明。
两个相互
独立的 2输
入与门
75
3、卫式( Guarded)块
由保护表达式值的真、假决定块语句的执行与
否。综合不支持。
76
三 并行信号赋值语句
包括三种,
简单并行信号赋值;
条件信号赋值;
选择信号赋值。
共同特点,
1、赋值目标必须是信号,与其它并行语句同
时执行,与书写顺序及是否在块语句中无关。
2、每一信号赋值语句等效于一个进程语句。
所有输入信号的变化都将启动该语句的执行。
77
1、简单并行信号赋值语句
即:信号 <= 表达式
例:以下两种描述等价
architecture behav of a_var is
begin
output<=a(i);
end behav;
architecture behav of a_var is
begin
process(a,i)
begin
output<=a(i);
end process;
end behav;
一个简单并行信号赋值语句是一个进程的缩写。
78
等效,
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY ex1 IS
PORT(a,b, IN STD_LOGIC;
y, OUT STD_LOGIC);
END ex1;
ARCHITECTURE rtl OF ex1 IS
SIGNAL c, STD_LOGIC;
BEGIN
c <= a and b;
y <= c;
END rtl;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY ex2 IS
PORT(a,b, IN STD_LOGIC;
y, OUT STD_LOGIC);
END ex2;
ARCHITECTURE rtl OF ex2 IS
SIGNAL c, STD_LOGIC;
BEGIN
process1,PROCESS(a,b)
BEGIN
c <= a and b;
END PROCESS process1;
process2,PROCESS(c)
BEGIN
y <= c;
END PROCESS process2;
END rtl;
79
不等效,
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY ex1 IS
PORT(a,b, IN STD_LOGIC;
y, OUT STD_LOGIC);
END ex1;
ARCHITECTURE rtl OF ex1 IS
SIGNAL c, STD_LOGIC;
BEGIN
c <= a and b;
y <= c;
END rtl;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY ex2 IS
PORT(a,b, IN STD_LOGIC;
y, OUT STD_LOGIC);
END ex2;
ARCHITECTURE rtl OF ex2 IS
SIGNAL c, STD_LOGIC;
BEGIN
PROCESS(a,b,c)
BEGIN
c <= a and b;
y <= c;
END PROCESS;
END rtl;
80
2、条件信号赋值语句
格式,
目的信号量 <= 表达式 1 when 条件 1 else
表达式 2 when 条件 2 else
表达式 3 when 条件 3 else

表达式 n;
81
例:用条件信号赋值语句描述四选一电路
entity mux4 is
port(i0,i1,i2,i3,a,b, in std_logic;
q, out std_logic);
end mux4;
architecture rtl of mux4 is
signal sel, std_logic_vector (1 downto 0);
begin
sel<=b & a;
q<=i0 when sel =,00” else
i1 when sel =,01” else
i2 when sel =,10” else
i3 when sel =,11”;
end rtl;
82
条件信号赋值语句与进程中的多选择 if 语句等价,
q <= a WHEN sela = ?1? ELSE
b WHEN selb = ?1? ELSE
c;
PROCESS(sela,selb,a,b,c)
BEGIN
IF sela=‘1’ THEN
q <= a;
ELSIF selb=‘1’ THEN
q <= b;
ELSE
q <= c;
END IF;
END PROCESS;
83
3、选择信号赋值语句
格式,
with 表达式 select
目的信号量 <= 表达式 1 when 条件 1,
表达式 2 when 条件 2,

表达式 n when 条件 n;
注,1)不能有重叠的条件分支。
2)最后条件可为 others。否则,其它条件
必须能包含表达式的所有可能值。
3)选择信号赋值语句与进程中的 case 语
句等价。
84
例:用选择信号赋值语句描述四选一电路
entity mux4 is
port(i0,i1,i2,i3,a,b, in std_logic;
q, out std_logic);
end mux4;
architecture rtl of mux4 is
signal sel, std_logic_vector (1 downto 0);
begin
sel<=b & a;
with sel select
q<=i0 when sel =,00”,
i1 when sel =,01”,
i2 when sel =,10”,
i3 when sel =,11”,
?X? when others;
end rtl;
85
选择信号赋值语句与进程中的 case 语句等价,
PROCESS(sel,a,b,c,d)
BEGIN
CASE sel IS
WHEN,00” =>
q <= a;
WHEN,01” =>
q <= b;
WHEN,10” =>
q <= c;
WHEN OTHERS =>
q <= d;
END CASE;
END PROCESS;
WITH sel SELECT
q <= a WHEN,00”,
b WHEN,01”,
c WHEN,10”,
d WHEN OTHERS;
86
四 并行过程调用语句
用过程名在结构体或块语句中可实现并行过
程调用。
其作用与一个进程等价。
格式,
过程名 [([参数名 =>] 表达式
{,[参数名 =>] 表达式 })]
87
例:并行过程调用与串行过程调用

procedure adder( signal a,b,in std_logic;
signal sum,out std_logic);

adder(a1,b1,sum1);

process(c1,c2)
begin
adder(c1,c2,s1);
end process;
88
五 VHDL的层次化设计与元件声明 (component)
及元件例化( instantial)语句
1、层次化设计
89
2,元件声明
定义:对所调用的较低层次的实体模块
(元件)的名称、类属参数、端口
类型、数据类型的声明。
语法,
component 元件名 [is]
[generic (类属声明 ); ]
[port (端口声明 ); ]
end component [元件名 ] ;
元件声明类似实体声明( entity)
90
例:元件声明
91
可在以下部分声明元件,
结构体( Architecture)
程序包( Package)
块( Block)
被声明元件的来源,
VHDL设计实体;
其它 HDL设计实体;
另外一种标准格式的文件,如 EDIF或 XNF;
厂商提供的工艺库中的元件,IP核。
92
3,元件的例化
定义:把低层元件安装(调用)到当前层次
设计实体内部的过程。
包括:类属参数传递、元件端口映射。
例化名称:元件名称
[ generic map ( 类属名称 => 表达式
{,类属名称 => 表达式 } )]
port map ([ 端口名称 => ] 表达式
{,[ 端口名称 => ] 表达式 });
例,u1,ADD generic map (N => 4)
port map (x,y,z,carry);
93
端口映射方式,
名称关联方式,
低层次端口名 =>当前层次端口名、信号名
例,or2 port map(o=>n6,i1=>n3,i2=>n1)
位臵关联方式,
(当前层次端口名,当前层次端口名,┈ )
例,or2 port map( n3,n1,n6 )
注:位臵关联方式中,例化的端口表达式
(信号)必须与元件声明语句中的端口
顺序一致。
94
一个低层次设计在被例化前必须有一个元件声明。
ENTITY exam is
PORT( ea,eb,IN STD_LOGIC_VECTOR(3 DOWNTO 0);
ey, OUT STD_LOGIC);
END exam ;
ARCHITECTURE exam_arch OF exam IS
COMPONENT compare
PORT( a, IN STD_LOGIC_VECTOR(3 DOWNTO 0);
b, IN STD_LOGIC_VECTOR(3 DOWNTO 0);
y, OUT STD_LOGIC );
END COMPONENT; --元件声明
BEGIN
u1, compare PORT MAP ( ea,eb,ey) ; --元件例化
END exam_arch ;
95
例,3 bit计数器的电路组成,
96
此电路由 9个元件组成,3个 D触发器,1个非
门,1个 2 输入或门,3个 2输入与非门,1个 2输
入异或非门。对应的元件例化 (结构化 )描述如下,
97
98
99
层次化设计的优点,
? 在一个设计组中,各个设计者可独立地以不
同的设计文件设计不同的模块元件。
? 各个模块可以被其他设计者共享,或备以后
使用。
? 层次设计可使系统设计模块化,便于移植,
复用。
? 层次设计可使系统设计周期更短,更易实现。
100
六 生成语句
生成语句的作用,复制 建立 0 个或多个备份 。
(并行结构)
分为两类,
for ┅ generate,采用一个离散的范围决
定备份的数目。
If ┅ generate,有条件地生成 0 个或 1
个备份。
101
1,for ┅ generate 语句
语法,
范围,整数表达式 to 整数表达式
整数表达式 downto 整数表达式
for --- loop 语句与 for ┅ generate 的比较,
标号,for 循环变量 in 范围 generate
{ 并行语句 }
end generate [标号 ];
102
例:用生成语句创建多个备份
component comp
port (x, in bit ;
y, out bit) ;
end component ;

signal a,b, bit_vector (0 to 7) ;

gen, for I in a?range generate
u, comp port map (x => a( I ),y => b( I )) ;
end generate gen ;
103
例,4位移位寄存器
104
4位移位寄存器的等效描述,
105
2,If ┅ generate 语句
语法,
if 语句与 If ┅ generate 的区别,
1,If ┅ generate 没有类似于 if 语句的
else 或 elsif 分支语句。
2,if 语句是顺序语句,If ┅ generate 为并
行语句。
标号,if 条件表达式 generate
{ 并行语句 }
end generate [标号 ];
106
例,N bit 串并转换器
7 6 5 4 3 2 1 0
107
N bit 串并转换器(续)
108
N bit 串并转换器仿真结果,
109
子程序可在以下三个位臵定义,
Package
Architecture
Process
子程序与进程语句的区别,
子程序不能从结构体的其余部分直接读写信
号。所有通信都是通过子程序的接口来完成的。
进程可以直接读写结构体内的其它信号。
§ 3.6 子程序( SUBPROGRAM)
110
子程序与硬件规模,
与普通软件中子程序调用的区别,
普通软件子程序调用增加处理时间;
VHDL中每调用一次子程序,其综合后都将
对应一个相应的电路模块。子程序调用次数与综
合后的电路规模成正比。
设计中应严格控制子程序调用次数。
111
子程序的类型,
过程 ( Procedure),
0 个或多个 in,inout,
或 out 参数。可获得多个返回值。
函数 ( Function),
0 个或多个 in 参数,一个 return 值。
只能获得一个返回值。
过程可作为一种独立的语句结构而单独存在,
函数通常作为表达式的一部分来调用。
子程序包含两部分,子程序声明和子程序主体。
112
一、子程序声明
1、过程声明语法
参数声明指明输入输出端口的数目和类型,
语法如下,
方式指参数的传递方向,有三种形式,
in,out,inout
Procedure 过程名 [(参数声明) ];
[参数名:方式 参数类型
{;参数名:方式 参数类型 }]
113
2、函数声明语法
参数声明指明输入输出端口的数目和类型,
语法如下,
对函数,方式只能用 in 方式。
Function 函数名 [(参数声明) ]
return 类型;
[参数名:方式 参数类型
{;参数名:方式 参数类型 }]
114
例:函数和过程的声明(放在程序包首中)
115
一 子程序主体
子程序主体,
定义子程序算法的具体实现。
1、过程主体语法,
Procedure 过程名 [(参数声明) ] is
{子程序声明项 }
begin
{顺序语句 }
end [过程名 ];
116
2、函数主体语法,
Function 函数名称 [(参数声明) ]
return 类型 is
{函数声明项 }
begin
{顺序语句 }
end [函数名称 ];
117
例:前述子程序声明的子程序主体(程序包体中)
118
子程序的调用,
在程序包中定义了子程序后,即可调用,
use work.pkg.all;

signal int, integer ;

variable even, boolean ;

int <= 7 ;
even,= is_even(int) ;

variable top,bot, nibble ;

byte_to_nibbles (“00101101”,top,bot) ;
119
三 子程序重载
子程序重载:多个子程序可以使用相同的名称,
但必须具有不同的参数形式。
例,type small is range 0 to 100 ; --函数重载
type large is range 0 to 10000 ;
function is_odd (num, small) return boolean ;
function is_odd (num, large) return boolean ;
signal a_number, small ;
signal b, boolean ;

b <= is_odd(a_number) ;
120
例:过程重载
procedure cal (v1,v2, in real;
signal out1,inout integer);
procedure cal (v1,v2, in integer;
signal out1,inout real);
……
cal (20.15,1.42,sign1);
cal (23,320,sign2);
……
121
§ 3.7 库、程序包及其它
见前面 3.2节。
122
§ 3.8 VHDL描述风格
三种描述风格,
行为描述
数据流(寄存器传输)描述
结构描述
123
一 行为描述
行为描述是以算法形式对系统模型、功能的
描述,与硬件结构无关。抽象程度最高。
常用语句:进程、过程、函数。
行为描述主要用于:模型仿真、功能仿真。
例,8位加法计数器
124
125
二 数据流描述,
数据流描述又称为寄存器传输级描述( RTL
__Register Transfer Level)。 RTL级描述是
以寄存器为特征,在寄存器之间插入组合逻辑电
路。即以描述数据流的流向为特征。
126
三 结构化描述,
在多层次的设计中,高层次的设计模块调
用低层次的设计模块,构成模块化的设计。
127
结构描述是元件互连的描述,使用元件例化语句。
一位全加器的原理图
128
一位全加器的 VHDL结构化描述
129
130
第 3章 习题三
1、进程语句的特点是什么?应从哪几个方面来理
解进程语句?
2、块语句的作用是什么?有什么特点?
3、简单并行赋值语句与什么语句等效?为什么?
条件信号赋值语句、选择信号赋值语句又分别
与什么语句等效?有什么异同点?
4、元件例化语句的作用是什么?如何进行元件例
化?元件例化时端口映射有哪两种方式?有什
么注意事项?
5、生成语句与循环语句的异同点是什么?