电子设计自动化 电子设计自动化 授课教师:何 授课教师:何 旭 旭 第三章 第三章 VHDL基础 基础 本章介绍基本的VHDL概念及与语言相关的术语 第一节VHDL构件 第二节基本语言结构 第三节设计描述层次 第一节 第一节 VHDL构件 构件 VHDL由语言构件组成: 75 个保留字 200个描述字或字的组合 保留字是对VHDL编译器有特殊意义的字。 要求:严格按照VHDL定义使用。 描述字组合并不出现在实际的VHDL程序 中,仅在VHDL语法定义中使用,提供在 构造VHDL描述时的构件名。 例:port_clause 构件图 port_clause port ( port_list ) ; 保留字 可表示为:port_clause…….port (port_list) ; 第二节 第二节 基础语言结构 基础语言结构 VHDL硬件模型的主要构成是 设计实体(Design Entity)。 它可以表示一个电路单元(cell) 、芯片(chip) 电路板(board) 或电子系统(subsystem)。 设计实体由两部分构成: 设计实体由两部分构成: 实体声明( 实体声明( Entity Declaration) 结构体 结构体 ( ( Architecture Body) Design Entity Entity Declaration Architecture Body 库单元: 可独立存在于一个设计文件中, 并被编译的硬件描述(模型)的部分。 四种库单元: 实体声明 结构体 封装声明(Package Declaration) 封装体(Package Body) 允许声明(Declaration)和体(Body) 的部分分别被编译。 实体声明定义了设计实体与外部的接口 结构:ENTITY identifier IS entity_header --(generic and/or port clauses) entity_declarative_part --(declarations for subprograms, -- types, signals, ……) BEGIN entity_statement_part END identifier ; generic语句和port语句格式: generic_clause …..generic (generic_list); port_clause ..…port (port_list); 实体声明最简单的例子: ENTITY and2 IS a q PORT (a, b : IN bit; b q : OUT bit); END and2; 结构体描述设计实体的输入与输出的关系 (设计实体的行为与结构) 结构:ARCHITECTURE identifier OF entity_name IS architecture_declarative_part BEGIN architecture_statement_part END identifier ; 例如:ARCHITECTURE example OF and2 IS --declaration here BEGIN --statements here END example; 每一个设计实体只能有一个实体声明,可有一个 或多个结构体。(不同的抽象级别或算法) 例:Entity Declaration Architecture Body behave trfc_lc rtl structure 硬件描述似金字塔形,最顶层为实体声明(最基本单元) Entity Generic Port In Port Out Architecture Architecture Architecture CS Block CS CS CS CS Block CS Block Process CS CP SS CS SS Block Process Process CS SS SS CS SS SS 第三节设计描述层次 VHDL硬件描述的抽象层次为: 行为级描述(Behavioral Level Description) 寄存器传输级描述 (Register Transfer Level(RTL) Description) 结构级描述(Structural Level Description) 一、结构级描述 结构级描述用相互连接的元件来表 达一个设计。这种方法比较类似原理图。 例:两输入多路器 原理图表示, 上层:下层: Do D1 Q sel D0 Sel U3 aa U4 Q u1 D1 U4 ab nsel VHDL描述:ENTITY mux IS --实体声明 PORT (d0, d1, sel: IN bit; q: OUT bit ); --端口语句 END mux; --结构体 ARCHITECTURE struct OF mux IS COMPONENT and2 --结构声明部分 PORT(a, b: IN bit; c: OUT bit); END COMPONENT; COMPONENT or2 PORT(a, b: IN bit; c: OUT bit); END COMPONENT; COMPONENT inv PORT (a: IN bit c: OUT bit); END COMPONENT; SIGNAL aa,ab, nsel: bit --信号声明 FOR U1 :inv USE ENTITY WORK. Invrt (behav); --配置说明 FOR U2 , U3:and2 USE ENTITY WORK. And_gt(dflw); -- FOR U4 :or 2 USE ENTITY WORK. Or_gt(arch1); -- BEGIN u1: inv PORT MAP (sel, nsel); --结构体描述部分 u2: and2 PORT MAP (nsel, d1, ab); u3: and2 PORT MAP (d0, sel, aa); u4: or2 PORT MAP (aa, ab, q); END struct; 二、行为级描述 行为级描述是用电路和信号对于各种激励的 响应的方式来表达一个设计的功能。 行为级描述着重用于描述硬件的算法,而不 涉及其结构如何实现。它可用于快速建立与仿真 整个电路功能,以及作为其它模块激励。 例:多路器:ENTITY mux IS PORT (d0, d1, sel: IN bit; q: OUT bit); END mux; ARCHITECTURE behav OF mux IS BEGIN f1: PROCESS (d0, d1, sel) BEGIN IF (sel=‘0’) THEN q <= d1; ELSE q<= d0; END IF; END PROCESS f1; END behav; 与结构级描述的主要区别是process 语句。 Process语句格式为: process statement… label: PROCESS (sensitivity_list) process_declarative_part BEGIN process_statement_part END PROCESS label; Process语句的核心内容是IF语句,其格式为: if statement … IF condition THEN sequence_of_statements ELSIF condition THEN sequence_of_statements ELSE sequence_of_statements END IF; if 语句用法与C、BASIC语言中用法相近。 信号赋值语句: target <= TRANSPORT waveform; 上式中,<=为组合分隔符,表示其右边的值 赋给左边的target。 在VHDL语言中,<=也可作为关系算子,意 思是“小于等于”。 以一个移位寄存器为例说明: 数组类型:多个元素,每个元素均为相同数据类型(bit) 可用TO 或DOWNTO 指示 shftin shftout shftctl 0 1 2 3 0 1 2 3 0 1 当shftctl为“00”时: shftin 0 1 2 3 S0 S1 S2 S3 shftout 0 1 2 3 当shftctl为“01”时: shftin 0 1 2 3 S0 S1 S2 ‘0’ shftout 0 1 2 3 当shftctl为“10”时: shftin 0 1 2 3 ‘0’ S0 S1 S2 shftout 0 1 2 3 当shftctl为“11”时: shftin 0 1 2 3 S0 S0 S1 S2 shftout 0 1 2 3 ENTITY shifter IS --实体声明 PORT (shftin :IN bit_vector(0 TO 3); --端口语句 shftout :OUT bit_vector(0 TO 3); shftctl :IN bit_vector(0 TO 1)); END shifter; ARCHITECTURE behav OF shifter IS --结构体 BEGIN f2: PROCESS(shftin, shftctl) - - process描述 VARIABLE shifted: bit_vector(0 TO 3); --pro.声明部分 BEGIN CASE shftctl IS - -process描述部分 WHEN “00” =>shifted := shftin; WHEN “01” =>shifted := shftin(1 TO 3) & ‘0’; WHEN “10” =>shifted := ‘0’ & shftin(0 TO 2); WHEN “11” =>shifted :=shftin(0) & shftin(0 TO 2); END CASE; shftout <= shifted AFTER 10 ns; END PROCESS f2; END behav; 变量声明格式: variable declaration … VARIABLE identifier_list : subtype_indication :=expression; 变量赋值语句: variable assignment statement … target := expression; case语句: case statement … CASE expression IS WHEN choices => --case stmnt alternative sequence_of_statements END CASE; 结构级描述与行为级描述的差异: 结构级描述确定了各种元件的连接, 行为级描述确定了电路和信号对各种激励的算法。 有信号赋值语句------非结构级描述 有元件实例化语句-----非行为级描述 三、RTL描述 RTL描述用从一个输入或寄存器到另一个寄存器或 输出的信息流来确定一个设计的功能。 RTL描述和行为级描述都用process 来描述电路的功能。 行为级描述用少量process, 每个process完成许多串行信号 赋值。 RTL描述用大量的并行信号赋值语句。 RTL描述使用下列并行语句(concurrent): Block语句 并行程序调用(procedure) 并行断言语句(assertion) 并行信号赋值语句 以多路器(MUX)为例: ENTITY mux IS --实体声明 PORT (d0, d1, sel: IN bit; q: OUT bit);--端口语句 END mux; --结构体 ARCHITEDTURE rtl OF mux IS BEGIN csl: --并行信号赋值描述 q <= d1 WHEN sel =‘0’ ELSE --条件信号描述 d0; END rtl; 并行信号赋值语句的格式为: concurrent signal assignment statement … label: conditional_signal_assignment ... Or label: selected_signal_assignment conditional signal assignment … target <= options conditional_waveforms; conditional waveforms … waveform WHEN condition ELSE waveform WHEN condition ELSE waveform 以移位寄存器为例,比较行为级描述与RTL级描述 的区别。 行为级描述: ENTITY shifter IS PORT (shftin :IN bit_vector ( 0 TO 3); shftout :OUT bit_vector (0 TO 3); shftctl :IN bit_vector (0 TO 1)); END shifter; ARCHITECTURE behav OF shifter IS BEGIN f2: PROCESS (shftin, shftctl ) VARIABLE shifted : bit_vector ( 0 TO 3); BEGIN CASE shftctl IS WHEN “00”=> shifted := shftin; WHEN “01”=> shifted :=shftin(1 TO 3) & ‘0’; WHEN “10”=> shifted := ‘0’ & shftin(0 TO 2); WHEN “11”=> shifted := shftin(0) & shftin(0 TO 2); END CASE ; shftout <== shifted AFTER 10 ns; END PROCESS f2; END behav; RTL级描述: ENTITY shifter IS PORT (shftin :IN bit_vector (0 TO 3); shftout :OUT bit_vector (0 TO 3); shftctl :IN bit_vector (0 TO 1)); END shifter ; ARCHITECIURE rtl OF shifter IS BEGIN shftout(3) <= ‘0’ AFTER 10 ns WHEN shftctl = “01” ELSE shftin(3) AFTER 10 ns WHEN shftctl = “00” ELSE shftin(2) AFTER 10 ns ; shftout(2) <= shftin(3) AFTER 10 ns WHEN shftctl =“01” ELSE shftin(2) AFTER 10 ns WHEN shftctl =“00” ELSE shftin(1) AFTER 10 ns; shftout(1) <= shftin(2) AFTER 10 ns WHEN shftctl =“01” ELSE shftin(1) AFTER 10 ns WHEN shftctl = “00” ELSE shftin (0) AFTER 10 ns; shftout(0) <= shftin(1) AFTER 10 ns WHEN shftctl =“01” ELSE ‘0’ AFTER 10 ns WHEN shftctl =“10” ELSE shftin(0) AFTER 10 ns; END rtl;