值语句属于并行同时语句。
小提示:
信号与变量赋值的区别
SIGNAL D :INTEGER ; --信号要定义在进程外的结构体中 PROCESS(A,B,C) BEGIN D <= A ; X <= B + D ; D <= C ; Y <= B + D ;
END PROCESS ;
执行的结果是: D <= C ;
X <= B + C ;
Y <= B + C ; --进程中同一信号多次赋值 只有最后一次生效 PROCESS(A,B,C)
VARIABLE D :INTEGER ; --变量要定义在进程内部 BEGIN D := A ;
X <= B + D ; D := C ; Y <= B+ D ;
END PROCESS ;
执行的结果是: X <= B + A ;
Y <= B + C ; --进程中变量多次赋值则立即生效
例1-2-3 通过一位BCD码的加法器的程序,比较信号、常量、变量的赋值及使用方法。 ENTITY bcdadd IS PORT(
op1, op2 :IN INTEGER RANGE 0 TO 9 ; result :OUT INTEGER RANGE 0 TO 31 );
END bcdadder;
ARCHITECTURE a OF bcdadder IS
CONSTANT adj :INTEGER := 6 ; --定义常数adj=6 SIGNAL binadd :INTEGER RANGE 0 TO 18 ; --定义信号binadd的取值范围是0~18 BEGIN
binadd <=op1+op2; --求op1+op2和运算
PROCESS (binadd)
VARIABLE tmp : INTEGER:=0; --定义变量tmp是整数型,初值是0 BEGIN
IF binadd > 9 THEN --如果binadd大于9,结果要调整 tmp := adj ; --方法是和加6,否则,结果加0。 ELSE tmp := 0 ;
END IF ;
result <=binadd+tmp ; --给外部信号赋值 END PROCESS; END a; 小提示:
常量,变量,信号的物理含义如下: 常量:电源,地,恒定逻辑值等常数。
变量:某些值的载体,存储单元,常用于描述算法。 信号:物理设计中的硬连接线,包括输入输出端口。
信号与常数相当于全局变量,变量相当于局部变量,变量只能存在于PROCESS, FUNCTION,PROCEDUCE中。不能带出PROCESS,FUNCTION,PROCEDUCE,传 送出去,而信号可以。
1.3 VHDL设计的基本语句
VHDL常用语句可以分为两大类并行语句和顺序语句,在数字系统的设计中,这些语句 用来描述系统的内部硬件结构和动作行为,以及信号之间的基本逻辑关系。顺序语句必须放 在进程中,因此可以把顺序语句称作为进程中的语句。顺序语句的执行方式类似于普通计算 机语言的程序执行方式,都是按照语句的前后排列的方式顺序执行的,一次执行一条语句, 并且从仿真的角度来看是顺序执行的。结构体中的并行语句总是处于进程的外部,所有并行 语句都是一次同时执行的,与他们在程序中排列的先后次序无关。 常用的并行语句有:
(1) 并行信号赋值语句,用 “<=” 运算符 (2) 条件赋值语句,WHEN-ELSE
(3) 选择信号赋值语句,WITH-SELECT (4) 方块语句,BLOCK 常用的顺序语句有:
(1) 信号赋值语句和变量赋值语句 (2) IF- ELSE语句 (3) CASE-WHEN语句 (4) FOR-LOOP
1.3.1并行信号赋值语句
信号赋值语句的功能是将一个数据或一个表达式的运算结果传送给一个数据对象,这个 数据对象可以是内部信号,也可以是预定义的端口信号。
例1-3-1用并行信号赋值语句描述逻辑表达式是Y=AB+C⊕D的电路。 ENTITY loga IS PORT (
A, B, C, D : IN BIT; Y : OUT BIT
);
END loga; --定义A,B,C,D是输入端口信号,Y是输出端口信号 ARCHITECTURE stra OF loga IS
SIGNALE : BIT; --定义E是内部信号
BEGIN
Y <=(A AND B) OR E; --以下两条并行语句与顺序无关
E <=C XOR D;
END stra; 小提示:
在进程中的信号赋值语句属于顺序语句,而在结构体中进程外的信号赋值语句则属于并 行语句。
1.3.2 条件赋值语句,WHEN-ELSE 语法格式为:
信号Y<= 信号A WHEN 条件表达式1 ELSE 信号B WHEN 条件表达式2 ELSE ...
信号N;
在执行WHEN-ELSE语句时,先判断条件表达式1是否为TRUE,若为真,Y<=信号A,否 则判断条件表达式2是否为TRUE,若为TRUE,Y<=信号B,依次类推,只有当所列的条件
表达式都为假时,Y<=信号N。
例1-3-2用条件赋值语句WHEN-ELSE实现的四选一数据选择器 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY mux4 IS PORT(
a0, a1, a2, a3 :IN STD_LOGIC;
s :IN STD_LOGIC_VECTOR (1 DOWNTO 0); y :OUT STD_LOGIC );
END mux4;
ARCHITECTURE archmux OF mux4 IS
BEGIN
y <= a0 WHEN s = “00” else --当s=00时,y=a0 a1 WHEN s = “01” else --当s=01时,y=a1 a2 WHEN s = “10” else --当s=10时,y=a2 a3; --当s取其它值时,y=a3
END archmux;
1.3.3 选择信号赋值语句,WITH-SELECT 语法格式为:
WITH 选择信号X SELECT
信号Y<= 信号A WHEN 选择信号值1, 信号B WHEN 选择信号值2, 信号C WHEN 选择信号值3, ...
信号Z WHEN OTHERS;
WITH-SELECT语句不能在进程中应用,通过选择信号X的值的变化来选择相应的操作。 当选择信号X的值与选择信号值1相同时,执行Y<=信号A,当选择信号X的值与选择信号值2相同时,执行Y<=信号B,只有当选择信号X的值与所列的值都不同时,才执行Y<=
信号Z。
采用选择信号赋值语句WITH-SELECT实现的四选一数据选择器结构体: ARCHITECTURE archmux OF mux4 IS BEGIN
WITH s SELECT y <= a0WHEN “00”, a1WHEN “01”, a2 WHEN “10”,
a3 WHEN OTHERS;
END archmux;
注意:WITH-SLECT语句必须指明所有互斥条件,即“s”的所有取值组合,因为“s”的类型为 “STD_LOGIC_VECTOR”,其取值组合除了00,01,10,11外还有0x,0z,x1,?等。虽然这些取值组合在实际电路中不出现,但也应列出。为避免麻烦可以用OTHERS代替其他各种组合。
1.3.4 块(BLOCK)语句
为了实现复杂数字电路的程序设计,常常采用层次化设计和功能模块化设计方法,在 VHDL语句中,实现这些功能的语句有:块语句(BLOCK),元件(COMPONENT)定义 语句和元件例化(PORT MAP)语句,子程序(过程和函数),以及包和库(LIBRARY)等。 块语句可以看作是结构体中的子模块,它把实现某一特定功能的一些并发语句组合在一 起形成一个语句模块。利用多个块语句可以把一个复杂的结构体划分成多个不同功能的模块,使复杂的结构体结构分明,功能明确,提高了结构体的可读性,块与块语句之间的关系是并行执行的,这种结构体的划分方法仅仅只是形式上的,处于一个设计层次,块与块之间是不透明的,每个块都可以定义共块内使用的数据对象和数据类型,并且这种说明对其它块是无效的。另外,利用块语句中的保护表达式可以控制方块语句的执行。 块语句的格式为: 块标号: BLOCK 说明语句
BEGIN 并行语句区
END BLOCK 块标号;
在块语句说明部分中定义块内局部信号、数据类型、元件和子程序,在块内并行语句区可以 使用VHDL中的所有并行语句。
例1-3-3设计一个电路,包含一个半加器和一个半减器,分别计算出A+B和A-B的结果。 逻辑表达式: 半加器: SUM=A⊕B Co=AB
半减法器: SUB=A⊕B
Bo=BA
把加法和减法分成两个功能模块,分别用两个BLOCK方块语句来表示,设计的程序如 下所示: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY adsu is
PORT(
a, b : IN STD_LOGIC;
co, sum, bo, sub : OUT STD_LOGIC );
END adsu ;
ARCHITECTURE a OF adsu IS BEGIN
half_adder : BLOCK -- half_adder BEGIN
sum <= A XOR B; co<= AAND B;
END BLOCK half_adder;
half_subtractor: BLOCK -- half_subtractor BEGIN
sub<= a XOR b;
bo <= NOT a AND b;
END BLOCK half_subtractor; END a; 小提示:
块语句只是起一种分隔符的作用,使程序编排更加清晰,有层次。功能上与不用块语 句完全相同。
1.3.5 IF-ELSE语句
IF-ELSE语句是最常用的顺序语句,其用法和语句格式与普通的计算机高级语言类似, 在VHDL语言中,它只在进程中使用,根据一个或一组条件来选择某一特定的执行通道。 其常用的格式为: 格式一:
IF 条件表达式1 THEN 语句方块A
ELSIF 条件表达式2 THEN 语句方块B
ELSIF 条件表达式3 THEN 语句方块C :
ELSE
语句方块N
END IF 格式二:
IF 条件表达式THEN 语句方块A
END IF; 格式三:
IF 条件表达式THEN 语句方块A