设计中心
电子设计自动化技术
教师:李平教授(博导)
Email: pli@uestc.edu.cn
Tel: 83201794
设计中心
电子设计自动化技术
第五章·续二
设计中心
Learning VHDL must learn
What is Combinatorial Logic
What is Sequential Logic
What is Concurrent Statement
What is Process Statement
设计中心
Combinatorial Logic
? Combinatorial Logic if
– Outputs at a specified time are a function
only of the inputs at that time
? e.g. decoders, multiplexers and adders
Output change
instantly when
input change
设计中心
Sequential Logic
? Sequential Logic if
– Outputs at a specified time are a function of the inputs at
that time and at all preceding times
– All sequential circuits must include one or more registers
? e.g. State Machine, Counters, Shift Register and Controllers
Outputs depends
on inputs and
previous output
Register is used to hold the previous value
设计中心
Concurrent Statements
? There are several different kinds of
Concurrent Statements
– (1) Simple Signal Assignments
– (2) Conditional Signal Assignments
– (3) Selected Signal Assignments
设计中心
Putting it all together
设计中心
Process Statement
? All the Process Statement is executed in
parallel
? Within the Process Statement, the coding
is execute in sequential
? Process Statement is : OUTPUT depends
on INPUT with Sensitivity List to control
the event happen
设计中心
VHDL的一般格式及其语法规则
More Detail
设计中心
? 延时语句
? WAIT clause
? Attribute
? VHDL的顺序语句
? Subprograms (function and procedure)
? Block
设计中心
时序描述—延时类型
? 所有的SIGNAL 赋值语句都包含一个延时值,
信号值在这段延时后更新
? 延时值有如下三种表示形式:
transport — 传播延时(显示定义)
inertial — 惯性延时(可不显示定义)
delta (△) — 在没有显示定义延时值 时,系统
采用的缺省延时方式
设计中心
时序描述—传播延时
? 传播延时必须显示定义
关键字为 transport
? 直接模拟导线上信号延迟
? 信号值在说明的时间后更新
b <= transport a AFTER 10 ns;
a b
5ns 15ns
a
b
设计中心
? 惯性延时提供延时值及相应脉冲宽度
? 惯性延时为缺省方式,可以不显示定义
? 惯性延时模拟某类元件的延迟特性(“ 容 ”性)
b<=inertial not a after 10 ns;
时序描述—惯性延时
5ns 15ns 25ns 35ns
a b
a
b
设计中心
b <= reject 5ns inertial not a after 10 ns;
a
b
注意:
? reject 5ns 指定了脉冲宽度,即小于5ns 的
脉冲滤掉。(对应“ 容 ”性特征)
? reject不显示定义时脉冲宽度省缺为延时值
5ns 15ns 25ns 35ns
时序描述—惯性延时(续)
设计中心
惯性延时与传播延时
? 惯性延时——只能保持一个处理事项
? 传播延时——可以保持多个处理事项
PROCESS
BEGIN
Z <= ‘1’ AFTER 50 ns;
Z <= ‘0’ AFTER 100 ns;
WAIT;
END PROCESS;
50ns 100ns
设计中心
惯性延时与传播延时
? 惯性延时——只能保持一个处理事项
? 传播延时——可以保持多个处理事项
PROCESS
BEGIN
Z <= ‘1’ AFTER 100 ns;
Z <= ‘0’ AFTER 50 ns;
WAIT;
END PROCESS;
50ns 100ns
设计中心
惯性延时与传播延时
? 惯性延时——只能保持一个处理事项
? 传播延时——可以保持多个处理事项
PROCESS
BEGIN
Z <= ‘1’ AFTER 50 ns;
Z <= ‘1’ AFTER 100 ns;
WAIT;
END PROCESS;
50ns 100ns
设计中心
惯性延时与传播延时
? 惯性延时——只能保持一个处理事项
? 传播延时——可以保持多个处理事项
PROCESS
BEGIN
Z<=transport ‘1’ AFTER 50 ns;
Z<=transport ‘0’ AFTER 100 ns;
WAIT;
END PROCESS;
50ns 100ns
设计中心
惯性延时与传播延时
? 惯性延时——只能保持一个处理事项
? 传播延时——可以保持多个处理事项
PROCESS
BEGIN
Z<=transport ‘1’ AFTER 100 ns;
Z<=transport ‘0’ AFTER 50 ns;
WAIT;
END PROCESS;
50ns 100ns
设计中心
时序描述—Delta 延时
? 当 SIGNAL赋值语句没有显式说明延时方式
时,系统缺省为△延时
1. 信号赋值不能立即生效
2. △表示无限小的时间间隔,在这个间隔后所有的
信号赋值才更新
b <= NOT a; -- △延时后, b获取a 的值
? △延时机制使并发语句 (进程) 的执行更有效
仿真器对进程的执行顺序不会影响仿真结果
设计中心
? 延时语句
? WAIT clause
? Attribute
? VHDL的顺序语句
? Subprograms (function and procedure)
? Block
设计中心
WAIT Clause
?WAIT语句使进程暂停执行
? WAIT [sensitivity_clause] [condition_clause] [timeout_clause]
sensitivity_clause: on signal_name{, signal_name}
wait on clock;
condition_clause: until boolean_expression
wait until clock = ‘1’;
timeout_clause: for time_expression
wait for 150 ns;
设计中心
进程的等效描述
? 敏感信号(sensitive signals )与WAIT ON
process (a, b, cin) process
begin begin
sum <= a XOR b XOR cin; sum <= a XOR b XOR cin;
end process; wait on a, b, cin;
end process;
NOTE:
如果使用了sensitivity_list ,在 process中就不能使用 WAIT语句
如果使用了 WAIT语句,在process 中就不能使用sensitivity_list
设计中心
Compare IF-THEN-ELSE vs WATI UNTIL
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
ENTITY tdff IS
PORT(clk, d: in std_logic;
q : out std_logic);
END tdff;
architecture behaviour OF tdff IS
BEGIN
PROCESS
BEGIN
wait until clk = '1';
q <= d;
END PROCESS;
END behaviour;
Entity test1 is
port (clk, d : in bit;
q : out bit);
end test1;
architecture test1_b of test1 is
begin
process (clk)
begin
if (clk = ‘1’) then
q <= d;
end if;
end process;
end test1_b;
Entity test1 is
port (clk, d : in bit;
q : out bit);
end test1;
architecture test1_b of test1 is
begin
process (clk,d)
begin
if (clk = ‘1’ and clk’event) then
q <= d;
end if;
end process;
end test1_b;
设计中心
wait until 与 wait for
process
begin
sum <= a XOR b XOR cin;
wait until a = ‘1’;
end process;
process
begin
sum <= a XOR b XOR cin;
wait for 10 ns;
end process;
设计中心
Wait语句总结
? Wait语句通常用在仿真文件中
? Wait until 是边沿触发类型,只有当被检
测信号的条件满足时,后续语句才被执行
1. wait until clk’event and clk = ‘1’;为检测信号
的上升沿,通常用于时钟信号
2. wait; 将使进程挂起,它通常用在仿真文件内
进程的最后,用于中止进程的执行
? Wait for, wait on, wait通常是不可综合的
设计中心
? clk’event and clk=‘1’
– clk is the signal name (any name)
– ‘event is a VHDL attribute,
specifying that there needs to be a
change in signal value
– event is a change in value: from ‘0’ to ‘1’;
or from ‘X’ to ‘1’, etc
– clk=‘1’ means positive-edge triggered
设计中心
? 延时语句
? WAIT clause
? Attribute
? VHDL的顺序语句
? Subprograms (function and procedure)
? Block
设计中心
属性(attributes )
? 属性:提供VHDL 描述中的某些特殊信息
1. 属性可描述的项目包括 types, subtypes, procedures,
functions, signals, variables, constants, entities,
architectures, configurations, packages,
components等
2. 一般格式: name’attribute_identifier
? VHDL具有一些预定义属性:
x’event --当信号 x上有事件发生时为真
x’last_value --返回x 上一时刻的值
y’high --返回 y取值范围的上界
x’stable(t) --当x 在过去的 t时间内无事件发生时为真
设计中心
属性举例
IF clk’event and clk=‘1’ THEN
b <= a ;
End IF;
IF clk’event and (clk=‘1’) and
(clk’last_value = ‘0’) THEN
b <= a ;
End IF;
? ‘last_value保证 clk从 ’0’跳到’1’
设计中心
a : IN STD_LOGIC_VECTOR(7 DOWNTO 0)
? ‘HIGH -7
? ‘LOW -0
? ‘RIGHT -0
? ‘LEFT -7
? ‘RANGE - 7 DOWNTO 0
? ‘REVERSE RANGE -0 TO 7
? ‘LENGTH -8
设计中心
? 延时语句
? WAIT clause
? Attribute
? VHDL的顺序语句
? Subprograms (function and procedure)
? Block
设计中心
VHDL的顺序语句
? 在进程内的语句顺序执行step by step
? Signal、 Variable 赋值
? 顺序控制语句
IF <condition> THEN <statements>;
[ ELSIF <condition> THEN <statements>; ]
[ ELSE <statements> ;]
END IF;
CASE <condition> IS
WHEN <value> => <statements>;
{WHEN <value> => <statements>;}
[WHEN others => <statements>;]
END CASE;
设计中心
VHDL的顺序语句 (续 )
? FOR <range> LOOP <statements> END LOOP;
? WHILE <condition> LOOP <statements> END LOOP;
? WAIT [ON <signal>]
[UNTIL <expression>]
[FOR <time>];
? ASSERT <condition> [REPORT <string>]
[SEVERITY <level>];
Level: note, warning, error, failure
设计中心
? 延时语句
? WAIT clause
? Attribute
? VHDL的顺序语句
? Subprograms (function and procedure)
? Block
设计中心
SUBPROGRAMS
ARCHITECTURE
Begin
……
end
FUNCTION
PROCEDURE
PARAMETERS
RETURN VALUE
PARAMETERS
OUT PARAMETERS
设计中心
FUNCTION
?Format:
FUNCTION <function_name> (<input_parameters>)
RETURN <DATA_TYPE> IS
{any declarations}
BEGIN
{functionality} --顺序语句
RETURN <name_of_a_declaration>
END <function_name>;
only allowable mode for parameters is in
设计中心
FUNCTION
? FUNCTION由表达式引用
? 返回一个值
? 返回值通过RETURN 引用
设计中心
FUNCTION
function add_bits1 (a, b : in bit) return BIT is
begin -- functions cannot return multiple values
return (a XOR b); --顺序语句
end add_bits1;
function add_bits2 (a, b : in bit) return BIT is
variable result : BIT; --variable is local to function
begin -- functions cannot return multiple values
result := (a XOR b);
return result; --顺序语句
end add_bits2;
设计中心
FUNCTION调用
architecture behave of adder is
begin
process (ena, x, y)
begin
if (ena = ‘1’) then
result <= add_bits1(x, y);
carry <= x and y;
else
(carry, result) <= ‘0’;
end process;
end behave;
function add_bits1 (a, b : in bit)
? 函数只能通过其他语句调用的方式进行引用
? 引用参数通过位置相关联或通过名称相关联
设计中心
PROCEDURE
?Format:
PROCEDURE<procedure_name>(<mode_parameters>) IS
{any declarations}
BEGIN
{functionality}
END <procedure_name>;
allowable modes for parameters are in, out, and inout
设计中心
PROCEDURE
? 可以有多个返回值
? 直接引用
? 过程描述中无需RETURN 语句
PROCEDURE add_bits3 (signal a, b, en : IN bit;
signal temp_result, temp_carry : OUT bit) IS
BEGIN -- procedure can return multiple values
temp_result <= (a xor b) and en;
temp_carry <= a and b and en; --顺序语句
END add_bits3;
设计中心
architecture behave of adder is
begin
process (ena, x, y)
begin
add_bits3 (x, y, ena, result, carry);
end process;
end behave;
PROCEDURE add_bits3 (signal a, b, en : in bit;
signal temp_result, temp_carry : out bit)
调用PROCEDURE
设计中心
? 延时语句
? WAIT clause
? Attribute
? VHDL的顺序语句
? Subprograms (function and procedure)
? Block (并行语句)
设计中心
BLOCK
? 块语句(BLOCK )本身是一个并发语句
? 块内部的一系列语句也是 并发语句
标号:BLOCK
{说明语句};
BEGIN
{并发处理语句};
END BLOCK 标号名;
设计中心
? BLOCK语句常用于构造体的结构化描述。
? 电路的构造体对应整个电原理图,而构造
体可以由多个BLOCK 块构成,每一个
BLOCK块对应一张子原理图。
? BLOCK相当于 “子构造体 ” 。
BLOCK
设计中心
carry
sum
borrow
differ
A
B
?半加器
Sum=A⊕ B
carry =AB
?半减器
differ =A⊕ B
borrow =AB
half_add
half_sub
设计中心
实体部分
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
ENTITY alu IS
PORT(A,B: in std_logic;
sum,carry,differ,borrow : out std_logic);
END alu;
设计中心
ARCHITECTURE blocks OF alu IS
BEGIN
half_add : BLOCK
BEGIN
sum <= A XOR B;
carry <= A AND B;
END BLOCK half_add;
half_sub : BLOCK
BEGIN
differ <= A XOR B;
borrow <= NOT A AND B;
END BLOCK half_sub;
END blocks;
设计中心
? VHDL的顺序语句
? WAIT clause
? Attribute
? Library
? Subprograms (function and procedure)
? Block
? Generate
设计中心
GENERATE STATEMENT
? 生成语句提供简单实现规则重复结构的能力
? 生成语句能够包含 IF-THEN和 FOR循环结构
? 生成语句可以嵌套
设计中心
FOR-结构举例
architecture test_generate of test is
signal s1, s2, s3 : bit_vector (7 downto 0);
BEGIN
G1: for n IN 7 downto 0 generate
and_array : and_gate port map (s1(n), s2(n), s3(n));
END generate G1;
END test_generate;
S1(7:0)
S2(7:0)
S3(7:0)
设计中心
IF-结构举例
architecture test_generate of test is
signal s1, s2, s3 : bit_vector (7 downto 0);
BEGIN
G2: if (n =< 7) generate
and_array : and_gate port map (s1(n), s2(n), s3(n));
END generate G2;
END test_generate;
S1(7:0)
S2(7:0)
S3(7:0)
设计中心
? COMPONENT语句
? 参数化设计
设计中心
?第五章
1、 2、 4、 5、 7、 8