第 6章
VHDL的基本描述语句
EDA技术讲义
6.1 顺序语句
6.1.1 顺序赋值语句
6.1.2 IF 语句
6.1.3 CASE语句
6.1.4 LOOP语句
6.1.5 NEXT语句
6.1.6 EXIT语句
6.1.7 WAIT语句
6.1.8 子程序调用语句
6.1.9 返回语句 (RETURN)
6.1.10 空操作语句 (NULL)
6.1.11 断言 (ASSERT)语句
6.1.12 REPORT语句
EDA技术讲义
6.1 顺序语句
6.1.1 顺序赋值语句
信号赋值语句 变量赋值语句
赋值目标 赋值符号 赋值源
信号 或变量 <=,= 数值、逻辑或 运算表达式
EDA技术讲义
IF < 条件 > THEN
< 语句 > ;
ELSIF < 条件 > THEN
< 语句 > ;
ELSIF < 条件 > THEN
< 语句 > ;
……
ELSE
< 语句 > ;
END IF;
IF语句的一般形式为:
6.1.2 IF 语句
IF < 条件 > THEN
< 语句 > ;
END IF;
IF < 条件 > THEN
< 语句 > ;
ELSE
< 语句 > ;
END IF;
EDA技术讲义
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY ddf IS
PORT (CLK, IN STD_LOGIC ;
D, IN STD_LOGIC ;
Q,QD,OUT STD_LOGIC );
END ddf;
ARCHITECTURE ex OF ddf IS
BEGIN
【 例 】 D触发器的 VHDL语言描述
EDA技术讲义
PROCESS (CLK)
BEGIN
IF (CLK'EVENT) AND (CLK = '1?)THEN
Q <= D;
QD<= not D;
END IF;
END PROCESS ;
END ARCHITECTURE ex ;
【 例 】 D触发器的 VHDL语言描述
EDA技术讲义
【例】 用 VHDL设计一家用告警系统的控制逻辑,它有来
自传感器的三个输入信号 smoke,door,water和准备传输
到告警设备的三个输出触发信号 fire_alarm,burg_alarm、
water_alarm以及使能信号 en和 alarm_en。
VHDL程序描述如下:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY alarm IS
PORT(smoke,door,water:IN std_logic;
en,alarm_en,IN std_logic;
fire_alarm,burg_alarm,water_alarm:OUT std_logic);
END alarm;
ARCHITECTURE alarm_arc OF alarm IS
BEGIN
EDA技术讲义PROCESS(smoke,door,water,en,alarm_en)
BEGIN
IF ((smoke= ?1?) AND (en= ?0?)) THEN
fire_alarm <= ?1?;
ELSE
fire_alarm <= ?0?;
END IF;
IF ((door= ?1?) AND ((en= ?0?)AND (alarm_en= ?0?))) THEN
burg_alarm <= ?1?;
ELSE
burg_alarm <= ?0?;
END IF;
IF ((water= ?1?)AND (en= ?0?)) THEN
water_alarm <= ?1?;
ELSE
water_alarm <= ?0?;
END IF;
END PROCESS;
END alarm_arc;
EDA技术讲义
6.1 顺序语句
6.1.3 CASE语句
CASE语句的结构如下:
CASE < 表达式 > IS
WHEN < 值 > = > < 语句 > ;
WHEN < 值 > | < 值 > = > < 语句 > ;
WHEN < 离散范围 > = > < 语句 > ;
WHEN OTHERS = > < 语句 > ;
END CASE;
多条件选择值的一般表达式为:
选择值 [ |选择值 ]
选择值可以有四种不同的表达方式:
单个普通数值, 如 6。
数值选择范围,如 (2 TO 4),表示取值
为 2,3或 4。
并列数值,如 3?5,表示取值为 3或者 5。
混合方式, 以上三种方式的混合 。
EDA技术讲义
PORT(…
z1,z2,z3,z4, out std_logic);
…
SIGNAL value, INTEGER RANGE 0 TO 15;
CASE value IS
WHEN 0 => z1 <= ?1? ; - - value=0时
WHEN 1 | 3 => z2 <= ?0? ; - - value=1或 3时
WHEN 4 TO 7 | 2 => z3 <= ?1? ; - - value=4,5,6,7或 2时
WHEN OTHERS => z4 <= ?1? ; - - value=8~15时
END CASE
【 例 】
EDA技术讲义
SIGNAL value, INTEGER RANGE 0 TO 15;
SIGNAL out1, STD_LOGIC ;
...
CASE value IS -- 缺少以 WHEN引导的条件句
END CASE;
...
CASE value IS
WHEN 0 => out1<= '1' ; -- value2~ 15的值未包括进去
WHEN 1 => out1<= '0' ;
END CASE
...
CASE value IS
WHEN 0 TO 10 => out1<= '1';-- 选择值中 5~ 10的值有重叠
WHEN 5 TO 15 => out1<= '0';
END CASE;
CASE语句 使用时容易发生的错误:
EDA技术讲义
【 例 】 ( 3-8译码器 )
library ieee;
use ieee.std_logic_1164.all;
entity decode38 is
port(a,b,c,G1,G2,G2B,in std_logic;
y,out std_logic_vector(7 downto 0));
end entity decode38;
architecture ex of decode38 is
signal indata,std_logic_vector(2 downto 0);
begin
indata<= c & b & a;
process(indata,G1,G2,G2B)
begin
if(G1 = '1'and G2 = '0' and G2B = '0') then 接下页
EDA技术讲义
case indata is
when "000" => y <= "11111110";
when "001" => y <= "11111101";
when "010" => y <= "11111011";
when "011" => y <= "11110111";
when "100" => y <= "11101111";
when "101" => y <= "11011111";
when "110" => y <= "10111111";
when "111" => y <= "01111111";
when others => y <= "XXXXXXXX";
end case;
else
y <= "11111111";
end if;
end process;
end architecture ex;
接上页
EDA技术讲义
6.1.4 LOOP语句
( 1) 单个 LOOP语句, 其语法格式如下:
[ LOOP标号,] LOOP
顺序语句
END LOOP [ LOOP标号 ];
( 2) FOR LOOP语句, 语法格式如下:
[LOOP标号,] FOR 循环变量 IN 循环次数范围 LOOP
顺序语句
END LOOP [LOOP标号 ];
用法示例如下:
...
L2, LOOP
a,= a+1;
EXIT L2 WHEN a >10 ; -- 当 a大于 10时跳出循环
END LOOP L2;
...
EDA技术讲义
【 例 】
SIGNAL a,b,c, STD_LOGIC_VECTOR (1 TO 3);
...
FOR n IN 1 To 3 LOOP
a(n) <= b(n) AND c(n);
END LOOP;
此段程序等效于顺序执行以下三个信号赋值操作:
a(1) <= b(1) AND c(1);
a(2) <= b(2) AND c(2);
a(3) <= b(3) AND c(3);
EDA技术讲义【 例 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY p_check IS
PORT ( a, IN STD_LOGIC_VECTOR (7 DOWNTO 0);
y, OUT STD_LOGIC );
END p_check;
ARCHITECTURE opt OF p_check IS
SIGNAL tmp, STD_LOGIC ;
BEGIN
PROCESS(a)
BEGIN
tmp <='0';
FOR n IN 0 TO 7 LOOP
tmp <= tmp XOR a(n);
END LOOP ;
y <= tmp;
END PROCESS;
END opt;
EDA技术讲义
6.1.4 LOOP语句
( 3) WHILE LOOP语句, 语法格式如下:
[LOOP标号,] WHILE条件 LOOP
顺序语句
END LOOP [LOOP标号 ];
EDA技术讲义6.1.5 NEXT语句
NEXT; -- 第一种语句格式
( 无条件终止当前循环, 跳到本次循环的 LOOP语句处, 开始下一次循环 )
NEXT LOOP标号; -- 第二种语句格式
NEXT LOOP标号 WHEN条件表达式; -- 第三种语句格式
【 例 】
...
L1, FOR cnt_value IN 1 TO 8 LOOP
s1:a(cnt_value),= '0';
NEXT WHEN (b=c);
s2:a(cnt_value + 8 ):= '0';
END LOOP L1;
【 例 】
...
L_x,FOR cnt_value IN 1 TO 8 LOOP
s1,a(cnt_value):= '0';
k,= 0;
L_y,LOOP
s2,b(k),= '0';
NEXT L_x WHEN (e>f);
s3,b(k+8),= '0';
k,= k+1;
NEXT LOOP L_y ;
NEXT LOOP L_x ;
...
NEXT语句主要用在 LOOP语句执行中进行有条件的或无条件的转向控制 。
EDA技术讲义
6.1.6 EXIT语句
EXIT; -- 第一种语句格式
EXIT LOOP标号; -- 第二种语句格式
EXIT LOOP标号 WHEN条件表达式; -- 第三种语句格式
【 例 】
SIGNAL a,b, STD_LOGIC_VECTOR (1 DOWNTO 0);
SIGNAL a_less_then_b, Boolean;
...
a_less_then_b <= FALSE ; -- 设初始值
FOR i IN 1 DOWNTO 0 LOOP
IF (a(i)='1' AND b(i)='0') THEN
a_less_then_b <= FALSE ; -- a > b
EXIT ;
ELSIF (a(i)='0' AND b(i)='1') THEN
a_less_then_b <= TRUE ; -- a < b
EXIT;
ELSE NULL;
END IF;
END LOOP; -- 当 i=1时返回 LOOP语句继续比较
EDA技术讲义
6.1.7 WAIT语句
WAIT; -- 第一种语句格式
WAIT ON 信号表; -- 第二种语句格式
WAIT UNTIL 条件表达式; -- 第三种语句格式
WAIT FOR 时间表达式; -- 第四种语句格式, 超时等待语句
【 例 】
SIGNAL s1,s2, STD_LOGIC;
...
PROCESS
BEGIN
...
WAIT ON s1,s2 ;
END PROCESS ;
【 例 】
(a) WAIT_UNTIL结构 (b) WAIT_ON结构
..,LOOP
Wait until enable ='1'; Wait on enable;
..,EXIT WHEN enable ='1';
END LOOP;
EDA技术讲义
6.1.7 WAIT语句
一般地, 只有 WAIT UNTIL格式的等待语句可以被综合器接受 (其余语
句格式只能在 VHDL仿真器中使用 ), WAIT_UNTIL语句有以下三种表达
方式:
WAIT UNTIL 信号 =Value ; -- (1)
WAIT UNTIL 信号 ’ EVENT AND 信号 =Value; -- (2)
WAIT UNTIL NOT 信号 ’ STABLE AND 信号 =Value; -- (3)
如果设 clock为时钟信号输入端, 以下四条 WAIT语句所设的进程启动条
件都是时钟上跳沿, 所以它们对应的硬件结构是一样的:
WAIT UNTIL clock ='1';
WAIT UNTIL rising_edge(clock) ;
WAIT UNTIL NOT clock’STABLE AND clock ='1';
WAIT UNTIL clock ='1' AND clock’EVENT;
EDA技术讲义【 例 】
...
PROCESS
BEGIN
WAIT UNTIL clk ='1';
ave <= a;
WAIT UNTIL clk ='1';
ave <= ave + a;
WAIT UNTIL clk ='1';
ave <= ave + a;
WAIT UNTIL clk ='1';
ave <= (ave + a)/4 ;
END PROCESS ;
【 例 】
PROCESS
BEGIN
rst_loop, LOOP
WAIT UNTIL clock ='1' AND clock’EVENT; -- 等待时钟信号
NEXT rst_loop WHEN (rst='1'); -- 检测复位信号 rst
x <= a ; -- 无复位信号,执行赋值操作
WAIT UNTIL clock ='1' AND clock’EVENT; -- 等待时钟信号
NEXT rst_loop When (rst='1'); -- 检测复位信号 rst
y <= b ; -- 无复位信号,执行赋值操作
END LOOP rst_loop ;
END PROCESS;
EDA技术讲义【 例 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY shifter IS
PORT ( data, IN STD_LOGIC_VECTOR (7 DOWNTO 0);
shift_left,IN STD_LOGIC;
shift_right,IN STD_LOGIC;
clk,IN STD_LOGIC;
reset, IN STD_LOGIC;
mode, IN STD_LOGIC_VECTOR (1 DOWNTO 0);
qout, BUFFER STD_LOGIC_VECTOR (7 DOWNTO 0) );
END shifter;
ARCHITECTURE behave OF shifter IS
SIGNAL enable,STD_LOGIC;
BEGIN
PROCESS
BEGIN
WAIT UNTIL (RISING_EDGE(clk) ); --等待时钟上升沿
IF (reset = '1') THEN qout <= "00000000";
ELSE CASE mode IS
WHEN "01" => qout<=shift_right & qout(7 DOWNTO 1);--右移
WHEN "10" => qout<=qout(6 DOWNTO 0) & shift_left; --左移
WHEN "11" => qout <= data; -- 并行加载
WHEN OTHERS => NULL;
END CASE;
END IF;
END PROCESS;
END behave;
EDA技术讲义
6.1.8 子程序调用语句
调用过程的语句格式如下:
过程名 [([形参名 => ]实参表达式
{, [形参名 => ]实参表达式 }) ];
1、过程调用
一个过程的调用将分别完成以下三个步骤:
( 1)将 IN和 INOUT模式的实参值赋给欲调 用的过程中与它们对应的形参;
( 2)执行这个过程;
( 3)将过程中 IN和 INOUT模式的形参值返回给对应的实参。
EDA技术讲义【例】ENTITY sort4 is
GENERIC (top, INTEGER,=3);
PORT (a,b,c,d, IN BIT_VECTOR (0 TO top);
ra,rb,rc,rd, OUT BIT_VECTOR (0 TO top));
END sort4;
ARCHITECTURE muxes OF sort4 IS
PROCEDURE sort2(x,y, INOUT BIT_VECTOR (0 TO top)) is
VARIABLE tmp, BIT_VECTOR (0 TO top);
BEGIN
IF x > y THEN tmp,= x; x,= y; y,= tmp;
END IF;
END sort2;
BEGIN
PROCESS (a,b,c,d)
VARIABLE va,vb,vc,vd, BIT_VECTOR(0 TO top);
BEGIN
va,= a; vb,= b; vc,= c; vd,= d;
sort2(va,vc);
sort2(vb,vd);
sort2(va,vb);
sort2(vc,vd);
sort2(vb,vc);
ra <= va; rb <= vb; rc <= vc; rd <= vd;
END PROCESS;
END muxes;
EDA技术讲义
2、函数调用
函数调用与过程调用是十分相似的,不同之处是,调用函数将返还
一个指定数据类型的值,函数的参量只能是输入值。
6.1.8 子程序调用语句
EDA技术讲义
6.1.9 返回语句 (RETURN)
RETURN; -- 第一种语句格式
RETURN 表达式; -- 第二种语句格式
【 例 】
PROCEDURE rs (SIGNAL s,r, IN STD_LOGIC ;
SIGNAL q,nq, INOUT STD_LOGIC) IS
BEGIN
IF ( s ='1' AND r ='1') THEN
REPORT "Forbidden state, s and r are quual to '1'";
RETURN ;
ELSE
q <= s AND nq AFTER 5 ns ;
nq <= s AND q AFTER 5 ns ;
END IF ;
END PROCEDURE rs ;
【 例 】
FUNCTION opt (a,b,opr,STD_LOGIC) RETURN STD_LOGIC IS
BEGIN
IF (opr ='1') THEN RETURN (a AND b);
ELSE RETURN (a OR b) ;
END IF ;
END FUNCTION opt ;
EDA技术讲义
6.1.10 空操作语句 (NULL)
空操作语句的语句格式如下:
NULL;
在下例的 CASE语句中, NULL用于排除一些不用的条件 。
CASE Opcode IS
WHEN "001" => tmp,= rega AND regb ;
WHEN "101" => tmp,= rega OR regb ;
WHEN "110" => tmp,= NOT rega ;
WHEN OTHERS => NULL ;
END CASE ;
WHEN OTHERS => tmp,= rega ;
EDA技术讲义
6.1.11 断言( ASSERT) 语句
ASSERT语句主要用于程序仿真, 调试中的人机对话, 它可以给出一个
文字串作为警告和错误信息 。
ASSERT语句的书写格式为:
ASSERT 条件 [REPORT输出信息 ][SEVERITY级别 ]
条件为 真, 向下执行另一个语句, 条件为 假, 则输出错误信
息和错误严重程度的级别 。
出错级别分别是:
NOTE( 注意 ), WARNING( 警告 ), ERROR( 错误 )
FAILURE( 失败 ) 。
【 例 】 七段译码器
…
Assert( NOT(indata>=“1001”))
Report“Errordata.”
Severity error;
…
EDA技术讲义
6.1.12 REPORT语句
REPORT语句不增加任何语言功能 。 只是提供某种形式的顺序断言语
句的短格式 。
REPORT语句的书写格式为:
[REPORT输出信息 ] [SEVERITY级别 ]
【 例 】 七段译码器
…
IF(indata>=“1001”)THEN
Report“Errordata.”;
ELSE
…
EDA技术讲义
6.2 VHDL并行语句
结构体中的并行语句主要有七种:
1,并行信号赋值语句 ( Concurrent Signal Assignments) 。
2、进程语句 (Process Statements)。
3、块语句 (Block Statements)。
4、条件信号赋值语句 (Selected Signal Assignments)。
5、元件例化语句 (Component Instantiations),其中包括类属配置语句。
6、生成语句 (Generate Statements)。
7,并行过程调用语句 (Concurrent Procedure Calls)。
ARCHITECTURE 结构体名 OF 实体名 IS
说明语句
BEGIN
并行语句
END ARCHITECTURE 结构体名
EDA技术讲义
6.2.1 并行信号赋值语句
1,简单信号赋值语句
赋值目标 ?= 表达式
以下结构体中的五条信号赋值语句的执行是并行发生的 。
ARCHITECTURE curt OF bc1 IS
SIGNAL s1,e,f,g,h, STD_LOGIC ;
BEGIN
output1 <= a AND b ;
output2 <= c + d ;
g <= e OR f ;
h <= e XOR f ;
s1 <= g ;
END ARCHITECTURE curt;
6.2 VHDL并行语句
EDA技术讲义
2,条件信号赋值语句
赋值目标 <= 表达式 WHEN 赋值条件 ELSE
表达式 WHEN 赋值条件 ELSE
...
表达式 ;
6.2.1 并行信号赋值语句
6.2 VHDL并行语句
EDA技术讲义
逻辑电路图
【 例 】
ENTITY mux IS
PORT ( a,b,c, IN BIT ;
p1,p2, IN BIT ;
z, OUT BIT );
END;
ARCHITECTURE behv OF mux IS
BEGIN
z <= a WHEN p1 = '1' ELSE
b WHEN p2 = '1' ELSE
c ;
END;
EDA技术讲义
3,选择信号赋值语句
WITH 选择表达式 SELECT
赋值目标信号 <=表达式 WHEN 选择值
表达式 WHEN 选择值
...
表达式 WHEN 选择值;
6.2.1 并行信号赋值语句
6.2 VHDL并行语句
EDA技术讲义【 例 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY decoder IS
PORT ( a,b,c, IN STD_LOGIC;
data1,data2, IN STD_LOGIC;
dataout, OUT STD_LOGIC );
END decoder;
ARCHITECTURE concunt OF decoder IS
SIGNAL instruction, STD_LOGIC_VECTOR(2 DOWNTO 0) ;
BEGIN
instruction <= c & b & a ;
WITH instruction SELECT
dataout <= data1 AND data2 WHEN "000",
data1 OR data2 WHEN "001",
data1 NAND data2 WHEN "010",
data1 NOR data2 WHEN "011",
data1 XOR data2 WHEN "100",
'Z' WHEN OTHERS ;
END concunt ;
EDA技术讲义
3,选择信号赋值语句
...
WITH selt SELECT
muxout <= a WHEN 0|1,-- 0或 1
b WHEN 2 TO 5,-- 2或 3,或 4或 5
c WHEN 6,
d WHEN 7,
'Z' WHEN OTHERS ;
...
6.2.1 并行信号赋值语句
下例是一个列出选择条件为不同取值范围的 4选 1多路选择
器,当不满足条件时,输出呈高阻态。
6.2 VHDL并行语句
EDA技术讲义
6.2.2 块语句结构( BLOCK)
块标号, BLOCK [( 块保护表达式 ) ]
接口说明
类属说明
BEGIN
并行语句
END BLOCK 块标号 ;
6.2 VHDL并行语句
EDA技术讲义
【 例 】
...
b1, BLOCK
SIGNAL s1,BIT ;
BEGIN
S1 <= a AND b ;
b2, BLOCK
SIGNAL s2,BIT ;
BEGIN
s2 <= c AND d ;
b3, BLOCK
BEGIN
Z <= s2 ;
END BLOCK b3 ;
END BLOCK b2 ;
y <= s1 ;
END BLOCK b1 ;
...
EDA技术讲义
6.2.3 并行过程调用语句
过程名(关联参量名) ;
【 例 】
...
PROCEDURE adder(SIGNAL a,b, IN STD_LOGIC ; --过程名为 adder
SIGNAL sum, OUT STD_LOGIC );
...
adder(a1,b1,sum1) ; -- 并行过程调用
..,-- 在此,a1,b1,sum1即为分别对应于 a,b,sum的关联参量名
PROCESS( c1,c2) ; -- 进程语句执行
BEGIN
Adder(c1,c2,s1) ; -- 顺序过程调用,在此 c1,c2,s1即为分别对
END PROCESS ; -- 应于 a,b,sum的关联参量名
6.2 VHDL并行语句
EDA技术讲义
6.2.4 元件例化语句
COMPONENT 元件名 IS
GENERIC ( 类属表 ) ; -- 元件定义语句
PORT ( 端口名表 ) ;
END COMPONENT 文件名;
例化名,元件名 PORT MAP -- 元件例化语句
( [端口名 =>] 连接端口名,,..) ;
6.2 VHDL并行语句
【 例 】 利用元件例化语句设计全加器
元件例化语句是一种应用十分广泛的 VHDL语句, 它
使得在进行 VHDL描述时可以使用以前建立的 VHDL模
块, 避免大量重复工作 。
EDA技术讲义
6.2.5 生成语句
[标号,] FOR 循环变量 IN 取值范围 GENERATE
说明
BEGIN
并行语句
END GENERATE [标号 ];
[标号,] IF 条件 GENERATE
说明
Begin
并行语句
END GENERATE [标号 ];
四部分组成的:
( 1) 生成方式
( 2) 说明部分
( 3) 并行语句
( 4) 标号 表达式 TO 表达式 ; -- 递增方式, 如 1 TO 5表达式 DOWNTO 表达式 ; -- 递减方式, 如 5 DOWNTO 1
取值范围的语句格式, 有两种形式:
6.2 VHDL并行语句
EDA技术讲义
C O M P
I N P U T O U T P U T
C O M P
I N P U T O U T P U T
C O M P
I N P U T O U T P U Ta [ 0 ] b [ 0 ]
a [ 1 ] b [ 1 ]
a [ 7 ] b [ 7 ]
.,,
生成语句产生的 8
个相同的电路模块
【 例 】
...
COMPONENT comp
PORT (x, IN STD_LOGIC ;
y, OUT STD_LOGIC );
END COMPONENT ;
SIGNAL a,STD_LOGIC_VECTOR(0 TO 7);
SIGNAL b,STD_LOGIC_VECTOR(0 TO 7);
...
gen, FOR i IN a’RANGE GENERATE
u1,comp PORT MA (x=>a(i),y=>b(i));
END GENERATE gen,
...
EDA技术讲义
【 例 】 n位二进制计数器 ( n=6)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY d_ff IS
PORT ( d,clk_s, IN STD_LOGIC ;
q, OUT STD_LOGIC ;
nq, OUT STD_LOGIC );
END ENTITY d_ff;
ARCHITECTURE ex1 OF d_ff IS
BEGIN
PROCESS(clk_s)
BEGIN
IF clk_s = '1' AND clk_s'EVENT THEN
q <= d ; nq <= NOT d;
END IF;
END PROCESS;
END ARCHITECTURE ex1;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY cnt_bin_n is
GENERIC (n, INTEGER,= 6);
PORT (q, OUT STD_LOGIC_VECTOR (0 TO n-1);
in_1, IN STD_LOGIC );
END ENTITY cnt_bin_n; 接下页
EDA技术讲义ARCHITECTURE ex2 OF cnt_bin_n IS
COMPONENT d_ff
PORT(d,clk_s, IN STD_LOGIC;
Q,NQ, OUT STD_LOGIC);
END COMPONENT d_ff;
SIGNAL s, STD_LOGIC_VECTOR(0 TO n);
BEGIN
s(0) <= in_1;
q_1, FOR i IN 0 TO n-1 GENERATE
dff, d_ff PORT MAP (s(i+1),s(i),q(i),s(i+1));
END GENERATE q_1 ;
END ARCHITECTURE ex2;
I1
O T 1 1
I2
I3
I4
F D 2 1
I5
F D 2 1
F D 1 1
D0 Q0
F D 1 1
D0 Q0
F D 1 1
D0 Q0
I6
F D 1 1
I7
F D 1 1
I8
M U X 2 1
nqnq
nq
c l kc l kc l k
i = n - 1i = 0 i = 1
s ( n )
s ( 2 )
s ( 1 )
s ( 0 )
q n - 1q1q0
......
6 位二进制计数器原理图
EDA技术讲义
语句, NOT(clock?STABLE AND clock ='1'),的
表达方式是不可综合的 。
6.3 属性描述与定义语句
1,信号类属性
综合器支持的属性有:
LEFT,RIGHT,HIGH,LOW,RANGE、
REVERS RANGE,LENGTH,EVENT及 STABLE。
以下两语句的功能是一样的 。
(NOT clock’STABLE AND clock ='1')
(clock?EVENT AND clock ='1')
注 意:
EDA技术讲义
2,数据区间类属性
【 例 】
...
SIGNAL range1, IN STD LOGIC VECTOR (0 TO 7) ;
...
FOR i IN range1'RANGE LOOP
...
3、数值类属性
...
PROCESS (clock,a,b);
TYPE obj IS ARRAY (0 TO 15) OF BIT ;
SIGNAL ele1,ele2,ele3,ele4, INTEGER ;
BEGIN
ele1 <= obj’RIGNT ;
ele2 <= obj’LEFT ;
ele3 <= obj’HIGH ;
ele4 <= obj’LOW ;
...
EDA技术讲义
【 例 】 奇偶校验判别信号发生器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY parity IS
GENERIC (bus_size, INTEGER,= 8 );
PORT (input_bus:IN STD_LOGIC_VECTOR(bus_size-1 DOWNTO 0);
even_numbits,odd_numbits, OUT STD_LOGIC ) ;
END parity ;
ARCHITECTURE behave OF parity IS
BEGIN
PROCESS (input_bus)
VARIABLE temp,STD_LOGIC;
BEGIN
temp,= '0';
FOR i IN input_bus'LOW TO input_bus'HIGH LOOP
temp:= temp XOR input_bus( i ) ;
END LOOP ;
odd_numbits <= temp ; --奇数个‘ 1’时 temp=‘1’
even_numbits <= NOT temp; --偶数个‘ 1’时 temp=‘0’
END PROCESS;
END behave;
EDA技术讲义
4、数组属性 ’LENGTH
...
TYPE arry1 ARRAY (0 TO 7) OF BIT ;
VARIABLE wth,INTEGER;
...
wth1,=arry1’LENGTH; -- wth1 = 8
...
5、用户定义属性
ATTRIBUTE 属性名, 数据类型 ;
ATTRIBUTE 属性名 OF对象名, 对象类型 IS 值 ;
EDA技术讲义
【 例 】 使用 pinnum属性为端口锁定芯片引脚
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY cntbuf IS
PORT( Dir,IN STD_LOGIC;
Clk,Clr,OE,IN STD_LOGIC;
A,B,INOUT STD_LOGIC_VECTOR (0 to 1);
Q,INOUT STD_LOGIC_VECTOR (3 downto 0) );
ATTRIBUTE PINNUM, STRING;
ATTRIBUTE PINNUM OF Clk,signal is "1";
ATTRIBUTE PINNUM OF Clr,signal is "2";
ATTRIBUTE PINNUM OF Dir,signal is "3";
ATTRIBUTE PINNUM OF OE,signal is "11";
ATTRIBUTE PINNUM OF Q,signal is "17,16,15,14";
END cntbuf;
VHDL的基本描述语句
EDA技术讲义
6.1 顺序语句
6.1.1 顺序赋值语句
6.1.2 IF 语句
6.1.3 CASE语句
6.1.4 LOOP语句
6.1.5 NEXT语句
6.1.6 EXIT语句
6.1.7 WAIT语句
6.1.8 子程序调用语句
6.1.9 返回语句 (RETURN)
6.1.10 空操作语句 (NULL)
6.1.11 断言 (ASSERT)语句
6.1.12 REPORT语句
EDA技术讲义
6.1 顺序语句
6.1.1 顺序赋值语句
信号赋值语句 变量赋值语句
赋值目标 赋值符号 赋值源
信号 或变量 <=,= 数值、逻辑或 运算表达式
EDA技术讲义
IF < 条件 > THEN
< 语句 > ;
ELSIF < 条件 > THEN
< 语句 > ;
ELSIF < 条件 > THEN
< 语句 > ;
……
ELSE
< 语句 > ;
END IF;
IF语句的一般形式为:
6.1.2 IF 语句
IF < 条件 > THEN
< 语句 > ;
END IF;
IF < 条件 > THEN
< 语句 > ;
ELSE
< 语句 > ;
END IF;
EDA技术讲义
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY ddf IS
PORT (CLK, IN STD_LOGIC ;
D, IN STD_LOGIC ;
Q,QD,OUT STD_LOGIC );
END ddf;
ARCHITECTURE ex OF ddf IS
BEGIN
【 例 】 D触发器的 VHDL语言描述
EDA技术讲义
PROCESS (CLK)
BEGIN
IF (CLK'EVENT) AND (CLK = '1?)THEN
Q <= D;
QD<= not D;
END IF;
END PROCESS ;
END ARCHITECTURE ex ;
【 例 】 D触发器的 VHDL语言描述
EDA技术讲义
【例】 用 VHDL设计一家用告警系统的控制逻辑,它有来
自传感器的三个输入信号 smoke,door,water和准备传输
到告警设备的三个输出触发信号 fire_alarm,burg_alarm、
water_alarm以及使能信号 en和 alarm_en。
VHDL程序描述如下:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY alarm IS
PORT(smoke,door,water:IN std_logic;
en,alarm_en,IN std_logic;
fire_alarm,burg_alarm,water_alarm:OUT std_logic);
END alarm;
ARCHITECTURE alarm_arc OF alarm IS
BEGIN
EDA技术讲义PROCESS(smoke,door,water,en,alarm_en)
BEGIN
IF ((smoke= ?1?) AND (en= ?0?)) THEN
fire_alarm <= ?1?;
ELSE
fire_alarm <= ?0?;
END IF;
IF ((door= ?1?) AND ((en= ?0?)AND (alarm_en= ?0?))) THEN
burg_alarm <= ?1?;
ELSE
burg_alarm <= ?0?;
END IF;
IF ((water= ?1?)AND (en= ?0?)) THEN
water_alarm <= ?1?;
ELSE
water_alarm <= ?0?;
END IF;
END PROCESS;
END alarm_arc;
EDA技术讲义
6.1 顺序语句
6.1.3 CASE语句
CASE语句的结构如下:
CASE < 表达式 > IS
WHEN < 值 > = > < 语句 > ;
WHEN < 值 > | < 值 > = > < 语句 > ;
WHEN < 离散范围 > = > < 语句 > ;
WHEN OTHERS = > < 语句 > ;
END CASE;
多条件选择值的一般表达式为:
选择值 [ |选择值 ]
选择值可以有四种不同的表达方式:
单个普通数值, 如 6。
数值选择范围,如 (2 TO 4),表示取值
为 2,3或 4。
并列数值,如 3?5,表示取值为 3或者 5。
混合方式, 以上三种方式的混合 。
EDA技术讲义
PORT(…
z1,z2,z3,z4, out std_logic);
…
SIGNAL value, INTEGER RANGE 0 TO 15;
CASE value IS
WHEN 0 => z1 <= ?1? ; - - value=0时
WHEN 1 | 3 => z2 <= ?0? ; - - value=1或 3时
WHEN 4 TO 7 | 2 => z3 <= ?1? ; - - value=4,5,6,7或 2时
WHEN OTHERS => z4 <= ?1? ; - - value=8~15时
END CASE
【 例 】
EDA技术讲义
SIGNAL value, INTEGER RANGE 0 TO 15;
SIGNAL out1, STD_LOGIC ;
...
CASE value IS -- 缺少以 WHEN引导的条件句
END CASE;
...
CASE value IS
WHEN 0 => out1<= '1' ; -- value2~ 15的值未包括进去
WHEN 1 => out1<= '0' ;
END CASE
...
CASE value IS
WHEN 0 TO 10 => out1<= '1';-- 选择值中 5~ 10的值有重叠
WHEN 5 TO 15 => out1<= '0';
END CASE;
CASE语句 使用时容易发生的错误:
EDA技术讲义
【 例 】 ( 3-8译码器 )
library ieee;
use ieee.std_logic_1164.all;
entity decode38 is
port(a,b,c,G1,G2,G2B,in std_logic;
y,out std_logic_vector(7 downto 0));
end entity decode38;
architecture ex of decode38 is
signal indata,std_logic_vector(2 downto 0);
begin
indata<= c & b & a;
process(indata,G1,G2,G2B)
begin
if(G1 = '1'and G2 = '0' and G2B = '0') then 接下页
EDA技术讲义
case indata is
when "000" => y <= "11111110";
when "001" => y <= "11111101";
when "010" => y <= "11111011";
when "011" => y <= "11110111";
when "100" => y <= "11101111";
when "101" => y <= "11011111";
when "110" => y <= "10111111";
when "111" => y <= "01111111";
when others => y <= "XXXXXXXX";
end case;
else
y <= "11111111";
end if;
end process;
end architecture ex;
接上页
EDA技术讲义
6.1.4 LOOP语句
( 1) 单个 LOOP语句, 其语法格式如下:
[ LOOP标号,] LOOP
顺序语句
END LOOP [ LOOP标号 ];
( 2) FOR LOOP语句, 语法格式如下:
[LOOP标号,] FOR 循环变量 IN 循环次数范围 LOOP
顺序语句
END LOOP [LOOP标号 ];
用法示例如下:
...
L2, LOOP
a,= a+1;
EXIT L2 WHEN a >10 ; -- 当 a大于 10时跳出循环
END LOOP L2;
...
EDA技术讲义
【 例 】
SIGNAL a,b,c, STD_LOGIC_VECTOR (1 TO 3);
...
FOR n IN 1 To 3 LOOP
a(n) <= b(n) AND c(n);
END LOOP;
此段程序等效于顺序执行以下三个信号赋值操作:
a(1) <= b(1) AND c(1);
a(2) <= b(2) AND c(2);
a(3) <= b(3) AND c(3);
EDA技术讲义【 例 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY p_check IS
PORT ( a, IN STD_LOGIC_VECTOR (7 DOWNTO 0);
y, OUT STD_LOGIC );
END p_check;
ARCHITECTURE opt OF p_check IS
SIGNAL tmp, STD_LOGIC ;
BEGIN
PROCESS(a)
BEGIN
tmp <='0';
FOR n IN 0 TO 7 LOOP
tmp <= tmp XOR a(n);
END LOOP ;
y <= tmp;
END PROCESS;
END opt;
EDA技术讲义
6.1.4 LOOP语句
( 3) WHILE LOOP语句, 语法格式如下:
[LOOP标号,] WHILE条件 LOOP
顺序语句
END LOOP [LOOP标号 ];
EDA技术讲义6.1.5 NEXT语句
NEXT; -- 第一种语句格式
( 无条件终止当前循环, 跳到本次循环的 LOOP语句处, 开始下一次循环 )
NEXT LOOP标号; -- 第二种语句格式
NEXT LOOP标号 WHEN条件表达式; -- 第三种语句格式
【 例 】
...
L1, FOR cnt_value IN 1 TO 8 LOOP
s1:a(cnt_value),= '0';
NEXT WHEN (b=c);
s2:a(cnt_value + 8 ):= '0';
END LOOP L1;
【 例 】
...
L_x,FOR cnt_value IN 1 TO 8 LOOP
s1,a(cnt_value):= '0';
k,= 0;
L_y,LOOP
s2,b(k),= '0';
NEXT L_x WHEN (e>f);
s3,b(k+8),= '0';
k,= k+1;
NEXT LOOP L_y ;
NEXT LOOP L_x ;
...
NEXT语句主要用在 LOOP语句执行中进行有条件的或无条件的转向控制 。
EDA技术讲义
6.1.6 EXIT语句
EXIT; -- 第一种语句格式
EXIT LOOP标号; -- 第二种语句格式
EXIT LOOP标号 WHEN条件表达式; -- 第三种语句格式
【 例 】
SIGNAL a,b, STD_LOGIC_VECTOR (1 DOWNTO 0);
SIGNAL a_less_then_b, Boolean;
...
a_less_then_b <= FALSE ; -- 设初始值
FOR i IN 1 DOWNTO 0 LOOP
IF (a(i)='1' AND b(i)='0') THEN
a_less_then_b <= FALSE ; -- a > b
EXIT ;
ELSIF (a(i)='0' AND b(i)='1') THEN
a_less_then_b <= TRUE ; -- a < b
EXIT;
ELSE NULL;
END IF;
END LOOP; -- 当 i=1时返回 LOOP语句继续比较
EDA技术讲义
6.1.7 WAIT语句
WAIT; -- 第一种语句格式
WAIT ON 信号表; -- 第二种语句格式
WAIT UNTIL 条件表达式; -- 第三种语句格式
WAIT FOR 时间表达式; -- 第四种语句格式, 超时等待语句
【 例 】
SIGNAL s1,s2, STD_LOGIC;
...
PROCESS
BEGIN
...
WAIT ON s1,s2 ;
END PROCESS ;
【 例 】
(a) WAIT_UNTIL结构 (b) WAIT_ON结构
..,LOOP
Wait until enable ='1'; Wait on enable;
..,EXIT WHEN enable ='1';
END LOOP;
EDA技术讲义
6.1.7 WAIT语句
一般地, 只有 WAIT UNTIL格式的等待语句可以被综合器接受 (其余语
句格式只能在 VHDL仿真器中使用 ), WAIT_UNTIL语句有以下三种表达
方式:
WAIT UNTIL 信号 =Value ; -- (1)
WAIT UNTIL 信号 ’ EVENT AND 信号 =Value; -- (2)
WAIT UNTIL NOT 信号 ’ STABLE AND 信号 =Value; -- (3)
如果设 clock为时钟信号输入端, 以下四条 WAIT语句所设的进程启动条
件都是时钟上跳沿, 所以它们对应的硬件结构是一样的:
WAIT UNTIL clock ='1';
WAIT UNTIL rising_edge(clock) ;
WAIT UNTIL NOT clock’STABLE AND clock ='1';
WAIT UNTIL clock ='1' AND clock’EVENT;
EDA技术讲义【 例 】
...
PROCESS
BEGIN
WAIT UNTIL clk ='1';
ave <= a;
WAIT UNTIL clk ='1';
ave <= ave + a;
WAIT UNTIL clk ='1';
ave <= ave + a;
WAIT UNTIL clk ='1';
ave <= (ave + a)/4 ;
END PROCESS ;
【 例 】
PROCESS
BEGIN
rst_loop, LOOP
WAIT UNTIL clock ='1' AND clock’EVENT; -- 等待时钟信号
NEXT rst_loop WHEN (rst='1'); -- 检测复位信号 rst
x <= a ; -- 无复位信号,执行赋值操作
WAIT UNTIL clock ='1' AND clock’EVENT; -- 等待时钟信号
NEXT rst_loop When (rst='1'); -- 检测复位信号 rst
y <= b ; -- 无复位信号,执行赋值操作
END LOOP rst_loop ;
END PROCESS;
EDA技术讲义【 例 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY shifter IS
PORT ( data, IN STD_LOGIC_VECTOR (7 DOWNTO 0);
shift_left,IN STD_LOGIC;
shift_right,IN STD_LOGIC;
clk,IN STD_LOGIC;
reset, IN STD_LOGIC;
mode, IN STD_LOGIC_VECTOR (1 DOWNTO 0);
qout, BUFFER STD_LOGIC_VECTOR (7 DOWNTO 0) );
END shifter;
ARCHITECTURE behave OF shifter IS
SIGNAL enable,STD_LOGIC;
BEGIN
PROCESS
BEGIN
WAIT UNTIL (RISING_EDGE(clk) ); --等待时钟上升沿
IF (reset = '1') THEN qout <= "00000000";
ELSE CASE mode IS
WHEN "01" => qout<=shift_right & qout(7 DOWNTO 1);--右移
WHEN "10" => qout<=qout(6 DOWNTO 0) & shift_left; --左移
WHEN "11" => qout <= data; -- 并行加载
WHEN OTHERS => NULL;
END CASE;
END IF;
END PROCESS;
END behave;
EDA技术讲义
6.1.8 子程序调用语句
调用过程的语句格式如下:
过程名 [([形参名 => ]实参表达式
{, [形参名 => ]实参表达式 }) ];
1、过程调用
一个过程的调用将分别完成以下三个步骤:
( 1)将 IN和 INOUT模式的实参值赋给欲调 用的过程中与它们对应的形参;
( 2)执行这个过程;
( 3)将过程中 IN和 INOUT模式的形参值返回给对应的实参。
EDA技术讲义【例】ENTITY sort4 is
GENERIC (top, INTEGER,=3);
PORT (a,b,c,d, IN BIT_VECTOR (0 TO top);
ra,rb,rc,rd, OUT BIT_VECTOR (0 TO top));
END sort4;
ARCHITECTURE muxes OF sort4 IS
PROCEDURE sort2(x,y, INOUT BIT_VECTOR (0 TO top)) is
VARIABLE tmp, BIT_VECTOR (0 TO top);
BEGIN
IF x > y THEN tmp,= x; x,= y; y,= tmp;
END IF;
END sort2;
BEGIN
PROCESS (a,b,c,d)
VARIABLE va,vb,vc,vd, BIT_VECTOR(0 TO top);
BEGIN
va,= a; vb,= b; vc,= c; vd,= d;
sort2(va,vc);
sort2(vb,vd);
sort2(va,vb);
sort2(vc,vd);
sort2(vb,vc);
ra <= va; rb <= vb; rc <= vc; rd <= vd;
END PROCESS;
END muxes;
EDA技术讲义
2、函数调用
函数调用与过程调用是十分相似的,不同之处是,调用函数将返还
一个指定数据类型的值,函数的参量只能是输入值。
6.1.8 子程序调用语句
EDA技术讲义
6.1.9 返回语句 (RETURN)
RETURN; -- 第一种语句格式
RETURN 表达式; -- 第二种语句格式
【 例 】
PROCEDURE rs (SIGNAL s,r, IN STD_LOGIC ;
SIGNAL q,nq, INOUT STD_LOGIC) IS
BEGIN
IF ( s ='1' AND r ='1') THEN
REPORT "Forbidden state, s and r are quual to '1'";
RETURN ;
ELSE
q <= s AND nq AFTER 5 ns ;
nq <= s AND q AFTER 5 ns ;
END IF ;
END PROCEDURE rs ;
【 例 】
FUNCTION opt (a,b,opr,STD_LOGIC) RETURN STD_LOGIC IS
BEGIN
IF (opr ='1') THEN RETURN (a AND b);
ELSE RETURN (a OR b) ;
END IF ;
END FUNCTION opt ;
EDA技术讲义
6.1.10 空操作语句 (NULL)
空操作语句的语句格式如下:
NULL;
在下例的 CASE语句中, NULL用于排除一些不用的条件 。
CASE Opcode IS
WHEN "001" => tmp,= rega AND regb ;
WHEN "101" => tmp,= rega OR regb ;
WHEN "110" => tmp,= NOT rega ;
WHEN OTHERS => NULL ;
END CASE ;
WHEN OTHERS => tmp,= rega ;
EDA技术讲义
6.1.11 断言( ASSERT) 语句
ASSERT语句主要用于程序仿真, 调试中的人机对话, 它可以给出一个
文字串作为警告和错误信息 。
ASSERT语句的书写格式为:
ASSERT 条件 [REPORT输出信息 ][SEVERITY级别 ]
条件为 真, 向下执行另一个语句, 条件为 假, 则输出错误信
息和错误严重程度的级别 。
出错级别分别是:
NOTE( 注意 ), WARNING( 警告 ), ERROR( 错误 )
FAILURE( 失败 ) 。
【 例 】 七段译码器
…
Assert( NOT(indata>=“1001”))
Report“Errordata.”
Severity error;
…
EDA技术讲义
6.1.12 REPORT语句
REPORT语句不增加任何语言功能 。 只是提供某种形式的顺序断言语
句的短格式 。
REPORT语句的书写格式为:
[REPORT输出信息 ] [SEVERITY级别 ]
【 例 】 七段译码器
…
IF(indata>=“1001”)THEN
Report“Errordata.”;
ELSE
…
EDA技术讲义
6.2 VHDL并行语句
结构体中的并行语句主要有七种:
1,并行信号赋值语句 ( Concurrent Signal Assignments) 。
2、进程语句 (Process Statements)。
3、块语句 (Block Statements)。
4、条件信号赋值语句 (Selected Signal Assignments)。
5、元件例化语句 (Component Instantiations),其中包括类属配置语句。
6、生成语句 (Generate Statements)。
7,并行过程调用语句 (Concurrent Procedure Calls)。
ARCHITECTURE 结构体名 OF 实体名 IS
说明语句
BEGIN
并行语句
END ARCHITECTURE 结构体名
EDA技术讲义
6.2.1 并行信号赋值语句
1,简单信号赋值语句
赋值目标 ?= 表达式
以下结构体中的五条信号赋值语句的执行是并行发生的 。
ARCHITECTURE curt OF bc1 IS
SIGNAL s1,e,f,g,h, STD_LOGIC ;
BEGIN
output1 <= a AND b ;
output2 <= c + d ;
g <= e OR f ;
h <= e XOR f ;
s1 <= g ;
END ARCHITECTURE curt;
6.2 VHDL并行语句
EDA技术讲义
2,条件信号赋值语句
赋值目标 <= 表达式 WHEN 赋值条件 ELSE
表达式 WHEN 赋值条件 ELSE
...
表达式 ;
6.2.1 并行信号赋值语句
6.2 VHDL并行语句
EDA技术讲义
逻辑电路图
【 例 】
ENTITY mux IS
PORT ( a,b,c, IN BIT ;
p1,p2, IN BIT ;
z, OUT BIT );
END;
ARCHITECTURE behv OF mux IS
BEGIN
z <= a WHEN p1 = '1' ELSE
b WHEN p2 = '1' ELSE
c ;
END;
EDA技术讲义
3,选择信号赋值语句
WITH 选择表达式 SELECT
赋值目标信号 <=表达式 WHEN 选择值
表达式 WHEN 选择值
...
表达式 WHEN 选择值;
6.2.1 并行信号赋值语句
6.2 VHDL并行语句
EDA技术讲义【 例 】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY decoder IS
PORT ( a,b,c, IN STD_LOGIC;
data1,data2, IN STD_LOGIC;
dataout, OUT STD_LOGIC );
END decoder;
ARCHITECTURE concunt OF decoder IS
SIGNAL instruction, STD_LOGIC_VECTOR(2 DOWNTO 0) ;
BEGIN
instruction <= c & b & a ;
WITH instruction SELECT
dataout <= data1 AND data2 WHEN "000",
data1 OR data2 WHEN "001",
data1 NAND data2 WHEN "010",
data1 NOR data2 WHEN "011",
data1 XOR data2 WHEN "100",
'Z' WHEN OTHERS ;
END concunt ;
EDA技术讲义
3,选择信号赋值语句
...
WITH selt SELECT
muxout <= a WHEN 0|1,-- 0或 1
b WHEN 2 TO 5,-- 2或 3,或 4或 5
c WHEN 6,
d WHEN 7,
'Z' WHEN OTHERS ;
...
6.2.1 并行信号赋值语句
下例是一个列出选择条件为不同取值范围的 4选 1多路选择
器,当不满足条件时,输出呈高阻态。
6.2 VHDL并行语句
EDA技术讲义
6.2.2 块语句结构( BLOCK)
块标号, BLOCK [( 块保护表达式 ) ]
接口说明
类属说明
BEGIN
并行语句
END BLOCK 块标号 ;
6.2 VHDL并行语句
EDA技术讲义
【 例 】
...
b1, BLOCK
SIGNAL s1,BIT ;
BEGIN
S1 <= a AND b ;
b2, BLOCK
SIGNAL s2,BIT ;
BEGIN
s2 <= c AND d ;
b3, BLOCK
BEGIN
Z <= s2 ;
END BLOCK b3 ;
END BLOCK b2 ;
y <= s1 ;
END BLOCK b1 ;
...
EDA技术讲义
6.2.3 并行过程调用语句
过程名(关联参量名) ;
【 例 】
...
PROCEDURE adder(SIGNAL a,b, IN STD_LOGIC ; --过程名为 adder
SIGNAL sum, OUT STD_LOGIC );
...
adder(a1,b1,sum1) ; -- 并行过程调用
..,-- 在此,a1,b1,sum1即为分别对应于 a,b,sum的关联参量名
PROCESS( c1,c2) ; -- 进程语句执行
BEGIN
Adder(c1,c2,s1) ; -- 顺序过程调用,在此 c1,c2,s1即为分别对
END PROCESS ; -- 应于 a,b,sum的关联参量名
6.2 VHDL并行语句
EDA技术讲义
6.2.4 元件例化语句
COMPONENT 元件名 IS
GENERIC ( 类属表 ) ; -- 元件定义语句
PORT ( 端口名表 ) ;
END COMPONENT 文件名;
例化名,元件名 PORT MAP -- 元件例化语句
( [端口名 =>] 连接端口名,,..) ;
6.2 VHDL并行语句
【 例 】 利用元件例化语句设计全加器
元件例化语句是一种应用十分广泛的 VHDL语句, 它
使得在进行 VHDL描述时可以使用以前建立的 VHDL模
块, 避免大量重复工作 。
EDA技术讲义
6.2.5 生成语句
[标号,] FOR 循环变量 IN 取值范围 GENERATE
说明
BEGIN
并行语句
END GENERATE [标号 ];
[标号,] IF 条件 GENERATE
说明
Begin
并行语句
END GENERATE [标号 ];
四部分组成的:
( 1) 生成方式
( 2) 说明部分
( 3) 并行语句
( 4) 标号 表达式 TO 表达式 ; -- 递增方式, 如 1 TO 5表达式 DOWNTO 表达式 ; -- 递减方式, 如 5 DOWNTO 1
取值范围的语句格式, 有两种形式:
6.2 VHDL并行语句
EDA技术讲义
C O M P
I N P U T O U T P U T
C O M P
I N P U T O U T P U T
C O M P
I N P U T O U T P U Ta [ 0 ] b [ 0 ]
a [ 1 ] b [ 1 ]
a [ 7 ] b [ 7 ]
.,,
生成语句产生的 8
个相同的电路模块
【 例 】
...
COMPONENT comp
PORT (x, IN STD_LOGIC ;
y, OUT STD_LOGIC );
END COMPONENT ;
SIGNAL a,STD_LOGIC_VECTOR(0 TO 7);
SIGNAL b,STD_LOGIC_VECTOR(0 TO 7);
...
gen, FOR i IN a’RANGE GENERATE
u1,comp PORT MA (x=>a(i),y=>b(i));
END GENERATE gen,
...
EDA技术讲义
【 例 】 n位二进制计数器 ( n=6)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY d_ff IS
PORT ( d,clk_s, IN STD_LOGIC ;
q, OUT STD_LOGIC ;
nq, OUT STD_LOGIC );
END ENTITY d_ff;
ARCHITECTURE ex1 OF d_ff IS
BEGIN
PROCESS(clk_s)
BEGIN
IF clk_s = '1' AND clk_s'EVENT THEN
q <= d ; nq <= NOT d;
END IF;
END PROCESS;
END ARCHITECTURE ex1;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY cnt_bin_n is
GENERIC (n, INTEGER,= 6);
PORT (q, OUT STD_LOGIC_VECTOR (0 TO n-1);
in_1, IN STD_LOGIC );
END ENTITY cnt_bin_n; 接下页
EDA技术讲义ARCHITECTURE ex2 OF cnt_bin_n IS
COMPONENT d_ff
PORT(d,clk_s, IN STD_LOGIC;
Q,NQ, OUT STD_LOGIC);
END COMPONENT d_ff;
SIGNAL s, STD_LOGIC_VECTOR(0 TO n);
BEGIN
s(0) <= in_1;
q_1, FOR i IN 0 TO n-1 GENERATE
dff, d_ff PORT MAP (s(i+1),s(i),q(i),s(i+1));
END GENERATE q_1 ;
END ARCHITECTURE ex2;
I1
O T 1 1
I2
I3
I4
F D 2 1
I5
F D 2 1
F D 1 1
D0 Q0
F D 1 1
D0 Q0
F D 1 1
D0 Q0
I6
F D 1 1
I7
F D 1 1
I8
M U X 2 1
nqnq
nq
c l kc l kc l k
i = n - 1i = 0 i = 1
s ( n )
s ( 2 )
s ( 1 )
s ( 0 )
q n - 1q1q0
......
6 位二进制计数器原理图
EDA技术讲义
语句, NOT(clock?STABLE AND clock ='1'),的
表达方式是不可综合的 。
6.3 属性描述与定义语句
1,信号类属性
综合器支持的属性有:
LEFT,RIGHT,HIGH,LOW,RANGE、
REVERS RANGE,LENGTH,EVENT及 STABLE。
以下两语句的功能是一样的 。
(NOT clock’STABLE AND clock ='1')
(clock?EVENT AND clock ='1')
注 意:
EDA技术讲义
2,数据区间类属性
【 例 】
...
SIGNAL range1, IN STD LOGIC VECTOR (0 TO 7) ;
...
FOR i IN range1'RANGE LOOP
...
3、数值类属性
...
PROCESS (clock,a,b);
TYPE obj IS ARRAY (0 TO 15) OF BIT ;
SIGNAL ele1,ele2,ele3,ele4, INTEGER ;
BEGIN
ele1 <= obj’RIGNT ;
ele2 <= obj’LEFT ;
ele3 <= obj’HIGH ;
ele4 <= obj’LOW ;
...
EDA技术讲义
【 例 】 奇偶校验判别信号发生器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY parity IS
GENERIC (bus_size, INTEGER,= 8 );
PORT (input_bus:IN STD_LOGIC_VECTOR(bus_size-1 DOWNTO 0);
even_numbits,odd_numbits, OUT STD_LOGIC ) ;
END parity ;
ARCHITECTURE behave OF parity IS
BEGIN
PROCESS (input_bus)
VARIABLE temp,STD_LOGIC;
BEGIN
temp,= '0';
FOR i IN input_bus'LOW TO input_bus'HIGH LOOP
temp:= temp XOR input_bus( i ) ;
END LOOP ;
odd_numbits <= temp ; --奇数个‘ 1’时 temp=‘1’
even_numbits <= NOT temp; --偶数个‘ 1’时 temp=‘0’
END PROCESS;
END behave;
EDA技术讲义
4、数组属性 ’LENGTH
...
TYPE arry1 ARRAY (0 TO 7) OF BIT ;
VARIABLE wth,INTEGER;
...
wth1,=arry1’LENGTH; -- wth1 = 8
...
5、用户定义属性
ATTRIBUTE 属性名, 数据类型 ;
ATTRIBUTE 属性名 OF对象名, 对象类型 IS 值 ;
EDA技术讲义
【 例 】 使用 pinnum属性为端口锁定芯片引脚
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY cntbuf IS
PORT( Dir,IN STD_LOGIC;
Clk,Clr,OE,IN STD_LOGIC;
A,B,INOUT STD_LOGIC_VECTOR (0 to 1);
Q,INOUT STD_LOGIC_VECTOR (3 downto 0) );
ATTRIBUTE PINNUM, STRING;
ATTRIBUTE PINNUM OF Clk,signal is "1";
ATTRIBUTE PINNUM OF Clr,signal is "2";
ATTRIBUTE PINNUM OF Dir,signal is "3";
ATTRIBUTE PINNUM OF OE,signal is "11";
ATTRIBUTE PINNUM OF Q,signal is "17,16,15,14";
END cntbuf;