设计中心
电子设计自动化技术
教师:李平教授(博导)
Email: pli@uestc.edu.cn
Tel: 83201794
设计中心
电子设计自动化技术
第五章
VHDL的主要描述语句
设计中心
本章要点
*VHDL描述语句集合的全貌建立一个清
晰的概念;
*对VHDL主要描述语句的作用有一个正
确的认识;
*建立VHDL是一种并行语言的基本概念;
*正确理解位于进程之外的语句与位于
进程内部的语句的区别是本章学习的关
键点。
设计中心
VHDL主要描述语句分类
? VHDL的主要描述语句种类繁多,为了
便于学习和理解,我们将 VHDL的主要
描述语句划分为:
? “描述行为的语句 ”和
? “描述结构的语句 ”两大部分,如图 5-1所
示
? 这两大部分分别由若干语句组成
设计中心
VHDL
描述语句
行为描述语句
(Behaviour)
结构描述语句
(Structure)
并行赋值语句 (Concurrent Assign)
进程语句
(Process)
断言语句 (Assert)
块语句 (Block)
子程序 (Subprogram)
元件语句 (Component)
端口映射语句 (Port Map)
生成语句 (Generate)
参数说明语句 (Generic)
等待语句 (Wait)
顺序赋值语句 (Sequent Assign)
顺序控制语句
(Sequent Control)
IF
CASE
LOOP
FOR
WHILE
函数 (Function)
过程 (Procedure)
最常用语句
设计中心
VHDL主要描述语句分类
? 在本章中将对图5-1所列出的所有语句逐一进
行具体介绍。
? 如果把每一种语句比喻成一颗树,则图5-1给
出了这些树所构成的森林的面目。
? 由图5-1可以获得以下信息:
1. VHDL的主要描述语句由 “描述行为的语句 ”
和 “描述结构的语句 ”两个部分组成
2. 描述行为的语句主要有:信号赋值语句,
进程语句,断言语句,子程序等;
设计中心
VHDL主要描述语句分类
3. 描述结构的语句主要有:component (元
件),port map(端口映射),generate(生成语
句),generic(参数说明语句)等;
4. 在所有VHDL语句中,描述行为的进程语句
最为复杂。它可以包含等待语句、顺序信号赋
值语句和顺序控制语句等三部分,其中,顺序
控制语句又可以包含条件语句和循环语句等5
种语句。
设计中心
VHDL主要描述语句分类
5. 信号的赋值可分为:进程中赋值和进
程外赋值两种。进程中赋值使用顺序信
号赋值语句。进程外赋值使用并行信号
赋值语句。
6. if和case语句是进程语句中实现顺序
控制的最常用语句。
设计中心
VHDL主要描述语句分类
? 另外,在此需要指出两点:
? 1. 行为级描述的VHDL程序一般不会用到描述
结构的语句。
? 2. 然而除行为级描述外,RTL级和结构级描述
都大量使用描述行为的语句。通常情况下VHDL
程序都要用到描述行为的语句。电子系统中的
行为主要体现在信号的变化,组合和传输,所
以一般VHDL程序都会用到描述行为的语句。
? 所以学习的重点是描述行为的语句。
设计中心
5.2 描述行为的语句
? 信号赋值语句(Assignment)
? 进程语句(Process)
? 断言语句(Assert)
? 块语句(Block)
? 子程序(Subprogram)
设计中心
5.2.1 对象的赋值
?VHDL 程序中数值的载体称为对象
(object )。
?VHDL中有四种对象:常量( constant)、
变量( variable)信号(signal )和文件
(file)。
?对象赋值是电子系统的行为
?赋值语句是描述行为的语句
设计中心
VHDL
描述语句
行为描述语句
(Behaviour)
结构描述语句
(Structure)
并行赋值语句 (Concurrent Assign)
进程语句
(Process)
断言语句 (Assert)
块语句 (Block)
子程序 (Subprogram)
元件语句 (Component)
端口映射语句 (Port Map)
生成语句 (Generate)
参数说明语句 (Generic)
等待语句 (Wait)
顺序赋值语句 (Sequent Assign)
顺序控制语句
(Sequent Control)
IF
CASE
LOOP
FOR
WHILE
函数 (Function)
过程 (Procedure)
最常用语句
设计中心
Concurrent Assignment Statement
? All the Concurrent Statement is executed in
parallel
? Concurrent Statement does not care the position
within the coding
? Concurrent Statement is : OUTPUT depends on
INPUT only
设计中心
Entity test1 Is
Port ( a, b : in bit;
c, d : out bit);
end test1;
architecture test1_a of test1
is
begin
c <= a and b;
d <= a or b;
end test1_a;
Entity test1 Is
Port ( a, b : in bit;
c, d : out bit);
end test1;
architecture test1_a of test1
is
begin
d <= a or b;
c <= a and b;
end test1_a;
This two excute
in parallel
Does not care the position within the coding
并行赋值语句(Concurrent Assignment Statement)
并行赋值语句与语句出现的先后顺序无关。
如下例给出的两条语句交换顺序前后等价。
设计中心
C = AB
D = A+B
equivalent
c <= a and b;
d <= a or b;
d <= a or b;
c <= a and b;
0
1
0
1
0
0
0
0
1
0
0
1
0
0
0
0
1
1
1
1
分析真值得:
两条语句交换顺序前后的仿真波形完全相同,如下图:
并行赋值语句(Concurrent Assignment Statement)
设计中心
VHDL
描述语句
行为描述语句
(Behaviour)
结构描述语句
(Structure)
并行赋值语句 (Concurrent Assign)
进程语句
(Process)
断言语句 (Assert)
块语句 (Block)
子程序 (Subprogram)
元件语句 (Component)
端口映射语句 (Port Map)
生成语句 (Generate)
参数说明语句 (Generic)
等待语句 (Wait)
顺序赋值语句 (Sequent Assign)
顺序控制语句
(Sequent Control)
IF
CASE
LOOP
FOR
WHILE
函数 (Function)
过程 (Procedure)
最常用语句
设计中心
PROCESS语句一般格式
[进程标号:]
PROCESS [(敏感信号表)][IS]
〈说明〉;
BEGIN
〈顺序语句〉 ;
END PROCESS ;
?PROCESS 是进程语句的标示符,
PROCESS前可以加进程标号,也可以
没有标号。
?进程内部〈说明〉部分用于定义本
进程所需的局部数据环境,在这里
可以说明数据类型、子程序和变量 ,
在此说明区说明的变量,仅在当前
进程内可对其进行读/写。
?BEGIN以后的〈顺序语句〉为进程
的执行语句部分。
设计中心
Process Statement
? All the Process Statement is executed in parallel
(进程与进程之间并行 )
? Within the Process Statement, the coding is
execute in sequential
(进程内部语句之间串行 ——顺序执行 )
?Process Statement: OUTPUT depends on
INPUT with Sensitivity List to control the event
happen
设计中心
Entity test1 is
Port ( clk, d1, d2 : in bit;
q1, q2 : out bit);
end test1;
architecture test1_body of test1 is
begin
Process (clk, d2)
begin
if (clk’event and clk = ‘1’) then
q2 <= d2;
end if;
end process;
Process (clk, d1)
begin
if (clk’event and clk= ‘1’) then
q1 <= d1;
end if;
end process;
end test1_body;
This two
processes
execute in
parallel
Entity test1 is
Port ( clk, d1, d2 : in bit;
q1, q2 : out bit);
end test1;
architecture test1_body of test1 is
begin
Process (clk, d1)
begin
if (clk’event and clk = ‘1’) then
q1 <= d1;
end if;
end process;
Process (clk, d2)
begin
if (clk’event and clk= ‘1’) then
q2 <= d2;
end if;
end process;
end test1_body;
The codings are
executed
in sequential within
the process
设计中心
The two processes execute in parallel
前页两程序内部均包含两个完全一样的 Process,
两程序区别在于两Process交换了先后顺序。
两程序仿真波形完全相同。说明与 Process顺序无关。
设计中心
? Now, we know what is
– concurrent statement
– process statement
Q : What is the usage of this in VHDL ?
A : Engineer can use the mixture of
concurrent statement and process
statement to do the design
设计中心
How to ... ?
? Now we know what is Combinational Logic but
Q: How to implement of Combinational Logic in
VHDL?
A:Combinational Logic can be implemented by
– Concurrent Assignment Statements
– Process Statement that describe purely
combinational behavior i.e. behavior that does not
depends on any CLOCK EDGE
设计中心
Concurrent Statements
for
Combinational Logic
设计中心
Concurrent Statements
? There are several different kinds of
Concurrent Statements
?(1) Simple Signal Assignments
(简单信号赋值)
?(2) Conditional Signal Assignments
(条件信号赋值)
?(3) Selected Signal Assignments
(选择信号赋值)
设计中心
Putting them all together
设计中心
(1) Simple Signal Assignment
? This kind of statements are executed in Parallel
Entity test1 is
port ( a, b, e : in bit;
c, d : out bit);
end test1;
architecture test1_body of test1 is
begin
c <= a and b;
d <= e;
end test1_body;
设计中心
What kind of logic support
?AND
?NAND
?OR
?NOR
?XOR
?NOT
? more .......
设计中心
We want 5 Inputs AND-Gate
Q :AND is only a two input, if I want more inputs, what
can I do ?
A : It is easy, we are due with Language not Graphic
Entity test1 is
port ( a, b, c, d, e : in bit;
f : out bit);
end test1;
architecture test1_body of test1 is
begin
f <= a AND b AND c AND d AND e;
end test1_body;
设计中心
(2) Conditional Signal Assignments
? The output get the value when the condition is true
– e.g. 2 to 1 multiplexer
Entity test1 is
port (in1, in2, sel : in bit;
d : out bit);
end test1;
architecture test1_body of test1 is
begin
d <= in1 WHEN sel = ‘0’ ELSE
in2;
end test1_body;
设计中心
If we want more -- 4 to 1 Mux
? Once again, you are due with Language not Graphic, so
it is easy
Entity test1 is
port (in1, in2, in3, in4 : in bit;
sel1, sel2 : in bit;
d : out bit);
end test1;
architecture test1_body of test1 is
begin
d <= in1 WHEN sel1 = ‘0’ and sel2 = ‘0’ ELSE
in2 WHEN sel1 = ‘0’ and sel2 = ‘1’ ELSE
in3 WHEN sel1 = ‘1’ and sel2 = ‘0’ ELSE
in4;
end test1_body;
设计中心
(3) Select Signal Assignments
? The output get value when matching with the selected
item
Entity test1 is
port (a, b: in bit;
sel : in bit;
c : out bit);
end test1;
architecture test1_body of test1 is
begin
WITH sel SELECT
c <= a WHEN ‘1’, --逗号
b WHEN ‘0’; --分号
end test1_body;
设计中心
If I want more choice ---
? It is easy
Entity test1 is
port (in1, in2, in3, in4 : in bit;
sel : in integer;
out1 : out bit);
end test1;
architecture test1_body of test1 is
begin
with sel select
out1 <= in1 when 0 ,
in2 when 1 ,
in3 when 2 ,
in4 when 3 ;
end test1_body;
设计中心
Review
? Concurrent Statement for
– combinational logic (without Flip-flop circuit)
? eg. decoder, multiplexer, multiplier, adder
? Understand the usage of the Concurrent
Statement
?for Combinational Logic
? simple signal assignment statement
? conditional signal assignment statement
? selected signal assignment statement
设计中心
作业