数字系统与 VHDL程序设计语言
引例,
VHDL原理,
可编
程逻
辑器




目标
器件
接口
软件编程
牛 自 动 生 产 线
牛罐头
酸辣味儿
五香味儿
麻辣味儿
计算机控制系统
? VHDL语言
非常高速硬件描述语言,也就是一种硬件 (数字电路 )设计语
言, 其 最大特点 是对电路的行为与结构进行高度抽象化规范
化,并对设计进行模拟验证与综合优化,使分析和设计高
度自动化。
? 支持 VHDL语言的软件平台
Max+PlusII
? 由软件设计到硬件实现之间的媒介
CPLD / FPGA (可编程器件 )
在 Max+PlusII编写 VHDL程序
存盘
(文件名为实体名,后缀为,VHD)
编译
软件仿真
管脚安排
下载
?













基本顺序语句
( 1) Process语句
( 2) If-Else语句
( 3) Case-When语句
( 4) Null语句
( 5) Wait until语句
( 6) 变量赋值语句
( 7) For-Loop语句
( 8) 过程调用语句
基本的并行语句
( 1) 直接赋值语句
( 2) Process语句
( 3) When-Else
( 4) With-Select-When
( 5) 元件例化语句
( 6) For-Generate
常用数字电路回顾
( 1)编码器
A7
A6
A5
A4
A3
A2
A1
A0
EN
Y2
Y1
Y0
8 X 3



?
输入
信号 ?
输出
信号
使能端口
注,EN为 1时编码器工作
00010000000
10001000000
01000100000
11000010000
00100001000
10100000100
01100000010
11100000001
01201234567 YYYAAAAAAAA
00010000000 10001000000
01000100000 11000010000
00100001000 10100000100
01100000010 11100000001
01201234567 YYYAAAAAAAA
00010000000 1001000000
0100100000 11000010000
00100001000 10100000100
0110000010 11100000001
01201234567 YYYAAAAAAAA
00010000000
10001000000
01000100000
11000010000
0101
10100000100
01100000010
101
01201234567 YYYAAAAAAAA
00010000000
10001000000
01000100000
1100010000
0101
1010000100
0110000010
101
01201234567 YYYAAAAAAAA
00010000000
10001000000
01000100000
11000010000
00100001000
10100000100
01100000010
11100000001
01201234567 YYYAAAAAAAA
举例
参看 EWB辅助电路
( 2)译码器
Y3 Y2 Y1 Y0
1 1 1 0
1 1 0 1
1 0 1 1
0 1 1 1
A1 A0
0 0
0 1
1 0
1 1A1 A0
0 0
0 1
1 0
1 1
Y3 Y2 Y1 Y0
1 1 1 0
1 1 0 1
1 0 1 1
0 1 1 1
S
1 × × 1 1 1 1 0
0
0
0
译码器
1 2 3 4 5 6 7 8
16 15 14 13 12 11 10 9
Vc c Y0 Y1 Y2 Y3 Y4 Y5 Y6
A0 A1 A2 S3 S2 S1 Y7 GN D
C T7 41 3 8
VHDL与数字电路设计
引 言 VHDL简介
一、由来
VHDL是 Very High speed Integrated Circuit Hardware
Description Language ( 非常高速集成电路硬件描述语言)
的英文缩写。它是由美国国防部支持的一项研究计划,于
1983年创建,目的是以文字化方法描述电子电路与系统。至
今 VHDL约有 40年的发展历史,1987年,VHDL成为 IEEE标准,
即 IEEE1076标准,1993年修改为 IEEE1164标准,1996年,
IEEE又将电路合成的标准程序与规格加入到 VHDL语言中,称
为 1076.3标准。之后,又有 1076.4标准和 1076.6标准。
第一章 VHDL的程序结构和软件操作
1-1 VHDL程序的基本结构
1-2软件操作 —Max+plusⅡ 的操作
第一章 VHDL的程序结构和软件操作
1-1 VHDL程序的基本结构
( 1) LIBRARY和 PACHAGE的声明部分
作用:库 ( Library) 是用于存放预先编译好的程序包
( Package), 程序包中定义了数据集合体, 逻
辑操作和元件等 。 主要是声明在设计或实体中
将用到的常数, 数据类型, 元件及子程序等 。
使用格式,LIBRARY 库名;
USE 库名, 程序包名, All;
( 2) ENTITY定义
作用:定义本设计的输入 /出端口, 即定义电路的外观,
即 I/O接口的类型和数量使用格式,

