元件类语句: 结构描述
具体描述电路各元件的端口及其连接;
以基本元件为基础逐级构建;
元件:已经定义的电路模块(实体),可以来自标准库中,也
可以是自己或他人以前编译过的实体;
元件的基本要点: 元件名 输入/输出端口特点;
设计的要点:建立端口之间的连接;
元件语句的一般描述方式
结构体形式:
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位串行加
法器进行结构设计;