设计中心 电子设计自动化技术 教师:李平教授(博导) 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