端口名,端口模式 数据类型; );
ENTITY 实体名 Is
End 实体名;
格式,
Port ( 端口名,端口模式 数据类型;
( 3) ARCHITECTURE定义
作用:定义实体的实现。即电路的具体描述,说明电路执
行什么动作或实现功能。
ARCHITECTURE 结构体名 Of 实体名 Is
Begin
描述语句;
End 结构体名;
使用格式,
在 Max+plusⅡ 系统中有 4个库能支持 VHDL语言, 它们分
别是 Std库, IEEE库, Altera库和 Lpm库 。 Std库和 IEEE库
提供基本的逻辑运算函数及数据类型转换函数等 。 IEEE
库中的程序包 std_logic_1164定义了 std_logic和
std_logic_vector等数据类型 。
举例, 设计一个与门电路

A
B
Y
111
001
010
000
YBA
逻辑符号 真值表
Library IEEE;
Use std.standard.all;
Entity and2 is
Port( A,in bit;
B,in bit;
Y,out bit);
End and2;
--首先定义输入输出端口名字,
模式( Mode),信号类型
--注意最后语句的分号在括号外
实体定义,
Architecture Na of and2 is
Begin
Y<=?0? when a=?0? and B= ?0?
else?0? when A=?1? and B = ?0?
else ?0? when A=?0? and B = ?1?
else ?1?;
End Na
结构体定义,
端口模式有以下几种类型,IN ; OUT; INOUT; BUFFER。
Architecture Nb of and2 is
Begin
c <=?1? when a=?1? and b = ?1? else
?0?;
End Nb;
以上结构体表达何种电路?
一个实体可以有几个结构体,即结构体的定义可以有不同的形式
结论,
1-2软件操作 —Max+plusⅡ 的操作
1-2-1 建立和编写一个 VHDL语言的工程文件
1-2-2 VHDL程序的编译
1-2-3 VHDL语言程序的仿真
1-2-4 芯片的时序分析
1-2-5 安排芯片脚位
1-2软件操作 —Max+plusⅡ 的操作
1.Max+plusⅡ 开发工具是美国 Altera公司自行设计的一种软
件工具, 其全称为 Multiple Array Matrix and Programmable
Logic User System。 它具有原理图输入和文本输入 ( 采用
硬件描述语言 ) 两种输入手段, 利用该工具所配备的编
辑, 编译, 仿真, 综合, 芯片编程等功能, 将设计电路
图或电路描述程序变成基本的逻辑单元写入到可编程的
芯片中 ( 如 FPGA芯片 ), 作成 ASIC芯片 。 它是 EDA设
计中不可缺少的一种工具 。
2,软件安装
我们通过范例介绍:利用 Max+plusⅡ 系统
( 1) 如何编写 VHDL程序 ( 使用 Text Editor) ;
( 2)如何编译 VHDL程序(使用 Compiler);
( 3)如何仿真验证 VHDL程序(使用 Waveform Editor,Simulator);
( 4)如何进行芯片的时序分析(使用 Timing Analyzer);
( 5) 如何安排芯片脚位 ( 使用 Floorplan Editor) ;
( 6)如何下载程序至芯片(使用 Programmer)。
1-2-1 建立和编写一个 VHDL语言的工程文件
首先启动 Max+plusⅡ 系统, 启动后系统进入主菜单画面, 在主菜单
上有 5个选项, 分别是,Max+plusⅡ, File,Assign,Options和 Help。
( 1) 打开文本编辑器;用鼠标点击 File选项, 点击子菜单中的
New选项, 接着屏幕会出现 New的对话框 。 在对话框内有 4
种编辑方式:图形编辑, 符号编辑, 文本编辑和波形编辑 。
VHDL文件属于文本, 那么应该选择文本编辑方式, 点击
OK按钮, 屏幕上将出现一个无名的编辑窗口, 则系统进入
文本编辑状态 。
( 2)在编辑窗口中进行编辑输入,输入相应的描述语句。
( 3) 存盘 。 ( a 我们编辑的 VHDL文件扩展名为 vhd; b 保存的文
件名必须和所定义的实体名相同 。 c 文件存盘的目录不应是
根目录或桌面, 建议存放在 Max2work或 Maxplus2目录, 或
其子目录 。 )
以与门的设计为例讲述具体过程
1-2-2 VHDL程序的编译
( 1)若文件没有打开,需首先打开要编译的 VHDL文件;
( 2) 将目前的文件设置成工程文件;点击 File选项, 光标移到子菜单的
Project项停留几秒钟, 屏幕上会出现下一级菜单, 点击 Set Project to
Current File
( 3) 打开编译器;点击主菜单 MAX+plusⅡ /Compiler选项, 屏幕上就出现编译
对话框 。
( 4)开始编译;完成了上述编译前的准备及必要的设置工作,点击编译对话框
中的 Start按钮,编译即开始。
以与门的设计为例讲述具体过程
1-2-3 VHDL语言程序的仿真
仿真是为了验证我们所编写的 VHDL程序的功能是否正确。
( 1)首先生成仿真波形文件
( a) 打开波形编辑器;点击主菜单的 MAX+plusⅡ /Waveform Editor选项, 就
可在屏幕上显示波形编辑器窗口 。 在未输入信号名以前, 整个窗口是空
白的 。
( b)确定仿真持续时间( File/End Time)。
( c)选则输入输出端口名;
( d)编辑输入信号波形;
( e) 信号波形编辑完成后,需存盘为仿真使用,文件名采取默认方式即可。
( 2) 打开仿真器;点击主菜单 MAX+plusⅡ \Simulator项, 此时弹出 Simulator
对话框 。 点击对话框的 Start按钮, 仿真即开始 。 在仿真结束后打开仿真波
形文件 ( 点击右下角的 Open SCF按钮 ) 即可以显示仿真结果 。
(以与门的设计为例讲述具体过程 )
1-2-4 芯片的时序分析
仿真结果从波形上来看, 很难给出定量的信号延迟关系, 这一点时序分析却能
直观地用表来进行显示 。
( 1)选择要下载的器件型号;
( 2)需要再编译一次。
(点击主菜单的 Assign/Device项得到 Device对话框 )
( 3)打开时序仿真器; (点击 Timing Analyzer选项 )
( 4)最后点击 Start按钮后,时序分析器开始启动。
(以与门的设计为例讲述具体过程 )
1-2-5 安排芯片脚位
为了将程序下载到芯片,需安排芯片脚位。
( 1)打开芯片脚位设置器; (MAX+plusⅡ /Floorplan Editor)
( 2)将实体定义的端口名字和下载芯片的管脚进行具体对应;
( 3)最后再进行一次编译。
教学演示片
第二章 VHDL语言要素
V H D L 语言要素包括
数据对象
变量
信号
常数
数据类型
操作数
运算操作符
§ 2.1 VHDL语言规则
数字型文字、字符串文字、标识符、下标名、段名
§ 2-2 数据类型
数据类型分类:逻辑信号类型和数值信号类型 。
§ 2-2-1逻辑数据类型
( 1)布尔代数( Boolean)型
定义位置:在 std库的 standard程序包中进行定义。
信号形式,FALSE,TRUE
( 2)位( Bit)
定义位置:在 std库的 standard程序包中进行定义。
信号形式,0,1 (低电位,高电位 )
编码器,
A7
A6
A5
A4
A3
A2
A1
A0
EN
Y2
Y1
Y0
8 X 3



?
输入
信号 ?
输出
信号
00010000000
10001000000
01000100000
11000010000
00100001000
10100000100
01100000010
11100000001
01201234567 YYYAAAAAAAA
00010000000 10001000000
01000100000 11000010000
00100001000 10100000100
01100000010 11100000001
01201234567 YYYAAAAAAAA
00010000000 1001000000
0100100000 11000010000
00100001000 10100000100
0110000010 11100000001
01201234567 YYYAAAAAAAA
00010000000
10001000000
01000100000
11000010000
0101
10100000100
01100000010
101
01201234567 YYYAAAAAAAA
00010000000
10001000000
01000100000
1100010000
0101
1010000100
0110000010
101
01201234567 YYYAAAAAAAA
00010000000
10001000000
01000100000
11000010000
00100001000
10100000100
01100000010
11100000001
01201234567 YYYAAAAAAAA
( 3)位数组类型( Bit_Vector)
定义位置:在 std库的 standard程序包中进行定义。
例, Signal A,bit_vector(0 to 7);
Signal B,bit_vector(2 downto 0);
A7
A6
A5
A4
A3
A2
A1
A0
EN
Y2
Y1
Y0
8 X 3



?
输入
信号 ?
输出
信号
A7
A6
A5
A4
A3
A2
A1
A0
EN
Y2
Y1
Y0
8 X 3



( 4) 标准逻辑型 ( Std_Logic )
定义位置,在 IEEE库的 std_logic_1164程序包中进行定义
可以看出, 这个, 标准逻辑, 信号定义, 比, 位即 bit”信号对于数字逻辑电
路的
逻辑特性描述更完整, 更真实 。 所以在 VHDL的程序里, 对于逻辑信号的定
义, 通常都是采用这个, 标准逻辑, 信号形式 。
使用这类数据信号,必须包含下面两条声明语句,
Library IEEE;
Use IEEE.std_logic_1164.all;
( 5) 标准逻辑数组类型 ( Std_Logic_vector)
定义位置:在 ieee库的 std_logic_1164程序包中进行定义。
Bit_Vector与 Std_Logic_vector的区别在于数组的
每一位前者为 BIT型 ( 0,1) 后者为 Std_Logic型
§ 2-2-2 数值数据类型
( 1) 整数 ( Integer)
定义位置:在 std库的 standard程序包中进行定义 。 即数值范
围为 -231~231。
( 2) 无符号 ( Unsigned) 和有符号 ( Signed) 类型
定义位置:有符号 ( Signed) 和无符号 ( Unsigned) 逻辑信号定义在
库 IEEE的程序包 std_logic_arith中 。
有符号类型数据代表有符号数值, 即可以是正数, 0,负数;编
译器将有符号数类型作为一个补码的二进制数, 最左边的位为
符号位 。
无符号类型数据代表无符号数值,即代表 0或正数;最左边的位
为最高位。如,Unsigned(“0110”)代表 ; +6
+ 10
Unsigned(“1010”)代表
如,signed(“0110”)代表 +6; signed(“1010”)代表 -2。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity data is
port(a,b,in unsigned(3 downto 0); --相应改为 a,b,in signed(3 downto 0);
c,out std_logic);
end data;
architecture m1 of data is
begin
c<='1' when a<b else '0';
end m1;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
列举 a,b具体值
当定义成无符号数据类型时,若 a<=”1000”,b=?0001?,即 a=8,b=1则结果
另外:还有其他 positive,natural,real数据类型以及用户自定义数据
类型等。这些数据类型各有 特点,以后用到再行讲解
c=?1?。
c=?0?;
当定义成有符号数据类型时,若 a<=”1000”,b=?0001?,a=-8,b=1,则结果
§ 2.3 VHDL数据对象
数据对象( Data Objects), 凡是可以被赋予一个值的对象称为数据对象,
数据对象用于传递信号。
例,
数据对象名 数据对象类型 数据对象值的类型
2-3-1 信号
信号数据对象,代表电路内部传输线路线路,其在元件之间起互连作用
信号数据对象的定义格式为,
Signal 信号名:数据类型 [,=设定值 ];
如,
Signal A, Std_logic_vector(3 Down to 0),=,0000”;
注意:由于 Maxplus II系统往往会忽略信号对象定义时所赋初始值, 建议在结
构体中用赋值语句完成对信号的赋值 。
信号赋值语句的语法格式为,
目标信号名 <=表达式(设定值);
A <=,1010”
2-3-2 变量
它用于对中间数据的临时存储,并不一定代表电路的某一组件。
变量数据对象的定义格式为,Variable 变量名:数据类型 [,=设定值 ];
如,Variable a,integer,= 0;
变量赋值语句的语法格式为:目标变量名,= 表达式 ( 设定值 ) ;
注意:由于 MAXPLUSII系统往往会忽略变量对象定义时所赋初始值, 建议在结
构体中用赋值语句完成对变量的赋值 。
如,a,= b+c;
常数的定义格式为,Constant 常数名:数据类型, =表达式;
如,Constant D1,Integer:=3;
Constant D2,Std_Logic_Vector(D1 Down to 0),=,0000”;
注意:常数数据对象定义的同时进行赋值。赋值符号为,,=”
2-3-3 常数
2-3-4 信号、变量,常数对比
一、定义
Signal A,std_logic;
Variable A,std_logic_vector(7 downto 0);
Constant A,integer,=6 ;
二、赋值及赋值时刻
A <=,1010”;(延时)
A,=,1010”; (立刻)
三、定义区域
信号:实体、结构体、程序包
变量:进程、子程序
常数:实体、结构体、程序包、块、进程、子程序
四、适用范围
信号:实体、结构体、程序包
变量:定义了变量的进程、子程序的顺序语句中
常数:视其定义的位置而定
若常数定义在实体中,适用范围是实体所对应的
有结构体。
若常数定义在结构体中,适用范围就是本结构体。
=1
=1
c
b
x
y
执行结果为,
x<=c xor b,y<=c xor b
执行结果为,
x<=c xor a,y<=c xor b
=1
=1
c
a
x
y
b
练习,
1.定义信号 A1,A2,A3,A4,A5,A6,A7,A8
其中每一位信号均为标准逻辑型
2,定义信号 B,其数据类型为标准逻辑型。
3.定义信号 C,数据类型为整数型。
4,给 A,B赋值,其中 A的值为 11001101; B的值为 0。
Library IEEE
Use ieee.std_logic_1164.all
Signal A,std_logic_vector(1 to 8)
Signal B,std_logic
Signal C,integer
Library Std
Use std.standard.all
A<=“11001101”
B<=?0?
2.4 VHDL 操作符
VHDL操作符:逻辑、算术、符号、关系操作符。
2.4.1 逻辑运算符
一、分类及功能
And(与),Or(或),Not(非),Nand(与非),
Nor(或非),Xor(异或),Xnor(同或)。
A B
AND OR NAND NOR XOR XNOR输入
输出 运算
0 0
0 1
1 0
1 1
Y1 Y2 Y3 Y4 Y5 Y6
0
0
0
1
0
1
1
1
1
1
1
0
1
0
0
0
0
1
1
0
1
0
0
1
二, 用法
1,操作数的数据类型必须符合操作符的要求
能进行逻辑运算的数据类型,bit,bit_vector,boolean
std_logic,std_logic_vector

Signal a,b,y,std_logic;
Signal c,d,z,integer;
y<=a and b;
z<=c and d;
2,表达式中有多个运算符时一般要加括号
表达式中有多个运算符时一般要加括号,但 and,or,xnor除外

Signal a,b,c,d,std_logic_vector(3 downto 0);
Signal e,f,g,h,std_logic_vector(1 downto 0);
d<=a and b and c;
d<=a or b or c;
d<=a xnor b xnor c;
h<=e nor f nor g;
h<=(e nor f) nor g;
3,运算符两侧的操作数要对称
d<=(e nor f) nor g; ×
Library IEEE
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY liti IS ;
PORT(a,b,c,d,IN STD_LOGIC;
e, out STD_LOGIC);
END liti ;
ACHITECTURE AA1 OF liti IS
BEGIN
e<=(a and b) or tmp ;
Signal tmp, std_logic;
tmp<= c xor d ;
END AA1 ;
1
=1
&
a
b
c
d
e
2.4.2 关系运算符
=(等于),/=(不等于),<(小于),>(大于),
<=(小于等于,和信号的赋值符号相同),>=(大于等于)。

1.等于和不等于的操作对象可以是任何数据类型构成的操作数。
2.其它关系运算符对数据类型有一定的限制。(整数,枚举型)
3,=,/= 在实现硬件电路时比其它的关系运算符对芯片的利用率
要高
ENTITY my1 is
PORT(a,b, in bit_vector(0 to 3)
m, out boolean ) ;
END my1 ;
ARCHITECTURE a1 of my1
BEGIN
m<=(a = b) ;
END a1;
ENTITY my1 is
PORT(a,b, in bit_vector(0 to 3)
m, out boolean ) ;
ARCHITECTURE a1 of my1
BEGIN
m<=(a >= b) ;
END a1;
以上两程序最终所实现的硬件电路见课本 P78
END my1 ;
2.4.3 算术运算符
一、分类及功能
求和运算符、求积运算符、符号运算符、混合运算符、移位运算符
二, 运用
1.求和运算符
VHDL中的求和运算符包括加减运算和并置运算,操作
数的数据类型为整型。
例 1,Variable a,b,c,d,e,f, integer range 0 to 255;
a,= b + c ; d,= e – f ;
例 2,Signal a, std_logic_vector(4 to 0);
Signal b, std_logic_vector(2 to 0);
Signal c, std_logic_vector(1 to 0);
a <= b ? c
2,移位运算符
移位运算所对应的数据类型为一维数组,其中的元素维 bit,boolean
例,
Variable a1, std_logic_vector(3 to 0);
a1,=,1011”;
a1 SLL 1 ; a1= 0110
a1 SLL 2 ; a1= 1100
a1 ROL 1 ; a1= 0111
3,其它

二, 应用
现在 VHDL已成功地应用于 ASIC自动设计的模拟验证和综合优化
等方面。 VHDL是以文字的方式设计电路,在应用上,目前 VHDL
语言还仅限于数字电路的开发和设计。
三, VHDL和电路图设计方式比较
VHDL与电路图设计电路的方式不同, 主要有如下几方面
的优越性,
( 1) 易于修改;
( 2) 设计能力更强;
( 3) VHDL语言很方便:独立于器件设计;相同的程序
代码可以用于不同厂家生产的器件 。
VHDL 操作符复习回顾
一、逻辑运算符
And(与),Or(或),Not(非),Nand(与非),
Nor(或非),Xor(异或),Xnor(同或)。
A B
AND OR NAND NOR XOR XNOR输入
输出 运算
0 0
0 1
1 0
1 1
Y1 Y2 Y3 Y4 Y5 Y6
0
0
0
1
0
1
1
1
1
1
1
0
1
0
0
0
0
1
1
0
1
0
0
1
能进行逻辑运算的数据类型,bit,bit_vector,boolean
std_logic,std_logic_vector
二、关系运算符
=(等于),/=(不等于),<(小于),>(大于),
<=(小于等于,和信号的赋值符号相同),>=(大于等于)。
1.等于和不等于的操作对象可以是任何数据类型构成的操作数。
2.其它关系运算符对数据类型有一定的限制。(整数,枚举型)
三、算术运算符
求和运算符,求积运算符、符号运算符、混合运算符,移位运算符
VHDL中的求和运算符包括加减运算和并置运算,操作数的数据类型
为整型。
Signal a, std_logic_vector(4 downto 0);
Signal b, std_logic_vector(2 downto 0);
Signal c, std_logic_vector(1 downto 0);
B2 B1 B0b:
C1 C0c:
b ? c
B2 B1 B0b,C1 C0,c? B2 B1 B0 C1 C0
a <= b ? c
A4 A3 A2 A1 A0a:
a,B2 B1 B0 C1 C0
Variable A, std_logic_vector(6 downto 0);
A,=,10110001”; 1 0 1 1 0 0 0 1
A:
A SLL 1 ; 1 0 1 1 0 0 0 1
A:
0
1 0 1 1 0 0 0 1
A:
0
A ROL 1 ;
1 0 1 1 0 0 0 1
A:
1
第三章 VHDL顺序语句
一、顺序语句概念
顺序语句的特点是,每一条顺序语句的 执行顺序 是与它们的 书写顺
序 基本一致的。 顺序语句只能出现在进程( Process)和子程序中,
子程序包括函数( Function)和过程( Procedure)。
二、种类
? 进程语句
?赋值语句
? 流程控制语句
? 等待语句
? 子程序调用语句
? 返回语句
? 空操作语句
3.1 进程语句 ( Process 语句)
ABC
ABCA
A B CB
A B CC
A B CCBA ??
0
0
0
0
输入信号发生变化时,电路启动进行计算

﹠﹠



A
B
C
Y1
Y2
Y3
Y4
Y
?进程语句是由顺序语句构成的,通过信号与结构体其余部分进行信
息交流,在进程中有一个敏感信号列表,表中列出的任何信号的改
变都将启动进程,执行进程内相应的顺序语句。进程语句是将并行
语句和顺序语句区分开来的标志之一。
语法格式,
[进程标号,] Process [(敏感信号列表 )]
[Variable declarations] --变量声明
Begin
顺序语句;
End Process [Process label];
Process(sel,x1,x2)
Begin
f<=x1;
If sel=1 then
f<=x2;
end if;
End process;
Process(sel,x1,x2)
Begin
If sel=1 then
f<=x2;
end if;
f<=x1;
End process;
?
在第二个进程中, 无论什么情况, f=x1,而在第一个进程中,
只有信号 sel /=1时, f=x1。 因此, 语句的排列顺序很重要, 会
影响信号的输出结果 。


3.2 赋值语句
赋值语句包括变量赋值语句和信号赋值语句,前者的赋值是立刻发生的,
后者的赋值发生在一个进程结束的时刻,并延时进行。
变量赋值目标,= 赋值源
信号赋值目标 <= 赋值源
在同一进程中,同一信号赋值目标有多个赋值源时,信号赋值目标获
得的是最后一个赋值源的值,其前面相同的赋值目标不做任何变化。
注,
3.2.1 信号和变量赋值
Signal s1,s2, std_logic ;
Signal sec, std_logic_vector(0 to 7);
Process (s1,s2)
Variable v1,v2, std_logic;
Begin
v1,= ?1?;
v2,= ?1? ;
s1 <= ?1?;
s2 <= ?1?;
sec(0) <= v1;
sec(1) <= v2;
sec(2) <= s1;
sec(3) <= s2;
v1, = ?0?;
v2, = ?0?;
s2 <= ?0?;
sec(4) <= v1;
sec(5) <= v2;
sec(6) <= s1;
sec(7) <= s2;
END PROCESS
,0100 0111,
3.2.2 信号和变量赋值举例
1,标识符赋值目标
Variable a,b, std_logic;
Signal c, std_logic_vector(1 to 4);
a,= ?1?;
b,= ?0?;
c <=“1100”;
c(3) <=?1?;
注,
一位值用单引号,多位值用双引号
2,段赋值
Signal c, std_logic_vector(1 to 4);
c(1 to 2) <=?10?;
c(1 to 4) <=?1010?;
3,块赋值
Signal a,b,c,d, std_logic;
Signal s, std_logic_vector(1 to 4);
s <=,0100” ;
(a,b,c,d) <= s ;
位置关联
Variable e,f, std_logic;
Variable g, std_logic_vector(1 to 2);
Variable h,std_logic_vector(1 to 4);
e,= ?0? ;
f,= ?1? ;
g,=,10”;
h,=(e=>3,f=>4,g(1)=>2,g(2)=>1);
名称关联
结果,h的值为 1010
3.3 流程控制语句
3.3.1 IF语句
语法格式,
If expression Then
statement;
Elsif expression Then
statement;
Elsif Then
statement;
else
statement;
End if;












例 1,
A1 A2 Y
0 0
0 1
1 0
11
D0
D1
D2
D3
A1
A2
D0 D1 D2 D3
Y
四选一数
据选择器
Process(A)
Begin
If A=”00” then
f<=D0;
elsif A=”01” then
f<=D1;
elsif A=”10” then
f<=D2;
else f<=D3;
end if;
end process;
一,第一种 IF语句
IF 条件句 THEN
顺序语句
END IF


语句
格式
IF ( a >b ) THEN
out<= ?1?;
END IF;
二、第二种 IF语句
IF 条件句 THEN
顺序语句
ELSE
顺序语句
END IF
语句
格式


IF ( a >b ) THEN
out<= ?1?;
ELSE
out<=?0?;
END IF;
三、第三种 IF语句
语法格式,
If 条件句 Then
顺序语句 ;
Elsif 条件句 Then
顺序语句 ;
Elsif 条件语句 Then
顺序语句 ;
else
顺序语句 ;
End if;




例题 1,
Signal a,b,c,p1,p2,z, bit;
IF (p1=?1?) THEN
z <=a;
ELSIF (p2=?0?) THEN
z <= b;
ELSE
z <= c;
END IF;
选择方式
P1 P2 Z
0 0
0 1
1 0
11
c
b
a
a
画线部分意思,ELSIF (p1=?0? and p2=?0?) 注
例题 2,8线- 3线优先编码器



I0
I1
I2
I3
I4
I5
I6
I7
Y2
Y1
Y3
I 7 I 6 I 5 I 4 I 3 I 2 I 1 I 0 Y3 Y2 Y1
1 1 1 1
0 1 1 1 0
0 0 1 1 0 1
0 0 0 1 1 0 0
0 0 0 0 1 0 1 1
0 0 0 0 0 1 0 1 0
0 0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 1 0 0 0
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY coder IS
PORT(I, IN STD_LOGIC_VECTOR(0 TO 7)
Y,OUT STD_LOGIC_VECTOR(1 TO 3));
END coder ;



I0
I1
I2
I3
I4
I5
I6
I7
Y2
Y1
Y3
实 体 设 计
功能:设计元件外观
ARCHITECTURE a1 or coder IS
Begin
IF (I(7)=?1?) THEN Y<=“111”;
ELSIF (I(6)=?1?) THEN Y<=“110”;
ELSIF (I(5)=?1?) THEN Y<=“101”;
ELSIF (I(4)=?1?) THEN Y<=“100”;
ELSIF (I(3)=?1?) THEN Y<=“011”;
ELSIF (I(2)=?1?) THEN Y<=“010”;
ELSIF (I(1)=?1?) THEN Y<=“001”;
ELSE Y<=“000”;
A7 A6 A5 A4 A3 A2 A1 A0 Y3 Y2 Y1
1 1 1 1
0 1 1 1 0
0 0 1 1 0 1
0 0 0 1 1 0 0
0 0 0 0 1 0 1 1
0 0 0 0 0 1 0 1 0
0 0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 1 0 0 0
END a1;
结 构 体 设 计
功能:描述输入和输出之间的逻辑关系
END IF;
练习题,设计一个 3线- 8线译码器
A1 A2 A3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
0 0 0 0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 1 0 0
0 1 1 0 0 0 0 1 0 0 0
1 0 0 0 0 0 1 0 0 0 0
1 0 1 0 0 1 0 0 0 0 0
1 1 0 0 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0
A1
A2
A3
Y1
Y2
Y3
Y4
Y5
Y6
Y0
Y7
3 线-8
线译码器
元件外观 输入输出逻辑关系
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY coder IS
PORT(A, IN STD_LOGIC_VECTOR(1 TO 3)
Y,OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END coder ;
实 体 设 计
功能:设计元件外观
A1
A2
A3
Y1
Y2
Y3
Y4
Y5
Y6
Y0
Y7
3 线-8
线译码器
ARCHITECTURE a1 or coder IS
Begin
IF A=“000” THEN Y<=“00000001”;
ELSIF A=“001” THEN Y<=“00000010”;
ELSIF A=“010” THEN Y<=“00000100”;
ELSIF A=“011” THEN Y<=“00001000”;
ELSIF A=“100” THEN Y<=“00010000”;
ELSIF A=“101” THEN Y<=“00100000”;
ELSIF A=“110” THEN Y<=“01000000”;
ELSE Y<=“10000000”;
END a1;
结 构 体 设 计
功能:描述输入和输出之间的逻辑关系
END IF;
A1 A2 A3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
0 0 0 0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 1 0 0
0 1 1 0 0 0 0 1 0 0 0
1 0 0 0 0 0 1 0 0 0 0
1 0 1 0 0 1 0 0 0 0 0
1 1 0 0 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0
3.3.2Case-When语句
作用:根据条件进行相应的赋值操作。
语法格式,
Case 表达式 Is
When 选择值 =>顺序语句
When 选择值 =>顺序语句

End case;
CASE 语句根据满足的条件 直接 选择多项顺序语句的一项执行
=>不是信号赋值符号,其意思等价于, THEN”

例题 1,用 CASE语句设计四选一数据选择器
s1
s2
a
b
c
d
z
M U X 4 1
s1 s1 Y
0 0
0 1
1 0
11
a
b
c
d
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL
ENTITY mux41 IS
PORT ( s1,s2, in std_logic;
a,,b,c,d,in std_logic;
z,out std_logic);
END ENTITY mux41;
ARCHITECTURE activ OF mux41 IS
SIGNAL s,std_logic_vector(1 downto 0);
BEGIN
S<= s1& s2
PROCESS (s1,s2,a,b,c,d)
BEGIN
CASE s IS
WHEN,00”=> z<=a;
WHEN,01”=> z<=b;
WHEN,10”=> z<=c;
WHEN,11”=> z<=d;
WHEN OTHERS => z<=?x?;
END CASE;
END PROCESS;
END activ;
s1
s2
a
b
c
d
z
M U X 4 1
ARCHITECTURE activ OF mux41 IS
SIGNAL s,std_logic_vector(1 downto 0);
BEGIN
S<= s1& s2
PROCESS (s1,s2,a,b,c,d)
BEGIN
IF s =“00” then a=>z;
ELSIF s=“01” then b=>z;
ELSIF s=“10” then c=>z;
ELSE d=>z;
END IF;
END ARCHITECTURE activ;
ARCHITECTURE activ OF mux41 IS
SIGNAL s,std_logic_vector(1 downto 0);
BEGIN
S<= s1& s2
PROCESS (s1,s2,a,b,c,d)
BEGIN
CASE s IS
WHEN,00”=> z<=a;
WHEN,01”=> z<=b;
WHEN,10”=> z<=c;
WHEN,11”=> z<=d;
WHEN OTHERS => z<=?x?;
END CASE;
END PROCESS;
END activ;
例题 2,
SIGNAL SEL, INTEGER RANGE 0 TO 15;
……
CASE SEL IS
WHEN 0 => Z1 <=?1?;
WHEN 1 3 =>Z2 <=?1?;
WHEN 4 TO 7 2 => Z3<=?1?;
WHEN OTHERS =>Z4<=?1?;
IF 与 CASE比较
1,IF语句中条件句之间是相与的关系,
CASE语句中条件句之间是相或的关系。
2,CASE条件语句必须将所有情况列出而 IF则不必。
3,IF语句可实现优先级,CASE语句则不可以。
课堂练习题,试设计一个 4位奇偶校验器
奇偶
校验
A1
A2
A3
A4
Y
A1 A2 A3 A4 Y
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
0 0 1 1 1
0 1 0 0 0
0 1 0 1 1
0 1 1 0 1
0 1 1 1 0
1 0 0 0 0
1 0 0 1 1
1 0 1 0 1
1 0 1 1 0
1 1 0 0 1
1 1 0 1 0
1 1 1 0 0
1 1 1 1 1
数码显示
一、数码显示器
(一 ) 发光二极管 ↗ ↗
发光二极管特性,当加正向电压时,二极管导通并发光,利用这了
一特性可制成共阴极和共阳极七段数码显示器。
(二 ) 七段数码显示器
1.工作原理













a
b
c
d
e
f
g

共阴极接法
a b c d e f g
a
b
c
d
e
f
g
2.显示代码概念
a b c d e f g
a
b
c
d
e
f g
1 1 1 1 0 1 1
9的显示代码


显示代码
a b c d e f g
1 1 1 1 1 1 0
0 1 1 0 0 0 0
1 1 0 1 1 0 1
1 1 1 1 0 0 1
0 1 1 0 0 1 1
0 1 1 0 0 1 1
1 0 1 1 1 1 1
1 1 1 0 0 0 0
1 1 1 1 1 1 1
1 1 1 1 0 1 1
辅助
实验





显示译码器功能
15
14
13
12
11
10
9
Yf
Yg
Ya
Yb
Yc
Yd
Ye
A1
A2
A3
A0
a
d
g
A3 A2 A1 A0 Ya Yb Yc Yd Ye Yf Yg
0 0 0 0 1 1 1 1 1 1 0 0
0 0 0 1 0 1 1 0 0 0 0 1
0 0 1 0 1 1 0 1 1 0 1 2
0 0 1 1 1 1 1 1 0 0 1 3
0 1 0 0 0 1 1 0 0 1 1 4
0 1 0 1 1 0 1 1 0 1 1 5
0 1 1 0 0 0 1 1 1 1 1 6
0 1 1 1 1 1 1 0 0 0 0 7
1 0 0 0 1 1 1 1 1 1 1 8
1 0 0 1 1 1 1 0 0 1 1 9
输入 输出
显示结果
其真值表如下所示,
输入代码 输出显示代码
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Entity btod is
Port(A, in std_logic_vector(3
downto 0);
Y, out std_logic_vector(6 downto
0));
End btod;
Architecture a1 of btod is
Begin
Process(d)
Begin
Case A is
when "0000,=> Y<= "0111111”; --0
when "0001,=> Y<= " 0000110”; --1
when "0010,=> Y<= " 1011011”; --2
when "0011,=> Y<= " 1001111” ;--3
when "0100,=> Y<= " 1100110” ;--4
when "0101,=> Y<= " 1101101” ;--5
when "0110,=> Y<= " 1111101”; --6
when "0111,=> Y<= " 0000111”; --7
when,1000,=> Y<=,1111111,; --8
when,1001,=> Y<= " 1101111” ;--9
End a1;
3.3.3 LOOP语句
一、单个 LOOP语句
[LOOP标号,] LOOP
顺序语句
END LOOP [LOOP标号 ];
例,
L2, LOOP
a:= a + 1 ;
EXIT L2 WHEN a >10;
END LOOP L2;
二,FOR_LOOP语句
[LOOP标号,] FOR 循环变量 IN 循环次数范围 LOOP
顺序语句;
END LOOP [LOOP 标号 ] ;
A7 A6 A5 A4 A3 A2 A1 A0 X O R 结果
1 1 1 0 0 0 0 1 0
1 1 1 1 1 0 0 1 0
1 1 1 0 0 0 0 0 1
1 1 1 1 1 0 0 0 1
例:试设计一个八位奇偶校验器
注,0 XOR a = a
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY JIOU IS
PORT (a, IN STD_LOGIC_VECTOR(7DOWNTO 0);
y,OUT STD_LOGIC);
END JIOU;
ARCHITECTURE OPT OF JIOU 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;
三, WHILE_LOOP语句
[标号,] WHILE 循环控制变量 LOOP
顺序语句
END LOOP [标号 ];
例 1,
Shift1, PROCESS (inputx)
VARIABLE n, POSITIVE,=1
BEGIN
L1, WHILE n<8 LOOP
outputx(n)<= input (n+8);
n:= n+1;
END LOOP L1;
END PROCESS Shift1;
3.3.4 NEXT与 EXIT语句
NEXT;
NEXT LOOP 标号;
NEXT LOOP 标号 WHEN 条件表达式;
EXIT;
EXIT LOOP 标号;
EXIT LOOP 标号 WHEN 条件表达式;








LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY BIJIAO IS
PORT (a, IN STD_LOGIC_VECTOR(0 TO 7);
b, IN STD_LOGIC_VECTOR(0 TO 7);
y,OUT STD_LOGIC);
END BIJIAO;
ARCHITECTURE JIEGOU OF BIJIAO IS
Signal tmp, STD_LOGIC_VECTOR(0 TO 7);
Signal tmq, std_logic;
BEGIN
PROCESS (a,b)
BEGIN
FOR n IN 0 TO 7 LOOP
tmp(n)<= a(n) xnor b(n);
Next when (tmp(n)=?1?);
tmq<=?1?;
END LOOP;
y <= tmq;
END PROCESS;
END JIEGOU;
NEXT
语句
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY BIJIAO IS
PORT (a, IN STD_LOGIC_VECTOR(0 TO 7);
b, IN STD_LOGIC_VECTOR(0 TO 7);
y,OUT STD_LOGIC);
END BIJIAO;
ARCHITECTURE JIEGOU OF BIJIAO IS
Signal tmp, STD_LOGIC_VECTOR(0 TO 7);
BEGIN
PROCESS (a,b)
BEGIN
FOR n IN 0 TO 7 LOOP
tmp(n)<= a(n) xnor b(n);
EXIT when (tmp(n)=?0?);
END LOOP;
y <=?1?;
END PROCESS;
END JIEGOU;
EXIT
语句
3.4 子程序及其调用
子程序概述
函数 (Function)
过程( Procedure)
子程序调用
3,5 返回语句( Return)
3,6 空操作语句( NULL)
3,7 其它语句
3.4.1 子程序概述
子程序是一个 VHDL程序模块,由顺序语句构成,用于完成
重复性的计算工作,子程序有两种类型,即过程( Procedure)
和函数( Function)。子程序的使用方法只能通过子程序调
用及与子程序的界面端口进行通信。每调用一次子程序都意
味着增加了一个硬件电路模块,因此,在实际使用时,要密
切关注和严格控制子程序的调用次数。
3.4.2 函数 (Function)
--函数首 Function 函数名 (参数表) Return 数据类型
Function 函数名 (参数表) Return 数据类型 IS
说明部分
Begin
顺序语句
END Function 函数名;
--函数体
注,参数表中参量可以是变量、信号、常数(默认)
无需定义参数的方向(默认为,输入,)
例 1 Entity func Is Port ( a,in bit_vector (0 to 2) ;
m, out bit_vector(0 to 2));
End Entity func;
Architecture demo Of func Is
Function sam ( x,y,z,bit) Return bit is
Begin
Return (x and y) or z
End Function sam;
Begin
Process (a)
Begin
m(0)<=sam(a(0),a(1),a(2));
m(1)<=sam(a(2),a(0),a(1));
m(0)<=sam(a(1),a(2),a(0));
End Process;
End Architecture demo;



输入
变量
注意:函数定
义的位置 函



例 2
Function trans (value, bit_vector(0 to 3) )
Return bit_vector Is
Begin
Case value IS
When,0000”= >Return,1100”;
When,0101”= >Return,1100”;
When Others= >Return,1111”;
End Case;
End Function trans;
3.4.3 过程( Procedure)
--过程首 Procedure 过程名 (参数表)
Procedure 过程名 (参数表) IS
说明部分
Begin
顺序语句
END Procedure 过程名;
--过程体
注,参数表中参量可以时变量、信号、常数(默认)
参数的方向可以是 IN,OUT,INOUT

Procedure prg1 (variable value:inout bit_vector(0 to 3) )
Begin
Case value IS
When,0000”= >Return,1100”;
When,0101”= >Return,0000”;
When Others= >Return,1111”;
End Case;
End Procedure Prg1;
3.4.4 子程序调用
例题
ENTITY liti IS
PORT (a,b,c,d:in bit_vector(0 to 3);
ra,rb,rc,rd:our bit_vector(0 to 3));
END liti;
ARCHITECTURE muxes OF liti is
Procedure sort(x,y:inout bit_vector(0 to 3)) is
variable tmp:bit_vector(0 to 3);
Begin
If x>y then tmp:=x;x:=y;y:=tmp;
END IF;
END SORT;
Begin
Process (a,b,c,d)
Begin
sort (a,c);
sort (b,d);
sort (a,b);
sort (c,d);
sort (b,c);
END process;
ra<=a; rb<=b;
rc<=c; rd<=d;
END muxes;
3.4.5 函数与过程对比
? 过程可以返回多值,函数只能返回一个值。
? 过程的参数为 IN,OUT,INOUT
函数的参数为 IN(默认 )。
? 函数和过程均能产生新的电路模块。
3,5 返回语句( Return)
Return ;
Return 表达式; 只能用于 Function
Procedure rs (signal s,r, in std_logic;
signal q,nq, inout std_logic) is
Begin
If (s=?1? and r=?1?) then Return
Else
q<=s and nq
Nq<=s and q
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;
Return 语句的作用就是结束当前运行的子程序,
所不同的是过程无条件返回,并且不返回任何值。
函数必须返回一个值
3,6 空操作语句( 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;
注,NULL语句有时会造成不必要的寄存器
3,7 其它语句
clock? EVENT and clock =?1?;
功能,
clock? EVENT 就是对信号在当前的一个极小
的时间段内电平是否发生变化进行检测。
例 1,Process (clock)
If (clock?EVENT and clock=?1?) then
Q<=DATA
End If;
End Process;
例 2,
Process (clock)
If (clock?EVENT and clock=?0?) then
Q<=DATA
End If;
End Process;
例 3,
Process (clock)
If rising_edge (clock) then
Q<=DATA
End If;
End Process;
与例 1等价
第四章 VHDL并行语句
4.1 并行语句概述
4.2 并行信号赋值语句
4.3 进程语句( process)
4.1 并行语句概述
并行语句一般处于进程( PROCESS)的外部。所有并行
语句都是并行执行的,即与它们出现的先后次序无关。
一、并行语句特点
a.所有语句的执行是并行的;
b.每条语句的执行和其所在的位置无关;
c.并行语句的输出仅仅依赖于输入,没有其它的限制条件
二, 基本的并行语句
( 1)直接赋值语句,<= 赋值运算符
( 2)进程( Process)语句
( 3)条件式信号设置语句,When-Else
( 4)选择式信号设置语句,With-Select-When
( 5)块( Block)语句
( 6)元件( Component)例化语句
( 7) For-Generate语句
4.2 并行信号赋值语句
简单信号赋值语句
条件信号赋值语句
选择信号赋值语句
一, 直接赋值语句,<= 赋值运算符
作用:直接对目标对象进行赋值操作 。
语法格式,Signal_name<=expression;
如,Signal A,B,std_logic_vector(7 down to 0);
A<=”0000000”;
B<=”1000000”;
我们也可以这样赋值,
A<=(others=>?0?); 信号 A的每一位的值都为 0。
B<=(?1?,others=>?0?); 信号 B的第一位为 1,其它位的值为 0。
下面举一个应用示例,如下面电路,≥ 1

A
B
C
D
用 VHDL对电路的描述如下,
library ieee;
use ieee.std_logic_1164.all;
Entity exam1 is
port (a,b, in std_logic;
c,d, out std_logic);
End exam1;
Architecture m1 of exam1 is
Begin
c<=a and b;
d<=a or b ;
END m1;
并行语句的输出仅仅
依赖于输入, 没有其
它的限制条件 。
每条语句的执行和其
所在的位置无关。
二, 条件式信号设置语句, When-Else
语法格式为,
赋值目标 <= 表达式 1 When 赋值条件 Else
表达式 2 When赋值条件 Else

表达式 N;
在结构体中的条件赋值语句的功能与在进程中的 IF语句相同,在
执行条件信号语句时,每一赋值条件是按书写的先后关系测定
的。
我们曾举过一个二输入的与门电路的例子,
Library ieee;
Use ieee.std_logic_1164.all;
Entity and2 is
Port(d1,d2, in std_logic;
op, out std_logic);
End and2;
Architecture m1 of and2 is
Begin
op<= ?1? when(d1=?1? and d2=?1?)else
?0?;
End m1;
Library ieee;
Use ieee.std_logic_1164.all;
Entity mux is
Port(a,b,c, in bit;
p1,p2, in bit
z, out bit);
End and2;
Architecture m1 of mux is
Begin
z<= a when p1=?1? else
b when p2=?1? else
c;
End m1;
允许
有重

三, 选择式信号设置语句,With-Select-When
With expression Select
赋值目标 <=表达式 When constant_value1
表达式 When constant_value2

表达式 When Others;
选择 式信号设置语句本身不能在进程中应用其功能与进程中
的 CASE语句相同。
例:不允许有重叠现象;必须含盖所有条件
Architecture m2 of and2 is
Signal tmp, std_logic_vector(1 down to 0);
Begin
tmp<=d1 & d2;
With tmp select
f<=?1? when,11”;
?0? when others;
End m2;
例题
When-else语句和 With-select-When语句的差别
两个语句的关键不同是:对于条件的要求程度不同,前者
要求较松,后者要求严格。
a With-select-When语句中 When后的 constant_value必须
是互不相同的;
b 而 When-else语句中 When后的 logic_expression则不需要这样
的严格条件, 因为其 When后的 logic_expression的优先权次序
为由先到后排列 。
4.3 进程语句( process)
Process 语句的格式为,
[进程标号,] Process [(敏感信号列表 )]
[变量声明 ]
Begin
顺序语句;
End Process [进程标号 ];
敏感表 (Sensitivity list)包括进程的一些信号,当敏感表中的某个信号变化时进程才
被激活,进程内的顺序语句被执行。当进程结束时,进程内的输出信号值被更新,
进程进入等待(睡眠)状态,直到敏感表中的某一信号发生变化,进程被再次激活。
下面举一个应用示例,如下面电路,≥ 1

A
B
C
D
用用不同 VHDL语句 对电路的描述如下,
library ieee;
use ieee.std_logic_1164.all;
Entity exam1 is
Port (a,b, in std_logic;
c,d, out std_logic);
End exam1;
Architecture m1 of exam1 is
Begin
c<=a and b;
d<=a or b ;
End m1;
architecture m2 of exam1 is
begin
process
begin
c<=a and b;
d<= a or b ;
end process;
end m2;
≥ 1

A
B
C
D
architecture m2 of exam1 is
begin
process
begin
c<=a and b;
d<= a or b ;
end process;
end m2;
architecture m3 of exam1 is
begin
process
begin
c<=a and b;
end process D1 ;
process
begin
d<= a or b ;
end process D2 ;
end m3;
≥ 1

A
B
C
D
a 在一个结构体当中可以有多个 Process 语句;
b Process 语句是同时执行的并行语句;
c 但是 Process内的语句却是顺序执行的顺序语句;
d 多进程之间的信息通过信号对象来传递。
总 结
第四章 VHDL并行语句
4.4 元件例化语句
4.5 生成语句( for-generate)
作用,为了方便电路描述, 将具有某一逻辑功能的完整的 VHDL
设计 ( 元件 ) 直接调用, 避免重复描述 。

a1
b1
c1
d1
x
z1
u2
u3



y
元件例化( Component Instantiation)语句
U1
a1
b1
c1
d1
x z1
u2
u3



y
a1
b1
c1
d1
x
z1
u2
u3



y
a1
b1
c1
d1
x
z1
u2
u3



y
U1
ya
b

c
Library ieee;
Use ieee.std_logic_1164.all;
Entity nd2 is
Port (a,b, in std_logic;
c, out std_logic;);
End nd2;
Architecture ndbev of nd2
Begin
c <= not(a and b)
End nd2behav
ya
b

c
Port (a1,b1,c1,d1, in std_logic;
z1, out std_logic;);
End ord41;
Architecture ord41behv of ord41 is
Component nd2
Port (a,b, in std_logic;
c, out std_logic;);
End component
U1, nd2 port map(a1,b1,x);
U2, nd2 port map (a=>c1,c=>y,b=>d1);
U3, nd2 port map (a=>x,y,c=>z1)
Signal x,y:std_logic ; (存储结点 )
begin
End architecture ord41behv;
Library ieee;
Use ieee.std_logic_1164.all;
Entity ord41 is
a1
b1
c1
d1
x
z1
u2
u3



y
U1, nd2 port map(a1,b1,x); a1
b1
c1
d1
x z1
u2
u3



y
U2, nd2 port map (a=>c1,c=>y,b=>d1);
a1
b1
c1
d1
x
z1
u2
u3



y
U3, nd2 port map (x,y,c=>z1);
a1
b1
c1
d1
x
z1
u2
u3



y
U1
使用格式
第一步:元件声明
Component 元件名 [ IS ]
[ Port Clause ]
End Component 元件名 ;
元件端口信息,与该元件
实现时的实体的 port部分相
同并 在结构体开始之前进
行声明
第二步:元件例化
例化名, 元件名
Port Map(端口映射) ;
将元件端口和要描述的
电路的实际端口具体对
应,在结构体开始后进
行例化
元件例化时端口映射方式,
a.位置对应方式
直接由输入信号和元件信号的对应位置进行映射 。 即,
元件标号:元件名 Port Map( 信号 A1,信号 B1,… ) ;
b.名字直接对应
元件标号:元件名 Port Map( 组件信号 A=>信号 A1,
组件信号 B=>信号 B1,… ) ;
U1, nd2 port map(a1,b1,x);
U2, nd2 port map (a=>c1,c=>y,b=>d1);
U3, nd2 port map (a=>x,y,c=>z1)
位置对应方式
名字直接对应
例, 设计一个一位全加器
FA
C0 S
A B Ci
被加数 加数 低位进位 和 进位
A B Ci S C0
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
输出输入
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Entity fulladder is
Port (Ci, in std_logic;
a,b, in std_logic;
s, out std_logic;
Co, out std_logic);
End fulladder;
Architecture m1 of fulladder is
Signal tmp,std_logic_vector(1 downto 0);
Begin
tmp<=(‘0’ & a)+b+ci;
s<=tmp(0);
co<=tmp(1);
End m1;
FA
S
a b
CiC0
利用一位全加器元件的调用实现四位全加器,
利用一位全加器元件的调用实现四位全加器,
FA
S3
A3 B3
FA
S2
A2 B2
FA
S1
A1 B1
FA
S0
A0 B0
C4
C inC1C1C2C2C3C3C4
FA
S
a b
CiC0
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Entity adder is
Port (Cin, in std_logic;
x,y, in std_logic_vector(3 downto 0);
sum, out std_logic_vector(3 downto 0);
Cout, out std_logic);
End adder;
Architecture a of adder is
Signal c,std_logic_vector(0 to 4);
Component fulladder
Port( ci,a,b, in std_logic;
s,co, out std_logic);
end component;
Begin
c(0)<=Cin;
U1,fulladder Port map(c(0),x(0),y(0),sum(0),c(1));
U2,fulladder Port map(c(1),x(1),y(1),sum(1),c(2));
U3,fulladder Port map(c(2),x(2),y(2),sum(2),c(3));
U4,fulladder Port map(c(3),x(3),y(3),sum(3),c(4));
Cout<=c(4);
End a;
U1,fulladder Port map (ci=>c(0),a=>x(0),b=>y(0),s=>sum(0),co=>c(1));
FA
S3
A3 B3
FA
S2
A2 B2
FA
S1
A1 B1
FA
S0
A0 B0
C4
C in
C1C1C2C2C3C3
C0
U2,fulladder Port map(ci=>c(1),a=>x(1),b=>y(1),s=>sum(1),co=>c(2));
FA
S3
A3 B3
FA
S2
A2 B2
FA
S1
A1 B1
FA
S0
A0 B0
C4
C in
C1C1C2C2C3C3
C0U3,fulladder Port map(ci=>c(2),a=>x(2),b=>y(2),s=>sum(2),co=>c(3));
FA
S3
A3 B3
FA
S2
A2 B2
FA
S1
A1 B1
FA
S0
A0 B0
C4
C in
C1C1C2C2C3C3
C0
U4,fulladder Port map(ci=>c(3),a=>x(3),b=>y(3),s=>sum(3),co=>c(4));
FA
S3
A3 B3
FA
S2
A2 B2
FA
S1
A1 B1
FA
S0
A0 B0
C4
C in
C1C1C2C2C3C3
C0
并行语句,元件同时产生
( 7) For-Generate语句
作用,For-Generate语句用于重复性的信号设置或重复性的元件例化。
上面的四位加法器可以这样来实现,
For i In 0 to 3 Generate
Bitadder,fulladder Port map(c(i),x(i),y(i),sum(i),c(i+1));
End generate;
元件例化循环管脚映射语句
第五章 组合逻辑电路的设计和分析
5.1 概述
5.2 编码器
5.3 译码器
5.4 简单数字显示系统
5.5 其它
定义,任一时刻的输出仅仅取决于当时的输入, 与电路原来的状态
无关, 这样的数字电路叫做组合逻辑电路 。
常用组合逻辑电路有以下几种,
( 1) 编码器
( 2) 译码器
( 3) 比较器
( 4)数据选择器
( 5)三态输出电路
( 6)加法器
5.1 概述
5.2 编码器
5.2.1 8-3编码器
5.2.2 二-十进制编码器
编码器有普通编码器和优先编码器,我们设计一个普通的 8-3编码器。
A7
A6
A5
A4
A3
A2
A1
A0
EN
Y2
Y1
Y0
8 X 3



?
输入
信号 ?
输出
信号
使能端口
一、外观及功能
5.2.1 8-3编码器
注,EN为 1时编码器工作
00010000000
10001000000
01000100000
11000010000
00100001000
10100000100
01100000010
11100000001
01201234567 YYYAAAAAAAA
00010000000 10001000000
01000100000 11000010000
00100001000 10100000100
01100000010 11100000001
01201234567 YYYAAAAAAAA
00010000000 1001000000
0100100000 11000010000
00100001000 10100000100
0110000010 11100000001
01201234567 YYYAAAAAAAA
00010000000
10001000000
01000100000
11000010000
0101
10100000100
01100000010
101
01201234567 YYYAAAAAAAA
00010000000
10001000000
01000100000
1100010000
0101
1010000100
0110000010
101
01201234567 YYYAAAAAAAA
00010000000
10001000000
01000100000
11000010000
00100001000
10100000100
01100000010
11100000001
01201234567 YYYAAAAAAAA
二、其 VHDL程序
结构体 1 实体
architecture m2 of bmq is
begin
process(a)
begin
if en='1' then
case a is
when "00000001" => Y<="000" ;
when "00000010" => Y<="001" ;
when "00000100" => Y<="010" ;
when "00001000" => Y<="011" ;
when "00010000" => Y<="100" ;
when "00100000" => Y<="101" ;
when "01000000" => Y<="110" ;
when "10000000" => Y<="111" ;
when others=> y<="000";
end case;
else y<="000";
end if;
end process;
end m2;
结构体 2
三,MAX-PLUSII程序运行演示
下载成功画面
5.2.2 二-十进制编码器
一、外观及功能
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
B3
B2
B1
B0







00001000000000
10000100000000
01000010000000
11000001000000
00100000100000
10100000010000
01100000001000
11100000000100
00010000000010
10010000000001
01230123456789 BBBBAABAAAAAAA
二、其 VHDL程序
library ieee;
use ieee.std_logic_1164.all;
entity bmq is
port( A, in
std_logic_vector(9 downto 0);
B,out
std_logic_vector(3 downto 0));
end bmq;
architecture m1 of bmq is
begin
B<="0000" when A="0000000001" else
"0001" when A="0000000010" else
,0010" when A="0000000100" else
,0011" when A="0000001000" else
,0100" when A="0000010000" else
,0101" when A="0000100000" else
,0110" when A="0001000000" else
,0111" when A=“0010000000" else
,1000" when A=“0100000000" else
,1001" when A=“1000000000" else
,1111"
end m1;
结构体 实体
5.3 译码器
5.3.1 3-8 译码器
5.3.2 七段显示码译码器
5.3.1 3-8 译码器
一、外观及功能
A7
A6
A5
A4
A3
A2
A1
A0
Y2
Y1
Y0
EN
8* 3



二、其 VHDL程序
library ieee;
use ieee.std_logic_1164.all;
entity ymq is
port(
Y, in std_logic_vector(2 downto 0);
EN, in std_logic;
A, out std_logic_vector(7 downto 0));
end ymq;
architecture m1 of ymq is
begin
process(y)
begin
if en='1' then
case y is
when "1000"=> A<="00000001";
when "1001"=>A<="00000010";
when "1010"=>A<="00000100";
when "1011"=>A<= "00001000";
when "1100"=>A<="00010000";
when "1101"=>A<= "00100000";
when "1110"=>A<="01000000";
when "1111"=>A<="10000000";
when others =>A<="11111111";
end case;
else
A<="11111111";
End if;
end process;
end m1;
5.3.2 七段显示码译码器
一、外观及功能
D0
D3
D6
D0 D1 D2 D3 D4 D5 D6
二、其 VHDL程序
D6
D5
D4
D3
D2
D1
D0
C3
C2
C1
C0
显示



Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Entity xian is
Port(C, in std_logic_vector(3
downto 0);
D, out std_logic_vector(6 downto
0));
End xian;
Architecture a1 of btod is
Begin
D<= "0111111" when C="0000" else --0
"0000110" when C="0001" else --1
"1011011" when C="0010" else --2
"1001111" when C="0011" else --3
"1100110" when C="0100" else --4
"1101101" when C="0101" else --5
"1111101" when C="0110" else --6
"0000111" when C="0111" else --7
"1111111" when C="1000" else --8
"1101111" when C="1001" else --9
"0000000" ;
End a1;
结构体 实体
5.4 简单数
字显示系统







显示译
码器
二十进
制编码

Y6 Y5 Y4 Y3 Y2 Y1 Y0
X9 X8 X7 X6 X5 X4 X3 X2 X1 X0
Y1
Y4
Y7
Y6 Y5 Y4 Y3 Y2 Y1 Y0
D6 D5 D4 D3 D2 D1 D0
X I A N
C3 C2 C1 C0
B3 B2 B1 B0
b m q
A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
X9 X8 X7 X6 X5 X4 X3 X2 X1 X0
z3 z2 z1 z0
z3 z2 z1 z0
Y1
Y4
Y7
Y6 Y5 Y4 Y3 Y2 Y1 Y0
D6 D5 D4 D3 D2 D1 D0
X I A N
C3 C2 C1 C0
B3 B2 B1 B0
b m q
A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
X9 X8 X7 X6 X5 X4 X3 X2 X1 X0
Y0
Y3
Y6
Library ieee;
Use ieee.std_logic_1164.all;
Use eee.std_logic_unsigned.all;
Entity shuzi is
Port(X, in std_logic_vector(9
downto 0);
Y, out std_logic_vector(6
downto 0));
End shuzi;
Architecture a of shuzi is
Signal Z,std_logic_vector(3 downto 0);
Component xian
Port(C, in std_logic_vector(3 downto 0);
D, out std_logic_vector(6 downto 0));
end component;
Component bmq
Port(A, in std_logic_vector(9 downto 0);
B, out std_logic_vector(3 downto 0));
end component;
Begin
U1,bmq Port map(x,z);
U2,xian Port map(z,Y);
End a;
Y6 Y5 Y4 Y3 Y2 Y1 Y0
X9 X8 X7 X6 X5 X4 X3 X2 X1 X0
Y1
Y4
Y7
Y6 Y5 Y4 Y3 Y2 Y1 Y0
D6 D5 D4 D3 D2 D1 D0
X I A N
C3 C2 C1 C0
B3 B2 B1 B0
b m q
A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
X9 X8 X7 X6 X5 X4 X3 X2 X1 X0
z3 z2 z1 z0
z3 z2 z1 z0
Y1
Y4
Y7
Y6 Y5 Y4 Y3 Y2 Y1 Y0
D6 D5 D4 D3 D2 D1 D0
X I A N
C3 C2 C1 C0
B3 B2 B1 B0
b m q
A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
X9 X8 X7 X6 X5 X4 X3 X2 X1 X0
Y0
Y3
Y6
U1,bmq Port map(x,z);
U2,xian Port map(z,Y);
例化过程,
一,数据选择器
A
B
C
D
S1 S0
Y
数据选
择器
输入数据 A 1 A 0 Y
D 0 D 1 D 2 D 3 0 0 D0
D 0 D 1 D 2 D 3 0 1 D1
D 0 D 1 D 2 D 3 1 0 D2
D 0 D 1 D 2 D 3 1 1 D3
5.5 其它
library ieee;
use ieee.std_logic_1164.all;
entity mux41 is
port(A,B,C,D, in
std_logic_vector(15 downto 0);
S, in s
td_logic_vector(1 downto 0);
Y, out
std_logic_vector(15 downto 0));
end mux41;
architecture F of mux41 is
begin
with sel select
Y<=A when "00",
B when "01",
C when "10",
D when others;
end F;
二、八位二进制比较器
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
ENTITY cmpab IS
PORT (A,B,in std_logic_vector(7 downto 0);
Y1,Y2,Y3, out std_logic );
END cmpab;
ARCHITECTURE a OF cmpab IS
BEGIN
Y1<='1' when a=b else '0'; --并行语句
Y2<='1' when a>b else '0';
Y3<='1' when a<b else '0';
END a;
第六章 时序逻辑电路的设计和分析
6.2 触发器
6.3 计数器
6.4 分频器
6.5 寄存器
6.1 概述
任一时刻的输出不仅取决于当时的输入, 而且还取决于电
路原来的状态, 这样的数字电路叫做时序逻辑电路 。
常用时序电路设计,
( 1) JK型, T型和 D型触发器
( 2) 移位寄存器设计
( 3) 计数器设计
( 4) 分频器设计
6.1 概述
6.2 触发器
6.2.1 D触发器
6.2.2 T触发器
6.2.2 JK触发器
Q Q
D CP
CP D
0 0 0
0 1 1
1 1 1
1 0 0
Q
n
Q
1n ?
符号 特性表
6.2.1 D触发器
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
Entity ffD is
port (clk,d, in std_logic;
q, out std_logic);
End ffD;
Architecture body1 of ffd is
begin
process (clk)
begin
if clk?event and clk=?1? then
q <= d; end if;
end process;
end body1;
Architecture body2 of ffd is
begin
process (clk,d)
begin
if rising_edge(clk) then
q <= d; end if;
end process;
end body2;
符号 特性表
Q Q
J K
CPT
CP T
0 0 0
0 1 1
1 1 0
1 0 1
Q
n
Q
1n ?
6.2.2 T触发器
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY fft IS
PORT( Cp,T,IN STD_LOGIC;
q,OUT STD_LOGIC);
END fft;
ARCHITECTURE a OF fft IS
signal qn,std_logic;
BEGIN
process(cp)
begin
if cp'event and cp='1' then
if T=?1? then qn<= not qn; end if;
end if;
end process;
q<=qn;
END a;
Q Q
J KCP
0 1
1 1 0
1
0 1
0 1 0
0
0 1
1 1 1
1
K
0
0
0 0 0
0 1 0
CP J
0
0
1
1
1
1
Q
n
Q
1n ?
符号 特性表
6.2.3 JK触发器
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY ffJK IS
PORT( Cp,J,K,IN STD_LOGIC;
q,OUT STD_LOGIC);
END ffJK;
ARCHITECTURE a OF ffJK IS
signal qn, std_logic;
Signal tt, std_logic_vector(2 downto1)
Begin
Process(Cp)
begin
tt<=J&K;
if Cp?event and Cp=?1? then
case tt is
when,10”=> qn<=?1? ;
when,01”=> qn<=?0? ;
when,11”=> qn<=not qn ;
when others=>null;
End case; End if; End Process;
q<=qn; End a;
练习题,
在 JK触发器的结构体中是否可以用 with – select语句。
计数器的种类很多 。 按计数器中的触发器是否同时翻转
分类, 可以把计数器分为同步式和异步式两种 。 如果按
计数过程中计数器中的数字增减分类, 有可以分为加法
计数器和减法计数器 。 可增可减的计数器为可逆计数器 。
有时也用计数器的计数容量来区分各种不同的计数器,
如十进制计数器, 二十四进制计数器和六十进制计数器
等 。
一,24进制加法计数器
2 4 进制
计数器
EN
CLK
QB
QA
2
4
4
6.3 计数器
LIBRARY Ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY count24 IS
PORT(en,clk,IN STD_LOGIC;
qa,out STD_LOGIC_VECTOR(3 DOWNTO 0); --个位数计数
qb,out STD_LOGIC_VECTOR(1 DOWNTO 0)); --十位数计数
END count24;
实体
结构体
ARCHITECTURE a1 OF count24 IS
BEGIN
process(clk)
variable tma,STD_LOGIC_VECTOR(3 DOWNTO 0);
variable tmb,STD_LOGIC_VECTOR(1 DOWNTO 0);
begin
if clk'event and clk='1' then
if en='1' then
if tma="1001" then tma:="0000";tmb:=tmb+1;
Elsif tmb="10" and tma="0011" then tma:="0000";
tmb:="00";
else tma:=tma+1;
end if;
end if;
end if;
qa<=tma;
qb<=tmb;
end process;
END a1;
60 进制
计数器
EN
CLK
QB
QA
RCO
3
4
二,60进制加法计数器
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY count60 IS
PORT(
en,clk,IN STD_LOGIC;
qa,out STD_LOGIC_VECTOR(3 DOWNTO 0); --个位数计数
qb,out STD_LOGIC_VECTOR(2 DOWNTO 0); --十 数计数
rco,OUT STD_LOGIC); --计数进位
END count60;
实体
结构体
ARCHITECTURE a OF count60 IS
BEGIN
process(clk)
variable tma,STD_LOGIC_VECTOR(3 DOWNTO 0);
variable tmb,STD_LOGIC_VECTOR(2 DOWNTO 0);
begin
if clk'event and clk='1' then
if en='1' then
rco<=tmb(0)and tmb(2)and tma(0)and tma(3)and en;
if tma="1001" then tma:="0000";
if tmb=,101” then tmb:=,000” ;
else tmb:=tmb+1;
end if;
else tma:=tma+1;
end if; end if; end if;
qa<=tma;qb<=tmb;
end process;
END a;
J1
K1
F1
Q1
J2
K2
F2
Q2
J3
K3
F3
Q3
J4
K4
F4
Q4


CP

﹠ 1
1
C
CP1 CP2 CP3 CP4
结论, 该计数器为十进制加计数器
6.4 分频器 (加法 4MHz-1hz分频器)
状态图
0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1
1 0 0 1 1 0 0 0 0 1 1 1 0 1 1 0
0 1 0 0
0 1 0 1
0 0 0 0
0
0000
1
时序图
1 2 3 4 5 6 7 8 9 10
CP
Q1
Q2
Q3
Q4
C
二分频
四分频
八分频
十分频
进位信号
1
0
0
0
0
1
0
0
1
1
0
<1> 一个 3 bits的计数器, 它所能计数的范围为 0~7( =23-1) 。 同理, n bits的计
数器所能计数范围为 0~2n-1。
<2> Q0,Q1,Q2的波形频率分别为时钟脉冲信号 Clk的 1/2,1/4,1/8,由此可以
知道, n bits的计数器可获得的最低分频频率为时钟脉冲信号 Clk的 1/2n。
<3>对于 4MHz频率信号, 若作为加法计数器电路的时钟脉冲信号 Clk,则电路不
同输出脚位获得的分频频率如下表所示 。
Clk=4MHz
Q0
2MHz
Q10
1.953125kHz
Q20
1.907348Hz
Q1
1MHz
Q11
976.5625Hz
Q21
0.953674Hz
Q2
500kHz
Q12
488.28125Hz
Q22
0.476837Hz
Q3
250kHz
Q13
244.14063Hz
Q23
0.238418Hz
Q4
125kHz
Q14
122.070312Hz
Q24
0.119209Hz
Q5
62.5kHz
Q15
61.035156Hz
Q25
0.059604Hz
Q6
31.25kHz
Q16
30.517578Hz
Q26
0.029802Hz
Q7
15.625kHz
Q17
15.258789Hz
Q27
0.014901Hz
Q8
7.8125kHz
Q18
7.629394Hz
Q28
0.00745Hz
Q9
3.90625kHz
Q19
3.814697Hz
Q29
0.003725Hz
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY count IS
PORT( clk,in STD_LOGIC;
q,out STD_LOGIC;
END count;
ARCHITECTURE a OF count IS
Signal tmp,STD_LOGIC_vector (21 downto 0);
BEGIN
Process (clk)
Begin
If clk'event and clk='1' then tmp<=tmp+1;
end if;
End process;
q<=tmp (21);
END a;
结构体 实体
我们设计一个由 4MHz到 1Hz的分频器,其 VHDL电路设计为,
6.5 寄存器
寄存器是暂时存储一组数据的数字器件。
D3
CP
Q3
D2
Q2
D1
Q1
结论, 一个脉冲存储一组数据,即一拍存储一组数据
1 1 0
1 1 0
一、普通寄存器
LIBRARY IEEE;
USE IEEE.STD_1164.ALL;
ENTITY JICUN IS
PORT( D, IN STD_LOGIC_VECTOR(3 DOWNTO 1);
CLK, IN STD_LOGIC;
Q, OUT STD_LOGIC_VECTOR(3 DOWNTO 1) );
END ENTITY;
ARCHITECTURE ONE OF JICUN IS
BEGIN
IF CLK?EVENT AND CLK=?1? THEN
Q <= D;
END IF;
END ARCHITECTURE;
二、移位寄存器
D0 D1 D2 D3
Q0 Q1 Q2 Q3
C L K
移位寄存器
1 0 0 0
1 0 0 0
D0 D1 D2 D3
Q0 Q1 Q2 Q3
C L K
移位寄存器
S1
S0
D
1 0 0 0
1
1
1 0 0 0
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
Vc c
Cp
Q0
Q1
Q2
Q3
S1
S0
C L R
D SR
D0
D1
D2
D3
D SL
GN D
S1=0;S0=1右移输入
S1=1;S0=0左移输入
CLR S1 S0 D SR D SL d0 d1 d2 d3 Q0 Q1 Q2 Q3
0 X х х х х х х х 0 0 0 0
1 0 0 х х х х х х
1 0 1 D SR х х х х х D SR
1 1 0 х D SL х х х х D SL
1 1 1 х х d0 d1 d2 d3 d0 d1 d2 d3
输入 输出
CP
х
Q
0
n
Q
1
n
Q
2
n
Q
3
n
Q
0
n
Q
1
n
Q
2
n
Q
1
n
Q
2
n
Q
3
n