Professional Documents
Culture Documents
可编程逻辑器件与应用专题 (清华)
可编程逻辑器件与应用专题 (清华)
实验讲义
附实验指导书
清华大学电子工程系
2004.8.5
第一章 绪论
― 1 ―
较。JTAG 标准提供了板级和芯片级的测试。通过定义输入输出引脚、逻辑控制函数和指令,所有 JTAG
的测试功能部仅需一个四线或五线的接口及相应的软件即能完成。图 1-1 举例说明了边界扫描测试法的
概念。
串行数据输入 串行数据输出
核心 核心
逻辑 逻辑
IC 引脚
JTAG 器件 1 JTAG 器件 2
§1.2 可编程逻辑器件的分类
可编程逻辑器件包括一个未配置的逻辑单元阵列,此阵列可以编程实现所需的逻辑功能,并通过
可编程互连接到所要求的输入、输出。这些逻辑单元可以是门、反相器、触发器或较大的宏单元,并且
有它自身的可编程局部互连系统。可编程互连是由可编程的开关阵列和连接逻辑单元的固定信号线组
成。可编程逻辑器件有许多不同的分类方法,下面主要介绍四种:
1.2.1 从互连特性上分类
从互连特性上,可编程逻辑器件结构可以分为确定型和统计型两大类。确定型的 PLD 包括 PROM、
PLA、PAL、FPLA、GAL、EPLD 和 EEPLD。它们所提供的互连结构每次都用相同的互连线实现布线。
所以这类可编程逻辑器件的延时特性常常可以从数据手册上直接查到,而不需通过设计软件来确定。
统计型的器件主要是现场可编程门阵列(FPGA) 。FPGA 的设计软件每次完成相同的功能却给出不
同的布线结果,所以称为统计型的结构。因此在电路设计时必须允许设计者限制功能中关键路径的时序
变化,确保它们不超出系统的技术要求。
1.2.2 从可编程特性上分类:
目前为用户提供的编程手段主要有四种:
*一次编程熔丝或逆熔丝;
*EPROM 结构,即紫外线擦除电报编程存储单元(UVEPROM)采用紫外线互补金属氧化半导体
― 2 ―
(UVCMOS) ;
;另
*电擦除和再编程存储单元。一类是 EEPROM,为电擦除式互补金属氧化半导体(EECMOS)
一类是结构与 UVEPROM 类似,但采用电擦除的闪速存储单元(FLASH MEMORY);
*基于静态存储器(SRAM)的编程结构。
所以根据编程能力可以将它们分为两大类,一类是不可以再编程的,确定型的 PAL 和统计型采用
逆熔丝的 FPGA 都是不可再编程的;另一类是可再编程的,确定型的 GAL 和统计型的采用 SRAM 的
FPGA 属于此类。
1.2.3 从器件容量上分类
由于可编程逻辑器件本身结构上和半导体生产工艺的不断改进和提高,器件的密度不断增加,性
能亦不断提高,目前可编程逻辑器件的容量已达到百万门以上。从容量上对可编程逻辑器件的分类是将
复杂的可编程逻辑器件(CPLD)和现场可编程门阵列(FPGA)统称为高容量可编程逻辑器件(HCPLD)。
1.2.4 从结构的复杂程度上分类
从结构上对可编程逻辑进行分类是最常用的方法,而且各类可编程逻辑器件的开发系统都是针对
其结构来设计的,了解和掌握可编程逻辑器件的结构对合理、有效地选用开发软件来设计可编程逻辑器
件就很重要。从结构上可将可编程逻辑器件分为以下三类:
*简单可编程逻辑器件(PLD);
*复杂可编程逻辑器件(CPLD);
*可编程门阵列(FPGA)。
― 3 ―
第二章 可编程逻辑器件的结构和特点
§2.1 概述
可编程逻辑器件(PLD)是一个逻辑电路,可由用户编程来实现特定的逻辑功能。许多 PLD 器件
的功能已经或多或少变成工业标准,即可以像标准 74 系列中小规模器件那样。设计人员可以按照产品
手册,根据速度、功耗、成本进行选择,并能从不同的厂家购买到。而且,PLD 器件还提供了标准 74
系列器件无法提供的可编程功能,用户可以将一些中小规模器件的功能集成到一个或几个 PLD 中,极
大的简化了印制板的设计,因此 PLD 成为最早实现可编程 ASIC 的器件。
― 4 ―
列,其中可擦除的 CPLD 有称为 EPLD(Erasable PLD)
。
― 5 ―
图 2-2Altera 公司 FLEX10K 系列的 FLEX 结构图
逻辑单元 LE 是 FLEX 结构中最小的逻辑单元,每个 LE 含有一个提供 4 输入组合逻辑函数的查找
表(LUT-Look Up Table)
,能够快速产生 4 输入变量的任意逻辑函数输出。LE 还有一个带同步使能的
可编程寄存器和一个进位链、一个级联链,如图 2-3 所示。
― 6 ―
第三章 CPLD 实验系统
CPLD 或
串口 I/O
FPGA
实验板
下载板
PC
七段显示器
16 个 LED 输
米字型 出状态显示
显示器
3 个 40
矩阵 PIN 的下
显示器 载板插座
连续可调
24bits
脉冲输出
DIP 开关
键盘
16 个 LED
脉波输出
输入/输出
按键
状态显示
RS-232 接口
CPLD 芯片
电源
复位
开关
― 7 ―
电路设计完成后,由计算机通过 RS-232 串行口把数据传送到 CPLD 下载板,再由板上的单片机把
数据下载到 CPLD 内,完成 CPLD 的配置工作。
I/O 实验板上的输入输出器件和 CPLD 下载板上的 CPLD 芯片具有一定的连接关系,可以参考表 3-1。
I/O 实验板上的输入输出器件都有一个以 P 开头的编号,例如第一个输入指示 LED 是 P01,从表中可以
看出它和 CPLD 的第 3 脚相连。
表 3-1 I/O 板和 CPLD 芯片的连接关系
IO 板 P01 P02 P03 P04 P06 P07 P08 P09
CPLD 引脚 03 05 06 07 08 09 10 11
IO 板 P13 P14 P15 P16 P18 P19 P20 P21
CPLD 引脚 16 17 18 19 21 22 23 24
IO 板 P22 P23 P24 P25 P27 P28 P29 P30
CPLD 引脚 25 27 28 29 30 35 36 37
IO 板 P34 P35 P36 P37 P39 P40 P41 P42
CPLD 引脚 38 39 47 48 49 50 51 52
IO 板 P43 P44 P45 P46 P48 P49 P50 P51
CPLD 引脚 25 27 28 29 30 35 36 37
IO 板 P55 P56 P57 P58 P60 P61 P62 P63
CPLD 引脚 53 54 58 59 60 61 62 64
IO 板 P64 P65 P66 P67 P69 P70 P71 P72
CPLD 引脚 65 66 67 69 70 71 72 73
IO 板 P76 P77 P78 P79 P81 P82 P83 P84
CPLD 引脚 78 79 80 81 44 84 83
IO 板 I12 I31 I54 I73
CPLD 引脚 1 2 43 42
图 3-3 DIP输入开关配置图
― 8 ―
表 3-2 CPLD引脚与DIP输入开关的对应关系
代 号 S1-1 S1-2 S1-3 S1-4 S1-5 S1-6 S1-7 S1-8
CPLD引脚 03 05 06 07 08 09 10 11
代 号 S2-1 S2-2 S2-3 S2-4 S2-5 S2-6 S2-7 S2-8
CPLD引脚 38 39 47 48 49 50 51 52
代 号S3-1 S3-2 S3-3 S3-4 S3-5 S3-6 S3-7 S3-8
CPLD引脚 25 27 28 29 30 35 36 37
CPLD引脚 53 54 58 59 60 61 62 64
CPLD引脚 65 66 67 69 70 71 72 73
名称 DP1 七段显示器
CPLD引脚 16 17 18 19 21 22 23 24
名称 DP2 七段显示器
CPLD引脚 25 27 28 29 30 35 36 37
图3-4 七段显示器段位示意图
注:七段显示器DP2 不能和DIP输入开关S3 同时使用。
― 9 ―
3.2.4 脉冲信号发生器
I/O 实验板的正下方是四个按钮式脉冲信号发生器(SWP1-SWP4),其中 SWP4 不能用,它们和 CPLD
的连接关系如下表所示。SWP1-4 在没有按下时接“0” ,按下时接“1” ,四个按钮都经过了噪声消除
处理,每按一次产生一个高电平脉冲,非常适合作为计数器、缓冲器等调试时的时钟输入使用。
CPLD引脚 44 84 83
3.2.5 米字型显示器、矩阵键盘、点阵显示器
本实验未使用,在此不作介绍。请参考相关的使用手册。
― 10 ―
第四章 VHDL 简介
行为级/RTL级
VHDL代码
改正错误 综合、布局布线
否
正确 ?
电路拓扑
仿真
否
正确 ?
下载到CPLD验证
设计流程主要包括以下几步:
1. 写设计文件。按照自顶向下的方法将系统分解为不同的模块,采用行为描述或结构描述的方法
设计各个模块。
2. 综合、布局布线。由 EDA 工具根据具体的 CPLD 工艺,编译设计文件,产生电路结构,并完成
布局布线,最后产生可下载到 CPLD 的数据文件。
3. 仿真。在计算机上对 EDA 工具产生的电路进行模拟,验证电路的功能、时序是否达到设计要求。
4. 下载到 CPLD 验证。仿真验证了设计的功能正确后,最后下载到 CPLD 芯片中,配合外围电路验
证整个系统的功能。
― 11 ―
§4.3 VHDL 的基本语法
VHDL 语言是一种比较复杂的语言,它可以在不同的抽象层次描述一个电路,在这里仅介绍本实验
所需要的最基本的语法。在 CPLD 设计中,RTL 级(寄存器传输级)模型是最常用的模型,它描述数据
在寄存器之间的流动方式。
4.3.1 VHDL 程序的结构
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY counter IS
PORT (
A,B,CLK: in std_logic;
D: out std_logic);
END;
--------------------------------------------------
E <= A and B;
--------------------------------------------------
PROCESS (CLK)
BEGIN
IF CLK’event and CLK=’1’ THEN
D <= E;
END IF;
END PROCESS;
END;
图 4-2 一个 VHDL 程序
图 4-2 是一个基本的 VHDL 程序,它包括三个基本部分:
1.库定义。
库类似 C 语言的头文件,在库里定义了一些常用的数据类型、函数等,本实验课程使用如下的库就足
够了:
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
2.实体定义。
实体定义了电路的端口和输入输出信号的名称、类型、宽度等,语法如下:
ENTITY 电路名称 IS
PORT (
信号 1,信号 2: in std_logic;
信号 3,信号 4: in std_logic_vector(7 downto 0);
信号 5,信号 6:out std_logic );
END;
其中 in 或 out 表示该信号是输入还是输出,本实验中信号的类型可以都使用 std_logic 类型,矢
量型信号必须用(n downto m)的方式,例如上例中信号 3 是一个 8 位总线。
3. 结构体
结构体定义了电路的内部结构,包括电路内部的信号,各个模块的结构描述和行为描述,语法如下:
ARCHITECTURE 结构名 OF 实体名 IS
SIGNAL 内部信号 1,2,3: std_logic;
BEGIN
模块 1
模块 2
……
END;
4.3.2 数据类型
VHDL 支持多种数据类型,本实验用到的常用类型有:
1.9 值逻辑 std_logic。
它把信号线上的电平描述成“1”, “0”, “X” ,“U” ,
“Z”等,其中“X” ,
“U”表示不定值,
“Z”表
示高阻。
2.矢量类型 std_logic_vector
矢量类型用于方便地描述总线信号,它也是 9 值逻辑,使用时必须指定矢量的宽度,一般从高到低,
例如:
signal x: std_logic_vector(3 downto 0);
表示 x 是一个四位总线,由信号 x(3),x(2),x(1),x(0)构成。
3.整型 integer
整型信号主要用作状态信号、计数信号或数组的下标。整形信号使用时必须指定数值范围,通常是
从小到大,例如:
signal y: integer range 0 to 15;
矢量信号可以通过转换函数 CONV_INTEGER 转换成整形,例如:
y <= CONV_INTEGER(x);
4. 自定义类型
在使用 RAM、ROM 或寄存器堆时需要定义数组,语法如下:
type instr is array (0 to 15)of std_logic_vector(7 downto 0);
signal IRAM: instr;
上例首先定义了 instr 数据类型是一个 8 位的矢量数组,数组容量是 16;然后用该数据类型定义
了信号 IRAM。因此 IRAM 信号实际上是一个容量为 16 的 8 位数组,可以作为 RAM、ROM 或寄存器堆。
4.3.3 数据操作
1.赋值(<=)
相同数据类型的信号可以赋值,结构体内的赋值语句相当于信号线的连接。例如:
signal x: std_logic_vector(3 downto 0);
signal y,z: std_logic;
y <= x(3);
x(3) <= x(2);
y <= z;
y <= ‘1’;
x <= “0010”;
以上三句表示了这些信号线之间的连接关系。
2.逻辑操作(AND、OR、NOT、NAND、NOR、XOR、XNOR)
逻辑操作可以描述信号的逻辑关系,例如:
y <= not (x(1) nand x(2) or x(3));
3.比较操作(=、/=、 <、>、<=、>=)
比较操作常用于条件赋值语句和条件分支语句,将在以后详细介绍。其中/=表示“不等于”。
4. 拼接操作(&)
拼接操作可以把两个信号拼接成一个新的矢量信号,例如:
x(3 downto 2) <= x(1) & x(0);
― 13 ―
4.3.4 并行赋值语句
当赋值语句直接出现在结构体中时表示并行赋值语句,它直接表示了信号的连接关系或描述了一个
电路模块(组合逻辑电路) 。所有的语句在仿真时都是并行执行的。
4.3.5 进程语句
进程语句定义了一个电路模块,进程内部是模块的行为描述。语法如下:
PROCESS (信号 1,信号 2,…)
BEGIN
行为描述语句;
END PROCESS;
其中 PROCESS 语句后的信号列表指进程的敏感表,一般情况下把整个 PROCESS 用到的所有输入信号
都列到敏感表中,除非该进程是一个由信号边沿触发的进程。和并行赋值语句不同,在进程内部的行为
描述语句在仿真时都是顺序执行的。这里仅介绍赋值语句、条件分支语句、CASE 语句,它们的语法如下:
条件分支语句语法:
If 条件 then If 条件 then If 条件 1 then
语句; 语句; 语句;
else end if; elsif 条件 2 then
语句; 语句;
end if; else
语句;
end if;
条件分支举例:
If LOAD = ‘0’ then
Q <= Q+1;
else
Q <= QLOAD;
End if;
CASE 分支语句语法:
Case 信号 is
When 值 1 =>
语句;
when 值 2 | 值 3 | … => -- “|” 表示“或”
语句;
when others =>
语句;
End case;
条件分支举例:
case OP is
when “00” =>
Q <= Q+1;
When “01” | “10” => --OP 为“01”或“10”
Q <= QLOAD;
When others =>
Q <= “0000”;
End case;
4.3.6 元件(COMPONENT)
在 VHDL 程序中可以直接使用已经设计好的电路模块,称为“元件”。元件在使用前要在结构体的
ARCHITECTURE 和 BEGIN 关键词之间用 COMPONENT 关键词事先声明(和内部信号的定义类似)
。在下文的
ROM 和 RAM 部分将举例说明。
4.3.7 注释
VHDL 程序的注释行以“--”为开始标志,可以位于程序的任何位置。
4.4.1 组合逻辑电路
简单组合逻辑电路既可以并行赋值语句,也可以用进程描述。简单组合逻辑电路一般可以用一个布
尔方程表示,例如三输入与门:F=A•B•C
并行赋值语句:
F <= A and B and C;
进程:
process(A,B,C)
begin
F <= A and B and C;
End process;
或:
process(A,B,C)
begin
if A=’1’ and B=’1’ and C=’1’ then
F <= ‘1’;
Else
F <=’0’;
End if;
End process;
并行赋值语句适用于可以用简洁的布尔方程表示的组合逻辑电路。如果逻辑关系复杂,难以用布尔
方程表示,则可以用进程实现,在进程中用条件分支语句和 CASE 语句直接描述电路的逻辑功能。
注意:要实现组合逻辑电路,所有的条件分支必须写全。
4.4.3 锁存器(Latch)
锁存器的功能可以如下描述:
1. 如果使能端有效时,输入信号被输出到输出端。
2.使能端无效时输出保持不变。
锁存器只能用进程实现,在进程的敏感表中应包括所有用到的输入信号。下面的例子是一个典型的
锁存器,它用一个分支描述锁存器的锁存功能,在其它情况下 Q 保持不变。和 D 触发器的区别是,锁存
器没有边沿型的分支。
process(LE,D)
begin
if LE=’1’ then
Q <= D;
End if;
End process;
― 15 ―
4.4.4 寄存器堆
寄存器堆是一组寄存器,由于寄存器堆的速度快,常被 CPU 用来作数据缓冲。下例中的 REG 数组是
一个 8 位的寄存器堆,其功能可以描述为:在写信号 WR 有效时把数据 D 写入到地址为 REG_ADDR 的寄存
器中。
signal REG_ADDR: std_logic_vector(1 downto 0);
signal D:std_logic_vector(7 downto 0);
type com_reg is array(0 to 3) of std_logic_vector(7 downto 0);
signal REG: com_reg;
process(CLK)
begin
if CLK’event and CLK=’1’ then
if WR=’1’ then
REG(CONV_INTEGER(REG_ADDR)) <= D;
End if;
End if;
End process;
本实验要求寄存器堆用 RAM 实现。
4.4.5 RAM
RAM 有很多种类,如同步 RAM、异步 RAM、双端口 RAM、单口 RAM 等。在 CPLD 设计中最常用的是输
入输出数据总线分离的单口同步 RAM。
本实验使用 Altera 公司提供的元件 LPM_RAM_DQ 来实现 RAM 和寄存器堆,它在 we 为高电平时,在
时钟的上升沿把 data 口的数据写入 RAM 的 address 单元,在输出端口 q 输出 address 单元的数据。使
用时首先采用以下方式需要声明。注意,将 lpm_width、q、data 修改为需要的数据宽度,lpm_widthad、
address 修改为需要的地址线宽度。
ARCHITECTURE …….
…….
COMPONENT lpm_ram_dq
GENERIC (
lpm_width : NATURAL := 8;
lpm_widthad : NATURAL := 8;
lpm_indata : STRING := "REGISTERED";
lpm_address_control : STRING :="REGISTERED";
lpm_outdata : STRING :="UNREGISTERED";
lpm_hint : STRING :="USE_EAB=ON"
);
PORT (
address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
inclock : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
data : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
we : IN STD_LOGIC
);
END COMPONENT;
…….
BEGIN
……
在结构体的 BEGIN 关键词后用 PORT MAP 关键词将 RAM 连接到内部信号或端口上
BEGIN
……
local_ram_name : lpm_ram_dq --local_ram_name 是为这个 RAM 起的名字
PORT MAP (
address => local_address, --local 开头的信号都是 RAM 连接到的内部信号
inclock => clock,
data => local_data,
we => local_we,
q => local_q
);
……
― 16 ―
4.4.6 ROM
ROM 中的内容是固定不变的,可以用如下的进程实现:
process(OE,ADDR)
begin
if OE = ’1’ then
case ADDR is
when “00” => DOUT <= “00000000”;
when “01” => DOUT <= “00000001”;
when “10” => DOUT <= “00000010”;
when others => DOUT <= “00000100”;
end case;
end if;
End process;
― 17 ―
c: 11000110;
d: 11010000;
e: 11110100;
f: 11110100;
end
参考资料
1. 《CPLD 系统设计技术入门与应用》,黄正谨等,电子工业出版社。
2. 《VHDL 硬件描述语言与数字逻辑电路设计》,侯伯亨等,西安电子科技大学出版社。
3. 《可编程 ASIC 设计及应用》,李广军,孟宪元,电子科技大学出版社。
4. 《可编程器件应用导论》,曾繁泰等,清华大学出版社。
5. 《XILINX 数字系统现场集成技术》,乐明程,东南大学出版社。
6. 《CPLD 技术及其应用》,宋万杰等,西安电子科技大学出版社。
7. 清华大学图书馆,检索关键词“微处理器”,“微处理机”等。
― 18 ―
实验一 四位同步二进制计数器设计
一、实验目的
熟悉使用 MAXPLUS II 的图形输入工具和 VHDL 语言设计时序电路的基本操作。
二、实验内容
1. 采用图形输入工具设计四位同步二进制计数器。
2. 绘制激励波形
3. 功能仿真
4. 采用 VHDL 语言重新设计计数器,重复 2、3 步骤
实验三 综合下载实验
一、实验目的
使用 VHDL 语言进行较完整的设计,验证功能后,下载到可编程逻辑实验板。
二、实验内容
1. 结合实验 1 和实验 2,把 4 位计数器的结果用七段显示器显示。
2.绘制激励波形
3.功能仿真
4.下载到 CPLD 板,用 7 段 LED 显示器显示计数结果
实验四 秒表
设计要求:
1. 设计一个秒表,可以从 0-59 计数或倒计数。
2. 可以用一个键启动计数和暂停计数;一个键控制加计数或减计数;一个键清零
3.功能仿真
4.下载到 CPLD 板,用两位 7 段 LED 显示器显示。
― 19 ―
实验五 简单微处理器的设计与实现
一、设计任务和技术指标
运用在“数字电路与逻辑设计”课程中学过的基本理论知识,设计并用可编程逻辑器件实现一个简
单的八位操作数的微处理器。完成微处理器硬件系统设计和指令系统设计两方面的任务,使微处理器能
够实现两个不带符号位的八位二进制数原码相乘等功能。
二、简单微处理器介绍
1.微处理器硬件系统及原理
微处理器硬件系统包括运算器、控制器、存储器以及其它必要的逻辑部件。图 4-1 是一个微处理器
的参考原理框图,具体说明如下:
(1) 程序计数器 PC:存放将要执行指令的地址。
(2) 指令存储器 IROM,存放程序指令,每条指令的长度为 W,指令的个数为 L。
(3) 指令寄存器 IR:存放被执行指令的操作码,直接供运算控制器。
(4) 控制器 CON:产生一系列时序逻辑信号,控制微处理器各个部件协调一致地完成每条指令
相应的操作,实现两个操作数的运算。
(5) 通用寄存器堆 R0-R7:用来临时存放运算过程中读出和写入的数据。
(6) 缓冲寄存器 RS 和 RD:用于存放 ALU 的两个输入操作数。
(7) 运算器 ALU 和进位寄存器 C:运算器 ALU 对两个操作数 RS 和 RD 进行加、减或逻辑运算
处理,在进行加减运算时还接受控制器的进位输入信号 CI,ALU 的运算结果送给通用寄存
器或特殊寄存器。ALU 还根据运算结果设置进位标志 C 和零标志 Z。
(8) 运算结果显示送七段数码管显示,用十六进制显示。
PC R0…R7
Rin1,Rin2
程序计数器 通用寄存器堆
特殊寄存器 输入
4 8 (输入)
Log2L
8
IROM(L×W)
指令存储器 RS RD
W
Rout
8 8 特殊寄存器 输出
(输出)
IR
ALU
指令寄存器
CI 运算器
W
CON C Z
控制器
图 4-1 简单微处理器框图
2.处理器指令系统及功能
处理器的基本指令字长为 W 位,指令的每一位从高到低用 DW、DW-1、…D1、D0 表示,有些微处
理器的一条指令包括多个指令字长,即每条指令的长度不一样,例如 Intel 的 80386 等。本实验为了简
化设计,规定所有的指令都是单指令字的指令,即所有指令的长度都是 W。基本的指令系统一般包括
― 20 ―
三类指令:数据传送指令、算术逻辑运算指令和转移指令。每条指令又有多种对操作数的寻址方式。
本实验只要求掌握立即数寻址和直接寻址方式。例如下表中 OP 表示要进行的操作,立即数表示操作
数为常数,D、S 是直接寻址的地址,表示要寻址的通用寄存器的地址, ADDR 表示要跳转到的地址。
OP 字段的长度主要由指令种类的数量决定,但不同类型的指令的 OP 字段的长度也可以不同。D、
S 字段的长度主要由寄存器的个数决定。ADDR 的长度主要由容许的程序最大长度决定。
表 4-1 指令格式
立即数寻址指令 OP D 立即数
直接寻址指令 OP D S
转移指令 OP ADDR
2.1 数据传送指令
数据传送指令在两个通用寄存器或者通用寄存器和特殊寄存器直接传送数据,或者为通用寄存器装
载一个常数,常用的指令可以用以下助记符表示:
MOV Dest_Reg, Source_Reg 将 Source_Reg 的内容传送到 Dest_Reg
MOV Dest_Reg, #Constant 将常数 Constant 装载到 Dest_Reg
2.2 算术逻辑运算指令
这类指令控制 ALU 执行两个寄存器之间的运算操作。通常微处理器还具有一些状态寄存器,它们
由 ALU 的运算结果设置。在表 4-1 的指令格式里,S 和 D 字段指定了两个寄存器。OP 字段规定了在 S
和 D 之间执行的操作种类,并将结果保存到 D 寄存器。
ALU 还根据运算结果设置进位标志 C 和零标志 Z。即如果运算结果有进位,则设置进位标志 C=1,
如果运算结果为零,则设置零标志 Z=1。
常用的指令可以用以下助记符表示:
表 4-2 算术逻辑运算指令助记符
助记符 功能
ADD D = S+D
ADDC D = S+D+C
INC D = D+1
DEC D = D-1
SUB D = D–S
SUBB D=D–S–1
AND D = D and S
OR D = D or S
XOR D = D xor S
2.2 转移指令
转移指令分为无条件转移和条件转移指令。条件转移指令可以根据进位标志 C、零标志 Z 的状态
控制程序的流程,常用的指令助记符如下:
表 4-3 转移指令助记符
助记符 说明
JMP 无条件跳转到(ADDR)
― 21 ―
JC 如果 C=1 就跳转到(ADDR)执行,否则继续执行
JNC 如果 C=0 就跳转到(ADDR)执行,否则继续执行
JZ 如果 Z=1 就跳转到(ADDR)执行,否则继续执行
JNZ 如果 Z=0 就跳转到(ADDR)执行,否则继续执行
3. NOP 指令
空操作指令,不执行任何动作。
4.处理器的设计
为实现上述处理器的功能,每条指令运行需要若干个时钟周期,称为机器周期。通常周期“0”为
“取指令”阶段,其余周期为“执行”阶段,例如可以安排周期“1”取 S 操作数,周期“2”取 D 操
作数并运算,周期“3”将运算结果保存回 D。
三、实验要求:
1. 参考并修改图 4-1 的框图设计能够处理八位操作数的微处理器系统,画出必要的电路结构示意图、
状态转移图。设计微处理器的指令系统(指令助记符、指令编码方式) ,至少包括数据传送指令、
算术运算指令、逻辑运算指令和转移指令的每一类指令中的一条或若干条。确定每条指令执行所需
的指令周期数,合理分配各个指令周期。
3. 合理安排系统应有的输入、输出开关,下面是建议使用的开关。
①“复位”开关——用于系统复位和清除 PC,并从零地址开始执行程序。
③“单步/连续”开关——为了能够调试检查处理器的运行情况,用这个开关来选择连续脉冲时钟
或单脉冲时钟。
④“单脉冲”按钮——单步工作时,产生时钟单脉冲。
⑤“数据输入”开关——8 位开关,用于输入 8 位数据。
⑥“数据显示”——七段显示器,显示指令执行的结果。
⑦“PC”显示——七段显示器,显示 PC 的内容。
⑧“指令码显示”——八个发光管,显示指令码,方便调试。
4. 参考下表编写乘法程序测试你的系统。
为验证处理器的功能,编写一个两个无符号位的八位二进制数相乘的程序,乘积为 16 位,将程序
保存于指令存储器(IROM)中。在运行程序时注意:
A. 为输入乘数或被乘数,应该首先将输入开关 S7-S0 置为乘数或被乘数,然后按下输入键,使程
序读入数据。
B. 由于输入键按下的持续时间一般大于指令周期,因此必须由硬件或软件对输入键进行处理,以
免将按下一次输入键误识为按下多次输入键。
表 4-7 乘法程序
PC 程序
指令码 操作 说明
显示 地址
0 000000 SUB R3,R3 R3 ← 0
1 000001 P0: MOV R1,Rin1 R1 ← Rin1,输入乘数
2 000010 MOV R2,Rin2 R2 ← Rin2,检测按下输入键
3 … SUB R2, R3 R2 ← R2 - 0
4 … 如果 R2 等于 0(没有按下输入键),跳转到 P0
JZ P0
执行,等待按下输入键
5 P1: MOV R4,Rin1 R4 ← Rin1,输入被乘数
6 MOV R2,Rin2 R2 ← Rin2,检测按下输入键
7 SUB R2, R3 R2 ← R2 - 0
― 22 ―
8 如果 R2 等于 0(没有按下输入键),跳转到 P1
JZ P1
执行,等待按下输入键
9 R1 =乘数,R4 =被乘数,下面进行乘法计算。
… … … … …
5. 在微机上完成功能仿真,正确后,在实验板上完成逻辑设计下载。
6. 认真写好实验报告,应包括如下内容:
① 实验目的。
② 处理器设计方案、指令系统、各部分工作原理说明及框图。
③ 关键的仿真波形及分析
④ 实验课总结、体会及意见。
实验六 小组合作实验
一、实验目的
本实验可以由 2-5 人合作完成。在实验五的基础上修改指令集,使之能够运行相对复杂的程序。
二、设计要求
1. 修改指令集,使之能够支持更多、更复杂的指令。
2. 自行编写程序,四则运算或其它复杂运算。
3. 合作完成实验报告。
― 23 ―
附件 1:
设计输入
修改设计
编译设计
功能仿真
时序仿真
器件编程
系统内仿真
完成
― 24 ―
层次化浏览器 编程器
3.在文本编辑窗口中输入下列 VHDL 代码
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY counter IS
PORT (
DataIn : IN INTEGER RANGE 0 TO 15;
CLK,CLEAR,CS,LOAD,UpDown: IN STD_LOGIC;
DataOut : OUT INTEGER RANGE 0 TO 15 );
END counter;
4.选择 FILE -> Save 菜单, 在 File Name 中输入 counter.vhd(文件名必须和 VHDL 代码中的实体名称
― 25 ―
一致,以 vhd 为后缀),选择适当的目录(Directories)
,点击 OK。
5. 选择 FILE -> Project -> Set Project To Current File 菜单,把 counter 设置为当前项目,这样我们就完
成了设计的输入。
― 26 ―
9.选择 Node -> Enter Node From SNF…菜单,点击对话框中的 List 按钮,以选择需要在波形编辑器中
出现的信号名称。选择信号 UpDown(I), LOAD(I), CS(I), CLK(I), CLEAR(I), DataIn(I), DataOut(O)到右边
的列表框内,点击 OK。
改为 100.0 ns
12.设定各个输入信号的波形,如下图所示。
设定输入信号波形的方法如下:首先用鼠标左键按下并拖拉以选定需要改变的信号的范围,然后选
择窗口左边的快捷按钮,设定信号为 0、1、X 或 Z。本实验需要设置 CS 和 CLEAR 为 1,CLK 为
时钟。
― 27 ―
按下左键 拖拉至此
看完整的 释放左键
波形
设为 0,1,X,Z
设为时钟
要仿真的波形文件名
不要选择这些选项
16.观察输出波形,检查电路功能是否正确。返回第 12 步修改激励波形重新仿真,直到验证电路功能
正确。
― 28 ―
18.重复步骤 7,再次编译一遍。
19.性能分析
选择 Maxplus+II->Timing Analyzer,在 Analysis 菜单中可以选择“Delay Matrix”,“Setup/Hold
,
Matrix”“Registered Performance”
,进行延时分析、建立保持时间分析和工作频率分析。
20.下载
MAXPLUS 编译通过后会产生一个以 hex 为后缀的文件,这个文件就是用来下载的数据文件。本次
实验使用的是装载有 EPF10K10 芯片的 CPLD 下载板,不能用 MAXPLUSII 自带的下载工具将数据下载
到这种开发板上,而要使用另一种专用的下载程序 DNLD102.EXE,在电工电子中心计算机的桌面上可
以找到这个下载工具。下图是该程序的界面。具体使用步骤如下:
(1) 选择 Option->Com Port 菜单,设置使用计算机的串口 1 或串口 2 和 CPLD 下载板通信。
(2) 选择 Option->Reset Com 菜单,复位串口。
(3) 按左边列表框下面的“Dir”按钮,如果设置正确,列表框中会有一些文字出现;否则请检查电
缆、电源和串口的设置是否正确,并按下载板上的复位按钮。
(4) 在右边的列表框里选择设计文件所在的目录。
(5) 在中间的列表框里选择需要下载的数据文件,按“Config”按钮下载。
(6) 在 I/O 实验板上设置相应的输入信号,检查输出是否符合设计要求。
― 29 ―
附件 2:
― 30 ―
3) 在下面图示中图形编辑窗口中可以直接绘制原理图。
插入元件有如下几种方式:
a) 选择 Symbol 菜单下的 Enter Symbol 选项;
b) 在图形编辑窗口中双击鼠标左键;
c) 在图形编辑窗口中单击鼠标右键,在弹出的菜单中选择 Enter Symbol 选项。
― 31 ―
这几种方式都可以进入 Enter Symbol 对话框:
在 Symbol Libraries
(元件库)中选择 d:\maxplus2\max2lib\prim,并双击,
这时在左下侧的 Symbol Files
中出现元件列表。从中选择所需的元件,然后单击 OK 按钮,或者直接在元件上双击即可。
下面是插入一个异或门的例子:
按照设计好的原理图,将元件逐一输入。在图形编辑窗口的左侧列有一排图形编辑的辅助按钮,可
以用来连线,输入文本,以及画曲线、圆等图形,还可以放大或者缩小视图。
下面是完成的原理图输入:
― 32 ―
在插入 Input 输入端的 Symbol 时,会出现如下图形:
― 33 ―
附件 3:
实验中的常见问题
1. 上机时请在 E 盘的根目录建立一个子目录,用学号作为目录名,所有的设计数据必须放在这个目
录里。否则在编译设计文件时会出现“无法写 WORK 目录”的错误。每天下机前用 WINZIP 把所
有的设计文件压缩后用 EMAIL 发送到自己的信箱。
3. VHDL 程序保存时文件名必须和实体名称一致,文件名的后缀必须是“vhd”
5. 问题:画激励波形时不能从“node”菜单添加信号
原因:没有对设计编译
7. 问题:原理图输入时,产生编译错误“几个节点连在一起了”
原因:元器件之间的连线必须画在绿色的虚线边框之外,否则有可能被认为连在一起了。
8. 如何在波形窗口里看完整的波形
解决方法:按波形窗口左上方第三个按钮。
― 34 ―
原因: 没有对输出端口赋值,整个电路没有输出。
― 35 ―