2.2 VHDL结构体的子结构描述

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

➢函数和过程中都必须是顺序语句 ➢函数和过程的定义语句中都不能定义信号
程序包(package)
功能: 使已定义的常数、数据类型、函数、过程等能被其他 设计共享的一种数据结构。
格式:
PACKAGE 程序包名 IS 程序包首说明; END 程序包名;
-- 程序包首
PACKAGE BODY 程序包名 IS -- 程序包体 程序包体说明部分以及包体; END 程序包名;
• Process通常带敏感信号,当敏感信号发生变化时将启动 进程。
• 可以有多个Process存在,通过信号进行通信,传递信息。 变量只在Process内部定义。
3. 应用举例
• 例 1 三态缓冲器
• library ieee;
• use std_logic_1164.all;
• entity tri_gate is
✓ std_logic_arith; ✓ std_logic_unsigned; ✓ std_logic_signed; ✓ standard; (VHDL标准包,定义VHDL基本数据类型,子类
型,函数等) ✓ textio; (仿真)
1、库的介绍
库(library)
✓ 是编译后的数据的集合,它存放包、实体、构造体定义和配置定义。 ✓ 库说明总是放在设计单元的最前面。
库(library)
IEEE库包含程序包:
• std_logic_1164; • std_logic_arith; • std_logic unsigned; • std_logic_signed;
STD库包含程序包:
Standard: (VHDL 标准包,定义VHDL基 本数据类型,子类型, 函数等) textio; (仿真)
END PROCESS B;
子程序(SUBPROGRAM)
• 过程(PROCEDURE) • 函数(FUNCTION)
过程(procedure)
功能:相当于一般语言中的子程序,实现程序嵌 套。
格式:
procedure 过程名 (参数表);
--过程首
procedure 过程名 (参数表) is
--过程体
begin
g1: block ( clk =‘1’)
-- ()内是保护表达式,为布尔型
begin
q <= guarded d after 5 ns; --由guarded引导防护语句
qb <= not (d) after 7 ns;
end block g1;
end behav;
✓ 保护条件为真时,保护表达式才起作用,而对非保护表达式不 起作用。
✓ 综合器不支持BLOCK语句。并且在仿真过程中 有其他办法代替BLOCK语句功能,故较少用。
块(BLOCK)
2、BLOCK的应用举例
entity latch is
port ( d , clk : in bit ;
q, qb: out bit);
end latch;
architecture behav of latch is
函数(function)
• 在VHDL中有多种函数形式,包括用户自定 义的函数和在库中现成的具有专用功能的 预定义函数。
• 如果将一个已编制好的函数并入程序包, 函数首必须放在程序包首,而函数体需放 在程序包的包体内。
• 如果在一个结构体或进程中定义函数,则 仅需函数体。
函数(function)
BEGIN [并行语句]
END BLOCK 块标号;
块(BLOCK)
2、BLOCK的应用
✓ BLOCK用于仿真、查错
✓ BLOCK是VHDL中的一种划分机制,每个Block块 相当于一张子原理图。
✓ BLOCK语句的应用只是一种将结构体中的并行 语句进行组合的方法,它的主要目的是改善并 行语句及其结构的可读性,或是利用BLOCK的 保护表达式关闭某些信号。
end inverter;
architecture behav of inverter is begin
process (x) y <= invert (x) after 2ns; -- 函数调用 end process; end behav;
程序包(package)
常见的程序包
✓ std_logic_1164; (VHDL标准包,定义VHDL基本数据类型, 子类型,函数等)
if x =‘1’ and y=‘1’ then O<= ‘1’; else O<=‘0’; end if ; end and2; 过程调用: signal a : bit := ‘1’; signal b : bit :=‘0’; signal c : bit; …… And2 ( a , b , c); -- 过程调用时,注意形参和实参数据类型的一致性 ……
常用库:IEEE库(STD-LOGIC-1164,STD-LOGIC-1076) STD库(VHDL标准库) WORK库(作业库,调用时不需说明)
使库可见的方法: LIBRARY IEEE; USE IEEE.STD-LOGIC-1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
begin if (To_A’event and To_A =‘1’) then To_B<=‘1’ after 20ns; ‘0’ after 30ns; end if;
END PROCESS A; B : PROCESS(To_B)
begin if (To_B’event and To_B=‘1’) then To_A <=‘1’ after 20ns; ‘0’ after 30ns; end if;
• 注意:如果一个过程是在进程中调用,且这个进 程已列出敏感参数表,则不能在此过程中使用 WAIT语句。(进程有两种启动方式:敏感参数表 和WAIT语句)。
过程(procedure)
例: procedure and2 ( x, y : in bit; O : out bit); -- 过程首 procedure and2 ( x, y : in bit; O : out bit) is -- 过程体 begin
进程工作原理
进程1
系统上电
进程挂起
N
敏感信号发生变化?
Y 顺序语句1
顺序语句2
进程2
进程挂起
N
敏感信号发生变化?
Y 顺序语句1
顺序语句2
顺序语句n
顺序语句n
进程语句(PROCESS)
2. 应用说明 • 进程之间是并行的,改变进程之间的顺序对综合和仿真无
影响。
• Process中的语句是顺序执行的,不过其中的信号赋值语 句也可以说是并行的。
函数(function)
功能:将常用的算法包装成子程序,利于共享。
格式:
function 函数名 (参数表) return 数据类型; -- 函数首
function 函数名 (参数表) return 数据类型 is -- 函数体
[ 定义语句 ];
--与过程一样
begin
[顺序语句];
end [函数名];
return (x and y) or y; end sam; begin
process (a) begin
m(0) <= sam ( a(0), a(1), a(2) ); -- 调用函数 SAM m(1) <= sam ( a(2), a(0), a(1) ); m(2) <= sam ( a(1), a(2), a(0) ); end process; end demo;
2.2 VHDL结构体的子结构描述
3种子结构描述
• 块结构语句(Block) • 进程语句(Process) • 子程序结构(Subprograms)
– 过程(Procedure) – 函数(Function)
1、格式
块(ቤተ መጻሕፍቲ ባይዱLOCK)
块标号:BLOCK [(块保护表达式)] -块标号是必须的 [接口说明] [类属说明]
end case; end invert; end logic;
程序包(package)
应用
use work.logic.three_level_logic ; -- 使程序包相关定义可见
use work.logic.invert;
-- 或use work.logic.all; 全部定义可见
entity inverter is port (x: in three_level_logic; y : out three_level_logic);
• begin
• process (din, en)
• if en=’1’ then dout <= din;
• else dout <= “ZZZZZZZZ”;
• end if;
• end process;
• end behav;
多进程的同步
例2 多进程的同步 Architecture behave of proc_syn is Signal To_A, To_B:std_logic; Begin A : PROCESS(To_A)
entity func is port ( a : in bit_vector (0 to 2) ; m : out bit_vector (0 to 2));
end func; architecture demo of func is function sam (x, y, z : bit) return bit is -- 定义函数sam, 函数体 begin
进程语句(PROCESS)
功能:表达结构体内具有条件执行或是顺序执行的
语句。
1.格式
格式1: [进程标号:] PROCESS (敏感信号)
[进程说明部分]; BEGIN
[顺序描述语句]; END PROCESS [进程标号];
进程语句(PROCESS)
格式2: [进程标号:] PROCESS [进程说明部分]; BEGIN WAIT UNTIL(进程激活条件) [顺序描述语句]; END PROCESS [进程标号];
end logic ; package body logic is
function invert (input : three_level_logic) return three_level_logic is begin
case input is when ‘0’ => return ‘1’; when ‘1’ => return ‘0’; when ‘z’ => return ‘z’;
• port ( en: in std_logic;

din : in std_logic_vector (7 downto 0);

dout: out std_logic_vector (7 downto 0));
• end tri_gate;
• architecture behav of tri_gate is
程序包(package)
例: package logic is type three_level_logic is (‘0’,’1’,’z’); constant unknown_velue : three_level_logic := ‘0’; function invert (input : three_level_logic) return three_level_logic;
函数与过程的异同
异:
➢过程常用来定义一个算法,而函数则常用来产生一个特定的 返回值; ➢过程中参数的端口模式一般是IN、OUT或INOUT,而函数 中参数的模式只能是IN。 ➢过程中可以有WAIT语句(但综合器一般不支持),函数中 不能; ➢过程有多个返回值,函数只有一个返回值; ➢函数调用语句只能用在赋值语句或表达式中,过程调用语句 可独立存在。
[定义语句];
--变量、常量、数据类型定义,且 只在过程中有效
begin
[顺序处理语句]; --过程语句
end 过程名;
过程(procedure)
• 如果将过程放入包(PACKAGE)中时,过程首 在包首中,过程体在包体中。
• 如果过程直接在结构体或进程中定义时,不需要 过程首。
• 过程参数表中的参数用IN、OUT、INOUT定义其 端口模式。
相关文档
最新文档