元件类语句: 结构描述 具体描述电路各元件的端口及其连接; 以基本元件为基础逐级构建; 元件:已经定义的电路模块(实体),可以来自标准库中,也 可以是自己或他人以前编译过的实体; 元件的基本要点: 元件名 输入/输出端口特点; 设计的要点:建立端口之间的连接; 元件语句的一般描述方式 结构体形式: Architecture str of 实体名 is 元件说明; (电路设计中使用的元件及端口) 类型说明; 信号说明; (电路设计中各中间连接点) begin 元件使用语句; (端口与信号(中间连接点及输入 /输出端点)的连接关系) end str; 元件说明: component 元件名 port(信号名:模式 信号类型; ……. 信号名:模式 信号类型); end component; 要点: 元件说明与电路实体说明的编写方式非常相似; 模块名称和对应端口名称应完全一致;其端口排列顺序也应 该完全一致; 所用的电路实体应在work库或已说明的库中; 例:已有元件的程序为 library ieee; use ieee.std_logic_1164.all; entity kand2 is port(a, b: in std_logic; y: out std_logic); end kand2; architecture d of kand2 is begin y <= a and b; end d; 元件说明语句为: component kand2 port(a, b: in std_logic; y: out std_logic); end component; 元件使用语句: 元件编号:元件名 port map(信号对应表); 元件使用语句要点: 对每一元件应该指定唯一的编号; 元件名称应该与已经有的元件名称完全一致; 信号对应表:将本元件的各端口与外部的信号接点或端口建 立连接;每个连接应该具有一个唯一的名称; 顺序关联法:按本元件各端口顺序排列连接点; 名称关联法:将本元件各端口名称逐一与对应的连接点 名称联系起来; 例 希望将上述kand输入与data,en连接,输出与out连接 原来的元件:port(a, b: in std_logic; y: out std_logic); 使用的设置: 顺序法 port(data,en,out); 名称法 port(a=>data,y=>out,b=>en); 结构设计的示例: 例1 inhibit门 yxz ?=(带有元件说明语句的使用) library ieee; use ieee.std_logic_1164.all; entity butnot is port (x,y: in std_logic; z: out std_logic); end butnot; architecture str of butnot is signal temp: std_logic; component kinv port (a: in std_logic; y: out std_logic); end component; component kand2 port (a,b: in std_logic; y: out std_logic); end component; begin u1: kinv port map(y,temp); u2: kand2 port map(x,temp,z); end str; 注意:为了保障使用元件的端口名正确性,需专门设计反相 器kinv和2输入与门kand2的模块,存放于work库中; 其他例题 质数检测器 p.284 质数检测器的结构设计 p.284 表4-43 generate 语句 相同元件的重复使用 在同一结构体中使用多个相同元件时,为避免反复说明, 可以采用generate语句: 元件语句: 编号:for 指标 in 范围 generate 元件编号:元件名 port map(信号1,信号2,…); end generate 在以上语句中,指标为整数,不需要定义,各元件对应 的信号此时成为数组,其下标由指标范围决定; 例2 p.285 8位总线反相器 generate语句的应用 library ieee; use ieee.std_logic_1164.all; entity inv8 is port (a,b,c,d: in std_logic_vector (1 downto 0); y:out std_logic_vector (7 downto 0) ); end inv8; architecture str of inv8 is component kinv port (a: in std_logic; y: out std_logic); end component; signal x:std_logic_vector(7 downto 0); begin x <= a & b & c & d; g1: for b in 7 downto 0 generate u1: kinv port map (x(b),y(b)); end generate; end str; 也可以采用if-generate 语句的形式控制电路的结构变化: 编号:if 关系式 generate 元件语句; end generate; generic 语句 用于端口的控制 当希望一类元件的端口(或其他参量)可以自由变化时, 可以采用generic 语句(类属语句); 在原有元件中的定义:p.285 表4-46 entity …. generic (参量名:参量类型;….); port ….. 经过定义后,在程序中,该参量名可作为常量使用; 在元件语句中赋值: 元件编号:元件名 generic map(参量名=>常量值) port map(信号…); 赋值后,参量名由具体常量值所替代。 例 p.285 表4-47,p.286 表4-48 任意宽度总线反相器 generic语句的应用 带有generic语句的实体 library ieee; use ieee.std_logic_1164.all; entity businv is generic (width:positive:=4); port (x: in std_logic_vector (width-1 downto 0); y:out std_logic_vector (width-1 downto 0) ); end businv; architecture s of businv is component kinv port (a: in std_logic; y: out std_logic); end component; begin g1: for b in width-1 downto 0 generate u1: kinv port map (x(b),y(b)); end generate; end s; 16位总线反相器的结构设计 library ieee; use ieee.std_logic_1164.all; entity inv16 is port (x: in std_logic_vector (15 downto 0); y:out std_logic_vector (15 downto 0) ); end inv16; architecture s of inv16 is component businv is generic (width:positive:=4); port (x: in std_logic_vector (width-1 downto 0); y:out std_logic_vector (width-1 downto 0) ); end component; begin u1: businv generic map(16) port map (x,y); end s; 元件语句的简化使用—宏调用 只要进行相应的资源说明,可以不在结构体中进行元件说明; 例 16位总线反相器的结构设计 (work库的使用) library ieee; use ieee.std_logic_1164.all; use work.all; entity inv16 is port (x: in std_logic_vector (15 downto 0); y:out std_logic_vector (15 downto 0) ); end inv16; architecture s of inv16 is begin u1: businv generic map(16) port map (x,y); end s; 例:8选1数据选择器设计(altera数据库的使用) library ieee; use ieee.std_logic_1164.all; library altera; use altera.maxplus2.all; entity mux8_alt is port(a,b,c,gn:in std_logic; d:in std_logic_vector(7 downto 0); y,wn:out std_logic); end mux8_alt; architecture str of mux8_alt is begin mux:a_74151b port map(c,b,a,d,gn,y,wn); end str; 例 24位寄存器的LPM设计(LPM库的使用) library ieee; use ieee.std_logic_1164.all; library lpm; use lpm.lpm_components.all; entity reg24lpm is port(clk: in std_logic; d:in std_logic_vector(23 downto 0); q: out std_logic_vector(23 downto 0)); end reg24lpm; architecture str of reg24lpm is begin reg24: lpm_ff generic map (lpm_width =>24) port map (data=>d(23 downto 0),clock=>clk,q=>q(23 downto 0)); end str; 简化的元件模式:过程 procedure的定义格式 Procedure过程名( 参量:模式 类型 …… 参量:模式 类型)is 各种说明定义; begin 顺序语句; end 子过程名; procedure的调用格式 过程名(信号列表); (并行语句) procedure结构要点: 1 过程依靠参量与主程序交换信息,参量说明紧跟在过程名 后面的括号中; 2 参量模式为 in 输入 作为常量 out 输出 作为变量或信号 inout 输入输出 作为变量或信号 若要作为信号,则应在参量名前加注signal 3 在主程序中,函数调用通常在表达式中,过程调用通常在 语句中;调用结束时,输出量将赋值给调用时指定的信号或 变量; 4 过程内部可以定义局部使用的类型、常量、变量、函数、 过程,不能定义信号; 5 过程可以进行并行调用,也可以进行顺序调用;并行过 程的参量应该为信号量;顺序过程的参量为变量,可以利用 顺序赋值语句将输出结果传递给信号量; 例 inhibit门 yxz ?=(过程的定义和顺序调用) library ieee; use ieee.std_logic_1164.all; entity butnot1 is port (x,y: in std_logic; z: out std_logic); end butnot1; architecture str of butnot1 is procedure kinv1(a: in std_logic; f: out std_logic) is begin f := not a; end kinv1; procedure kand21(a,b: in std_logic; f: out std_logic) is begin f:= a and b; end kand21; begin process(x,y) variable z1,temp:std_logic; begin kinv1(y,temp); kand21 (x,temp,z1); z<=z1; end process; end str; 结构设计特点: 最直观地进行逻辑电路图的设计,与图形输入设计法最 接近;电路直观,便于调试; 直接进行人工优化,能实现最优化的电路; 使用语句种类最少,能够直接编译综合; 便于实现层次化模块化设计; 需要大量进行人工设计,设计效果依赖经验,设计过程 较长; 进行层次设计时,需要先有底层的元件,才能进行上层 元件及电路的设计。 课外作业 1 根据p.431图5-86,编写一位全加器的结构设计程序; (利用基本门电路) 2 利用上题结果和p.432 图5-87的结构,对4位串行加 法器进行结构设计;