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