电子设计自动化
电子设计自动化
授课教师:何
授课教师:何
旭
旭
第三章
第三章
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;