§ 2.3结构体是实体设计的具体描述,包括实体硬件的结构、硬件的类型和功能、元件的互连关系、信号的传输和变换以及动态行为
结构:
architecture结构体名 of 实体名 is
[结构体说明语句 ;]
begin
功能描述语句 ;
end [architecture] 结构体名;
结构体名:是对本结构体的命名,是该结构体的唯一标识符
结构体说明语句:
对结构体内部所使用的信号、常数、数据类型和函数等进行定义
结构体功能描述语句:
描述结构体的行为和结构。
特点:功能描述语句是并行描述语句,不以语句的书写顺序为执行语句包含 5种类型的并行语句:
块语句、进程语句、信号赋值语句、子程序调用语句和元件例化语句例:采用原理图编辑法和文本编辑法设计二输入与非门电路
N A N D 2
ins t
二输入与非门的真值表输 入 输 出
A B Y
0 0 1
0 1 1
1 0 1
1 1 0
文本编辑法 library ieee;
use ieee.std_logic_1164.all;
entity nand_2 is
port(a,b:in std_logic;
c,out std_logic);
end nand_2;
architecture cai of nand_2 is
begin
c<=a nand b;
end cai;
例:采用原理图编辑法和文本编辑法设计二输入或非门电路
N O R 2
in s t
二输入或非门的真值表输 入 输 出
A B Y
0 0 1
0 1 0
1 0 0
1 1 0
文本编辑法 library ieee;
use ieee.std_logic_1164.all;
entity nor_2 is
port(a,b:in std_logic;
c,out std_logic);
end nor_2;
architecture cai of nor_2 is
begin
c<=a nor b;
end cai;
例:采用原理图编辑法和文本编辑法设计二输入异或门电路
N O R 2
in s t
二输入异或门的真值表输 入 输 出
A B Y
0 0 0
0 1 1
1 0 1
1 1 0
文本编辑法 library ieee;
use ieee.std_logic_1164.all;
entity xor_2 is
port(a,b:in std_logic;
c,out std_logic);
end xor_2;
architecture cai of xor_2 is
begin
c<=a xor b;
end cai;
§ 2.4结构体的三种子结构子结构:将一个设计分成几个模块目的:提高设计的条理性和 VHDL程序的可读性。
三种子结构:块 (block)语句结构、进程 (process)语句结构和子程序结构
2.4.1 块语句结构
[块标号,]block[保护表达式 ]
[类属子句 [类属接口表; ];]
[端口子句 [端口接口表; ]; ]
[块说明部分; ]
begin
块语句部分;
end block [块标号 ];
类属子句:用于参数的定义;
端口子句:用于信号的定义;
块说明部分:对该块要用到的信号、常数、元件和子程序等进行说明;
块语句部分:对模块功能进行描述,各个语句是并行执行例:采用原理图编辑法和文本编辑法设计四输入与非门电路
AN D 4
ins t
文本编辑法
library ieee;
use ieee.std_logic_1164.all;
entity and_4 is
port(a,b,c,d:in std_logic;
q,out std_logic);
end and_4;
architecture dataflow of and_4 is
signalq1,q2,std_logic; --结构体说明语句
begin
label1:block
begin
q1<= a and b;
q2 <= c and d;
q <= q1 and q2;
end block label1;
end dataflow;
[块标号,]block[保护表达式 ]
[类属子句 [类属接口表; ];]
[端口子句 [端口接口表; ]; ]
[块说明部分; ]
begin
块语句部分;
end block [块标号 ];
A N D 2
in s t
A N D 2
in s t 1
A N D 2
in s t 2
a
b
c
d
q1
q2
q3个 2输入与门组成的 4输入与门
2.4.2 进程语句结构
一个结构体可包含一个或多个进程;
各个进程语句之间是并发关系;
在每一个进程种,组成这个进程的各个语句是顺序执行的。
[进程标号,]process[敏感信号表 ][is]
[进程语句说明部分; ]
begin
进程语句部分;
end process [进程标号 ];
( 1)进程标号:是一个进程的名字标号;
(2) 敏感信号表:列出了进程对其敏感的所有信号,每当其中一个信号或是多个信号发生变化时,就会引起进程内部顺序语句的执行
(3) 进程语句说明部分:定义进程语句所需要的局部数据环境,主要包括:
数据类型说明、子程序说明和变量说明
(4)进程语句部分:描述一个功能独立的电路例:采用进程语句结构设计二输入与非门电路
library ieee;
use ieee.std_logic_1164.all;
entity nand_2 is
port(a,b:in std_logic;
c,out std_logic);
end nand_2;
architecture one of nand_2 is
signal ab,std_logic_vector (1 downto 0); --结构体说明语句
begin
ab<=a & b; --进程语句说明
process(ab) is
begin
case ab is
when? 00? =>c<=‘ 1’ ;
when? 01? =>c<=‘ 1’ ;
when? 10? =>c<=‘ 1’ ;
when? 11? =>c<=‘ 0’ ;
when others =>null;
end case;
end process;
end one;
例:采用进程语句结构设计二输入或非门电路
library ieee;
use ieee.std_logic_1164.all;
entity nor_2 is
port(a,b:in std_logic;
c,out std_logic);
end nor_2;
architecture one of nor_2 is
signal ab,std_logic_vector (1 downto 0); --结构体说明语句
begin
ab<=a & b;
process(ab) is
begin
case ab is
when? 00? =>c<=‘ 1’ ;
when? 01? =>c<=‘ 0’ ;
when? 10? =>c<=‘ 0’ ;
when? 11? =>c<=‘ 0’ ;
when others =>null;
end case;
end process;
end one;
例:采用进程语句结构设计异或门电路
library ieee;
use ieee.std_logic_1164.all;
entity nor_2 is
port(a,b:in std_logic;
c,out std_logic);
end nor_2;
architecture one of nor_2 is
signal ab,std_logic_vector (1 downto 0); --结构体说明语句
begin
ab<=a & b;
process(ab) is
begin
case ab is
when? 00? =>c<=‘ 0’ ;
when? 01? =>c<=‘ 1’ ;
when? 10? =>c<=‘ 1’ ;
when? 11? =>c<=‘ 0’ ;
when others =>null;
end case;
end process;
end one;
例:采用文本编辑法设计三态门电路
din
en
dout
三态门的电路符号三态门的真值表输 入 输 出
en din dout
1 1 1
1 0 0
0 Z Z
library ieee;
use ieee.std_logic_1164.all;
entity tri_gate is
port(din,en:in std_logic;
dout,out std_logic);
end tri_gate;
architecture one of tri_gate is
begin
process(din,en)
begin
ifen=‘ 1’ then dout <=din;
elsedout<=‘Z’ ;
end if;
end process;
end one;
2.4.3 子程序结构子程序:就是在主程序调用它以后能够将处理结果返回主程序的程序模块。
分类:过程( procedure)和函数 (function)
采用子程序的优点:
(1)可以增强程序的功能和灵活性;
(2) 可以使程序模块清晰易懂,避免大量重复程序的书写。
过程与函数的区别:
( 1)过程通常用来定义一个算法,而函数通常用来产生一个值;
( 2)过程可以具有多个返回值或不产生返回值,而函数只能有一个返回值;
( 3)过程中的形式参数可以有三种方式,in,out和 inout,而函数中的形式参数只有 in方式;
(4) 在过程中允许使用 wait语句或顺序赋值语句,而函数中则不能使用这两种语句。
1、过程
procedure <过程名 > <参数表 > is
[过程说明; ]
begin
<过程语句部分; >
end [procedure] <过程名 >;
过程说明部分:
procedure <过程名 > (参数表 );
过程定义部分:
过程说明部分,用来描述该过程对调用部分的外部接口;
过程定义部分:描述了它所要实现的功能。
2、函数
function <函数名 > <参数表 > return <数据类型 > is
[函数说明; ]
begin
<函数语句部分; >
return (表达式 );
end [function] <函数名 >;
函数说明部分:
function <函数名 > (参数表 ) return <数据类型 >;
函数定义部分:
过程说明部分,用来描述该过程对调用部分的外部接口;
过程定义部分:描述了它所要实现的功能。
第三章 VHDL的基本元素基本元素:标识符、数据对象、数据类型和运算符
§ 3.1 VHDL的标识符与词法单元
3.1.1 标识符标识符的作用,给 VHDL中的语法单位起一个独特的名字语法单位:常量、变量、信号以及进程等
( 1)短标识符( VHDL—— 87标准)
a,标识符主要由字母、数字以及下划线组成;
b,第一个字符必须是英文字母;
c,最后一个字符不能是下划线;
d,标识符中不能出现两个连续的下划线;
e,短标识符不区分大小写;
f,VHDL中的保留字不能作为一般的标识符使用。
例:不符合命名规则的标识符
@clk; 8m_clk; address_; data__bus; buffer
(2) 扩展标识符 (VHDL—— 93标准 )
a,扩展标识符用反斜杠来界定,如,\adder\,\control_machine\;
b,扩展标识符允许包含图形符号和空格等,如,\clk&8m\,\adder%counter\;
c,两个反斜杠之间可以使用保留字,如,\entity\,\architecture\;
d,反斜杠之间可用数字开头,如,\8mclk\,\32counter\;
e,反斜杠之间允许多个下划线相连,如,\data__bus\,\address___bus\;
f,扩展标识符区分大小写,如,\a\与 \A\不同;
g,同名的扩展标识符与短标识符是不同的,如,\adder\和 adder是不同的;
h,扩展标识符中如果含有一个反斜杠,则应该用两个相邻的反斜杠来代替,
如,\data\bus\表示的扩展标识符的名称为 data\bus\。
3.1.2 词法单元
(1)注释以虚线? --? 开始直到本行末尾结束的一段文字,可在程序任何位置标注
(2) 数字可用二进制、八进制、十进制、十六进制表示,可为整数,也可为小数对十进制:
a,在相邻的数字之间插入下划线,对数字的数值不会影响。如:
123_456 (等价于 123456)
b,可在数字前加若干个零,对数字的数值没有影响,如:
00123 (等价于 123)
用实数表示数字时,必须带有小数点,如:
12.0,0.0,3.1415926,11.4E-2
(3) 字符和字符串
字符用单引号括起来的 ASCII码,可以是数值,也可以是字母或符号,如:
‘E’,‘a’,’23’,‘$’
字符串用双引号括起来的字符序列,如:
It will not be converted to integer?
It is time out?
分类:文字字符串、位矢量字符串
a,文字字符串:用双引号括起来的一串文字,如:
a?,?It is wrong?
b,位矢量文字串用双引号括起来的一串数字序列,数字序列前要加基数说明符。
基数说明符:
B,二进制基数符号;
O,八进制基数符号;
X,十六进制基数符号如,B?11010011?,O?377?,X?3FF?
例:设计单向总线缓冲器
din[7…0]
en
dout[7…0]
单向总线缓冲器的电路符号单向总线缓冲器的真值表输 入 输 出
en din[7…0] dout[7…0]
1 1 1
1 0 0
0 Z Z
library ieee;
use ieee.std_logic_1164.all;
entity tri_buffer is
port(din:in std_logic_vector(7 downto 0);
en,in std_logic;
dout,out std_logic_vector(7 downto 0));
end tri_buffer;
architecture one of tri_buffer is
begin
process(din,en)
begin
if en=‘1’ then dout <=din;
else dout<=?ZZZZZZZZ?; --字符串
end if;
end process;
end one;
例:设计一个三输入或门电路
OR3
inst
library ieee;
use ieee.std_logic_1164.all;
entity or_3 is
port(a,b,c:in std_logic ;
q,out std_logic);
end or_3;
architecture one of or_3 is
begin
q<= a or b or c;
end one;
例:设计一个反相器
NOT
ins t
反相器的真值表输入 输 出
1 0
0 1
library ieee;
use ieee.std_logic_1164.all;
entity not1 is
port(a:in std_logic ;
q,out std_logic);
end not1;
architecture one of not1 is
begin
q<= not a;
end one;
library ieee;
use ieee.std_logic_1164.all;
entity not1 is
port(a:in std_logic ;
q,out std_logic);
end not1;
architecture one of not1 is
begin
p1,process(a);
begin
if a=‘1’ then
q<=‘0’;
else
q<= ‘1’;
end if;
end p1;
end one;
或采用进程语句结构:
结构:
architecture结构体名 of 实体名 is
[结构体说明语句 ;]
begin
功能描述语句 ;
end [architecture] 结构体名;
结构体名:是对本结构体的命名,是该结构体的唯一标识符
结构体说明语句:
对结构体内部所使用的信号、常数、数据类型和函数等进行定义
结构体功能描述语句:
描述结构体的行为和结构。
特点:功能描述语句是并行描述语句,不以语句的书写顺序为执行语句包含 5种类型的并行语句:
块语句、进程语句、信号赋值语句、子程序调用语句和元件例化语句例:采用原理图编辑法和文本编辑法设计二输入与非门电路
N A N D 2
ins t
二输入与非门的真值表输 入 输 出
A B Y
0 0 1
0 1 1
1 0 1
1 1 0
文本编辑法 library ieee;
use ieee.std_logic_1164.all;
entity nand_2 is
port(a,b:in std_logic;
c,out std_logic);
end nand_2;
architecture cai of nand_2 is
begin
c<=a nand b;
end cai;
例:采用原理图编辑法和文本编辑法设计二输入或非门电路
N O R 2
in s t
二输入或非门的真值表输 入 输 出
A B Y
0 0 1
0 1 0
1 0 0
1 1 0
文本编辑法 library ieee;
use ieee.std_logic_1164.all;
entity nor_2 is
port(a,b:in std_logic;
c,out std_logic);
end nor_2;
architecture cai of nor_2 is
begin
c<=a nor b;
end cai;
例:采用原理图编辑法和文本编辑法设计二输入异或门电路
N O R 2
in s t
二输入异或门的真值表输 入 输 出
A B Y
0 0 0
0 1 1
1 0 1
1 1 0
文本编辑法 library ieee;
use ieee.std_logic_1164.all;
entity xor_2 is
port(a,b:in std_logic;
c,out std_logic);
end xor_2;
architecture cai of xor_2 is
begin
c<=a xor b;
end cai;
§ 2.4结构体的三种子结构子结构:将一个设计分成几个模块目的:提高设计的条理性和 VHDL程序的可读性。
三种子结构:块 (block)语句结构、进程 (process)语句结构和子程序结构
2.4.1 块语句结构
[块标号,]block[保护表达式 ]
[类属子句 [类属接口表; ];]
[端口子句 [端口接口表; ]; ]
[块说明部分; ]
begin
块语句部分;
end block [块标号 ];
类属子句:用于参数的定义;
端口子句:用于信号的定义;
块说明部分:对该块要用到的信号、常数、元件和子程序等进行说明;
块语句部分:对模块功能进行描述,各个语句是并行执行例:采用原理图编辑法和文本编辑法设计四输入与非门电路
AN D 4
ins t
文本编辑法
library ieee;
use ieee.std_logic_1164.all;
entity and_4 is
port(a,b,c,d:in std_logic;
q,out std_logic);
end and_4;
architecture dataflow of and_4 is
signalq1,q2,std_logic; --结构体说明语句
begin
label1:block
begin
q1<= a and b;
q2 <= c and d;
q <= q1 and q2;
end block label1;
end dataflow;
[块标号,]block[保护表达式 ]
[类属子句 [类属接口表; ];]
[端口子句 [端口接口表; ]; ]
[块说明部分; ]
begin
块语句部分;
end block [块标号 ];
A N D 2
in s t
A N D 2
in s t 1
A N D 2
in s t 2
a
b
c
d
q1
q2
q3个 2输入与门组成的 4输入与门
2.4.2 进程语句结构
一个结构体可包含一个或多个进程;
各个进程语句之间是并发关系;
在每一个进程种,组成这个进程的各个语句是顺序执行的。
[进程标号,]process[敏感信号表 ][is]
[进程语句说明部分; ]
begin
进程语句部分;
end process [进程标号 ];
( 1)进程标号:是一个进程的名字标号;
(2) 敏感信号表:列出了进程对其敏感的所有信号,每当其中一个信号或是多个信号发生变化时,就会引起进程内部顺序语句的执行
(3) 进程语句说明部分:定义进程语句所需要的局部数据环境,主要包括:
数据类型说明、子程序说明和变量说明
(4)进程语句部分:描述一个功能独立的电路例:采用进程语句结构设计二输入与非门电路
library ieee;
use ieee.std_logic_1164.all;
entity nand_2 is
port(a,b:in std_logic;
c,out std_logic);
end nand_2;
architecture one of nand_2 is
signal ab,std_logic_vector (1 downto 0); --结构体说明语句
begin
ab<=a & b; --进程语句说明
process(ab) is
begin
case ab is
when? 00? =>c<=‘ 1’ ;
when? 01? =>c<=‘ 1’ ;
when? 10? =>c<=‘ 1’ ;
when? 11? =>c<=‘ 0’ ;
when others =>null;
end case;
end process;
end one;
例:采用进程语句结构设计二输入或非门电路
library ieee;
use ieee.std_logic_1164.all;
entity nor_2 is
port(a,b:in std_logic;
c,out std_logic);
end nor_2;
architecture one of nor_2 is
signal ab,std_logic_vector (1 downto 0); --结构体说明语句
begin
ab<=a & b;
process(ab) is
begin
case ab is
when? 00? =>c<=‘ 1’ ;
when? 01? =>c<=‘ 0’ ;
when? 10? =>c<=‘ 0’ ;
when? 11? =>c<=‘ 0’ ;
when others =>null;
end case;
end process;
end one;
例:采用进程语句结构设计异或门电路
library ieee;
use ieee.std_logic_1164.all;
entity nor_2 is
port(a,b:in std_logic;
c,out std_logic);
end nor_2;
architecture one of nor_2 is
signal ab,std_logic_vector (1 downto 0); --结构体说明语句
begin
ab<=a & b;
process(ab) is
begin
case ab is
when? 00? =>c<=‘ 0’ ;
when? 01? =>c<=‘ 1’ ;
when? 10? =>c<=‘ 1’ ;
when? 11? =>c<=‘ 0’ ;
when others =>null;
end case;
end process;
end one;
例:采用文本编辑法设计三态门电路
din
en
dout
三态门的电路符号三态门的真值表输 入 输 出
en din dout
1 1 1
1 0 0
0 Z Z
library ieee;
use ieee.std_logic_1164.all;
entity tri_gate is
port(din,en:in std_logic;
dout,out std_logic);
end tri_gate;
architecture one of tri_gate is
begin
process(din,en)
begin
ifen=‘ 1’ then dout <=din;
elsedout<=‘Z’ ;
end if;
end process;
end one;
2.4.3 子程序结构子程序:就是在主程序调用它以后能够将处理结果返回主程序的程序模块。
分类:过程( procedure)和函数 (function)
采用子程序的优点:
(1)可以增强程序的功能和灵活性;
(2) 可以使程序模块清晰易懂,避免大量重复程序的书写。
过程与函数的区别:
( 1)过程通常用来定义一个算法,而函数通常用来产生一个值;
( 2)过程可以具有多个返回值或不产生返回值,而函数只能有一个返回值;
( 3)过程中的形式参数可以有三种方式,in,out和 inout,而函数中的形式参数只有 in方式;
(4) 在过程中允许使用 wait语句或顺序赋值语句,而函数中则不能使用这两种语句。
1、过程
procedure <过程名 > <参数表 > is
[过程说明; ]
begin
<过程语句部分; >
end [procedure] <过程名 >;
过程说明部分:
procedure <过程名 > (参数表 );
过程定义部分:
过程说明部分,用来描述该过程对调用部分的外部接口;
过程定义部分:描述了它所要实现的功能。
2、函数
function <函数名 > <参数表 > return <数据类型 > is
[函数说明; ]
begin
<函数语句部分; >
return (表达式 );
end [function] <函数名 >;
函数说明部分:
function <函数名 > (参数表 ) return <数据类型 >;
函数定义部分:
过程说明部分,用来描述该过程对调用部分的外部接口;
过程定义部分:描述了它所要实现的功能。
第三章 VHDL的基本元素基本元素:标识符、数据对象、数据类型和运算符
§ 3.1 VHDL的标识符与词法单元
3.1.1 标识符标识符的作用,给 VHDL中的语法单位起一个独特的名字语法单位:常量、变量、信号以及进程等
( 1)短标识符( VHDL—— 87标准)
a,标识符主要由字母、数字以及下划线组成;
b,第一个字符必须是英文字母;
c,最后一个字符不能是下划线;
d,标识符中不能出现两个连续的下划线;
e,短标识符不区分大小写;
f,VHDL中的保留字不能作为一般的标识符使用。
例:不符合命名规则的标识符
@clk; 8m_clk; address_; data__bus; buffer
(2) 扩展标识符 (VHDL—— 93标准 )
a,扩展标识符用反斜杠来界定,如,\adder\,\control_machine\;
b,扩展标识符允许包含图形符号和空格等,如,\clk&8m\,\adder%counter\;
c,两个反斜杠之间可以使用保留字,如,\entity\,\architecture\;
d,反斜杠之间可用数字开头,如,\8mclk\,\32counter\;
e,反斜杠之间允许多个下划线相连,如,\data__bus\,\address___bus\;
f,扩展标识符区分大小写,如,\a\与 \A\不同;
g,同名的扩展标识符与短标识符是不同的,如,\adder\和 adder是不同的;
h,扩展标识符中如果含有一个反斜杠,则应该用两个相邻的反斜杠来代替,
如,\data\bus\表示的扩展标识符的名称为 data\bus\。
3.1.2 词法单元
(1)注释以虚线? --? 开始直到本行末尾结束的一段文字,可在程序任何位置标注
(2) 数字可用二进制、八进制、十进制、十六进制表示,可为整数,也可为小数对十进制:
a,在相邻的数字之间插入下划线,对数字的数值不会影响。如:
123_456 (等价于 123456)
b,可在数字前加若干个零,对数字的数值没有影响,如:
00123 (等价于 123)
用实数表示数字时,必须带有小数点,如:
12.0,0.0,3.1415926,11.4E-2
(3) 字符和字符串
字符用单引号括起来的 ASCII码,可以是数值,也可以是字母或符号,如:
‘E’,‘a’,’23’,‘$’
字符串用双引号括起来的字符序列,如:
It will not be converted to integer?
It is time out?
分类:文字字符串、位矢量字符串
a,文字字符串:用双引号括起来的一串文字,如:
a?,?It is wrong?
b,位矢量文字串用双引号括起来的一串数字序列,数字序列前要加基数说明符。
基数说明符:
B,二进制基数符号;
O,八进制基数符号;
X,十六进制基数符号如,B?11010011?,O?377?,X?3FF?
例:设计单向总线缓冲器
din[7…0]
en
dout[7…0]
单向总线缓冲器的电路符号单向总线缓冲器的真值表输 入 输 出
en din[7…0] dout[7…0]
1 1 1
1 0 0
0 Z Z
library ieee;
use ieee.std_logic_1164.all;
entity tri_buffer is
port(din:in std_logic_vector(7 downto 0);
en,in std_logic;
dout,out std_logic_vector(7 downto 0));
end tri_buffer;
architecture one of tri_buffer is
begin
process(din,en)
begin
if en=‘1’ then dout <=din;
else dout<=?ZZZZZZZZ?; --字符串
end if;
end process;
end one;
例:设计一个三输入或门电路
OR3
inst
library ieee;
use ieee.std_logic_1164.all;
entity or_3 is
port(a,b,c:in std_logic ;
q,out std_logic);
end or_3;
architecture one of or_3 is
begin
q<= a or b or c;
end one;
例:设计一个反相器
NOT
ins t
反相器的真值表输入 输 出
1 0
0 1
library ieee;
use ieee.std_logic_1164.all;
entity not1 is
port(a:in std_logic ;
q,out std_logic);
end not1;
architecture one of not1 is
begin
q<= not a;
end one;
library ieee;
use ieee.std_logic_1164.all;
entity not1 is
port(a:in std_logic ;
q,out std_logic);
end not1;
architecture one of not1 is
begin
p1,process(a);
begin
if a=‘1’ then
q<=‘0’;
else
q<= ‘1’;
end if;
end p1;
end one;
或采用进程语句结构: