59
第第第 第第第 第第第第第 9.1 时时时时时时时时时时 9.2 UART 时时时时时时时时时时时时时 9.3 时时时时时时时时时时时时 9.4 8255 时时时时时时时时时时时时

第九章 数字系统设计与实现

  • Upload
    pascha

  • View
    85

  • Download
    0

Embed Size (px)

DESCRIPTION

第九章 数字系统设计与实现. 9.1 时钟电路的设计与实现 9.2 UART 数据接收发送电路设计与实现 9.3 人机接口电路的设计与实现 9.4 8255 并行接口电路的设计与实现. 9.1 时钟电路的设计与实现 9.1.1 模 24 计数器的 VHDL 设计 9.1.2 模 60 计数器的原理图设计 9.1.3 顶层文件设计. - PowerPoint PPT Presentation

Citation preview

Page 1: 第九章 数字系统设计与实现

第九章 数字系统设计与实现

9.1 时钟电路的设计与实现

9.2 UART 数据接收发送电路设计与实现

9.3 人机接口电路的设计与实现

9.4 8255 并行接口电路的设计与实现

Page 2: 第九章 数字系统设计与实现

• 9.1 时钟电路的设计与实现• 9.1.1 模 24 计数器的 VHDL 设计• 9.1.2 模 60 计数器的原理图设计• 9.1.3 顶层文件设计

Page 3: 第九章 数字系统设计与实现

9.1 时钟电路的设计与实现 数字系统设计一般采用自顶向下的层次化设计方法,在 MAX+plusⅡ 环境下可利用层次化设计方法实现自顶向下的设计。电路设计时,分析设计要求,划分模块,进行低层设计,然后进行顶层设计的连接。下面以图形和文本混合输入为例,设计一个时钟电路,时钟电路由模 60 计数器构成秒、分电路,模 24 计数器构成小时电路,生产各模块的符号文件,最后用时、分、秒模块构成顶层时钟电路。

Page 4: 第九章 数字系统设计与实现

9.1.1 模 24 计数器的 VHDL 设计1. 实体端口定义模 24 的计数器的实体端口定义如下:ENTITY cntm24v IS

PORT(en: IN std_logic; clr:in std_logic; clk:in std_logic; cont:out std_logic; qh:buffer std_logic_vector(3 downto 0);

ql: buffer std_logic_vector(3 downto 0));END ; 输入端口为计数使能 en 、清零 clear 和时钟 clk ,其数据类型为 std_logic 标准逻辑类型;输出端口 cont 的数据类型为 std_logic 标准逻辑类型;小时信号 qh 、 ql 的数据类型为std_logic_vector(3 downto 0) 向量标准逻辑类型。

Page 5: 第九章 数字系统设计与实现

2. 模 24 计数器 VHDL 设计LIBRARY ieee; -- 调用程序包USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;--------------------ENTITY cntm24v IS -- 定义实体端口

PORT(en: IN std_logic; clr:in std_logic; clk:in std_logic; cont:out std_logic; qh:buffer std_logic_vector(3 downto 0);

ql: buffer std_logic_vector(3 downto 0));END ;-----------------------------ARCHITECTURE beh OF cntm24v IS

-- 结构体设计 BEGIN cont<='1'when (qh="0010"and ql="0011"and en='1')else '0'; PROCESS(CLK,clr) BEGIN

Page 6: 第九章 数字系统设计与实现

• IF(clr='0')THEN• qh<="0000";• ql<="0000";• elsif (clk'event and clk='1')then• IF(en='1')THEN• if(ql=3)then• ql<="0000";• if(qh=2)then• qh<="0000";• else• qh<=qh+1;• end if;• else• ql<=ql+1;• end if;• end if;• end if;• end process;• end beh;

Page 7: 第九章 数字系统设计与实现

• 完成模 24 计数器的设计,且仿真通过之后,执行菜单File 下的 Create Default Symbol 命令,生成符号 cntm24v ,该符号将成为当前项目库中的一个元件。

9.1.2 模 60 计数器的原理图设计

这里采用原理图输入方式设计模 60 计数器,输入信号有计数使能 en 、清零 clear 、时钟 clk ;输出信号有 ql0 、ql1 、 ql2 、 ql3 、 qh0 、 qh1 、 qh2 以及进位输出。调用库中已有的元件符号 74161 、三输入与非门 nand3 、非门 not 等,构成符合要求的计数器,图 9.1 是模 60 计数器的原理图。

Page 8: 第九章 数字系统设计与实现

图 9.1 模 60 计数器原理图

Page 9: 第九章 数字系统设计与实现

9.1.3 顶层文件设计• 执行菜单 File 下的建立新文件,文件名为 clock.gdf 。在 cl

ock.gdf 空白处双击鼠标左键,打开 Enter symbol 对话框选择调用的元件,在元件列表区可看到已经生成的两个元件cntm24 和 cntm60 ,调用 cntm24 和 cntm60 ,连接构成时钟电路的顶层设计文件, clock.gdf 文件如图 9.2 所示。

图 9.2 顶层 clock.gdf 文件

Page 10: 第九章 数字系统设计与实现

• 对顶层设计文件 clock.gdf 进行编译和仿真,调整仿真时间和栅格尺寸,观察仿真波形。在 Option 菜单下选择 Grid Size 调整显示栅格的大小。在 File 菜单下选择 End Time 设置仿真时间。利用左侧工具栏上的波形绘制图标,可以方便地对波形文件进行编辑,如输入时钟信号 clk , en 和 clr 设置为高电平等。波形文件保存为 clock .scf ,接下来对该文件进行仿真。

• 打开仿真器窗口,单击 Start按钮,开始仿真,得到如图9.3 所示的仿真波形,观察时、分、秒之间的进位关系。选择芯片,分配引脚,再次进行编译,正确后将设计配置到芯片。

Page 11: 第九章 数字系统设计与实现

• 图 9.3 clock.gdf 仿真波形

Page 12: 第九章 数字系统设计与实现

• 完成全部设计后,在菜单 MAX+plusⅡ 下选择 Hierarchy Display 命令,显示 clock 文件层次结构如图 9.4 所示。

图 9.4 clock.gdf 的层次结构

由图 9.4 可见,顶层 clock.gdf 调用 cntm24v 符号和 cuntm60 符号, cntm24v 符号是文本编辑生成的符号文件; cuntm60 符号是图形编辑生成的符号文件。 符号 cntm24v和 cuntm60又各自调用了 LPM 库中的宏单元 LMP-ADD-SUB:120 和 74160 符号。

Page 13: 第九章 数字系统设计与实现

• 9.2 UART 数据接收发送电路设计与实现

• 9.2.1 UART 程序设计

• 9.2.2 UART 程序仿真

Page 14: 第九章 数字系统设计与实现

• 9.2 UART 数据接收发送电路设计与实现 通用异步数据接收发送方式 UART( Universal Asynchronous Receiver Transmitter)不仅能实现接收发送方相互之间通讯,同时还能满足 PC机、微处理器等设备之间的数据通信。 串行外设都会用到 RS232串行接口,传统上采用专用的集成电路即 UART专用芯片实现,如 TI 、 EXAR 、 EPIC 的 550 、 452 等系列芯片。有时,人们不需要使用完整的 UART 的功能,而对于多串口的设备或需要加密通讯的场合使用 UART也不是最佳选择。如果采用 FPGA/CPLD 器件,那么就可以将所需要的 UART功能集成到 FPGA内部,使用 VHDL集成 UADT 的核心功能,从而使整个设计更加紧凑,更小巧、稳定、可靠。

Page 15: 第九章 数字系统设计与实现

分析 UART 结构,可以看出 UART主要由数据总线接口和控制逻辑、波特率发生器、发送和接受等部分组成,各部分间关系如图 9.5所示。

图 9.5 UART 结构框图

Page 16: 第九章 数字系统设计与实现

• 了解 UART 的基本组成结构后,需要对各部分的功能进行详细的分析。假定所要设计的 UART功能为:数据位 7位、 8位可选,波特率可选,校验方式有奇、偶、无等多种方式。

• 1. 波特率的设定 • UART 的接收和发送可以采用相同的波特率进行,当然也可以实现不同波特率的收发,这里采用相同波特率的收发,波特率可以通过 CPU 的总线接口进行设置。假设 UART收发的每一个数据宽度都是波特率发生器输出时钟周期的 16倍,假定按照 9600bps 的波特率进行收发,那么波特率发生器输出的时钟频率应为 9600×16Hz 。

• 假定系统提供的时钟为 1.8432MHz ,那么可以用 CPU写入不同的数值到波特率保持寄存器,然后用计数器方式生成所需要的各种波特率,该数值计算原则是 1843200/( 16×所期望的波特率)。如果希望获得 9600Hz 的波特率,计算数值为 1843200/ ( 16×9600) =12( 0CH)。

Page 17: 第九章 数字系统设计与实现

• 2. 数据发送 • 数据发送过程中,需要解决几个关键问题:• CPU 要判断何时可以向发送保持寄存器( THR)写入

数据?也就是说 CPU 要写入数据到 THR 之前必须判断当前是否可写?很明显如果不判断,发送的数据会出错,除非 CPU写入 THR 的频率低于当前数据传输的波特率,这种情况是极少出现的。

• CPU写入数据到 THR 后,何时 THR 的数据传送到发送移位寄存器( TSR)进行移位?即处理 THR 和 TSR 的关系。

• 数据位有 7 、 8位两种,校验位有三种,因此发送的数据可能有 9 、 10 、 11 位三种长度,所以需要按照所设置的传输情况分别进行处理。可以通过 CPU写一个端口数据设置数据位、校验方式,发送和接受根据该数据设置进行处理。

Page 18: 第九章 数字系统设计与实现

• 根据以上分析, UART 的数据发送定义如下信号:• txhold :数据发送保持信号,标准逻辑向量型 : • std_logic_vector(0 TO 7) ;• txreg :数据发送存储器,标准逻辑向量型 : • std_logic_vector(0 TO 7) ;• txtag2 :查找数据标志位,标准逻辑型 : std_logic ;• txtag1 :清空寄存器,标准逻辑型 : std_ logic ;• txparity :存储器产生奇偶校验,标准逻辑型 : • std_ logic ;• txclk :数据发送时钟信号,标准逻辑型 : std_ logic ;• txdone :数据发送结束,标准逻辑型 : std_ logic ;• paritycycle :数据发送位校验,标准逻辑型 : • std_ logic ;• txdatardy :数据发送读操作,标准逻辑型 : • std_ logic ;

Page 19: 第九章 数字系统设计与实现

• 图 9.6给出了一个奇校验 8bit 数据的发送时序图。

图 9.6 UART 数据发送时序图3. 数据接收 数据接收同样存在 9 、 10 、 11 位三种串行数据长度的问题,必须根据设置的不同情况将数据完整地取下来。接收数据时还有一个特殊情况,移位时钟不是始终存在,移位时钟在接受到起始位的中间开始产生,到停止位的中间时结束。接受到停止位后,给出中断信号,并提供相应的校验出错、帧出错以及溢出等。

Page 20: 第九章 数字系统设计与实现

• 数据接收时,需引入 hunt 和 idle 两个信号, hunt 为高电平时表示捕捉到起始位, idle 为高电平时表示不在移位状态,利用这两个信号就可以产生接收所需要的移位时钟。

• 根据上述分析, UART 的数据接收过程定义如下信号:• rxhold :数据接收保持信号,标准逻辑向量型:• std_ logic_vector (0 TO 7) ;• rxreg :数据接收存储器,标准逻辑向量型:• std_logic_vector (0 TO 7) ;• rxparity :数据接收校验位,标准逻辑型: std_logic ;• paritygen :产生数据接收校验位,标准逻辑型:• std_logic ;• rxstop :数据接收停止位,标准逻辑型: std_logic ;• rxclk :数据接收时钟,标准逻辑型: std_logic ;• rxidle :数据接收空操作,标准逻辑型: std_logic ;• rxdatardy :数据接收准备读操作,标准逻辑型:• std_logic ;

Page 21: 第九章 数字系统设计与实现

• 图 9.7 是一个 8bit奇校验的接收数据时序图,假定接收正确,因此没有给出校验、溢出、帧出错等信号。

图 9.7 UART 数据接收时序图9.2.1 UART 程序设计 1. 库与实体端口的定义 UART 的设计中,调用的库文件有 IEEE 库,打开的程序包有: std_logic_1164 、 std_logic_arith 、 std_logic_unsigned 。

Page 22: 第九章 数字系统设计与实现

• 实体端口的定义如下:• PORT (clkx16 : IN std_logic; -- 时钟• read : IN std_logic; -- 接收数据读操作• write : IN std_logic; -- 发送数据写操作• rx : IN std_logic; -- 接收数据• reset : IN std_logic; -- 复位清零• tx : OUT std_logic; -- 发送数据• rxrdy : OUT std_logic; -- 准备接收数据• txrdy : OUT std_logic; -- 准备发送数据• parityerr : OUT std_logic; -- 接收数据校验错误• framingerr : OUT std_logic; -- 接收帧数据错误• overrun : OUT std_logic; -- 接收溢出错误• data : INOUT std_logic_vector(0 TO 7)); -- 双向数据总线• 2. UART 程序设计• UART 的程序设计分为 5 部分。第一部分是 CLOCK 时

钟设计,第二部分是发送数据设计,第三部分是接收数据设计,第四部分是异步控制设计,第五部分是发送与接收异步控制设计。

Page 23: 第九章 数字系统设计与实现

• 结构体采用“ IF…THEN…ELSE( ELSIF)”顺序语句设计,结构体命名为 exemplar ,项目名为 UART 。下面提供的是 UART 的 VHDL 设计参考程序,图 9.8是 UART 的参考程序生成的 UART 符号文件。

图 9.8 UART 符号文件

Page 24: 第九章 数字系统设计与实现

• 9.2.2 UART 程序仿真• 编译 UART 程序,正确后开始进行仿真。仿真前信号的

设置如下: rx端口设置为时钟周期信号,周期为 20 us 、clkx16 端口设置为时钟周期信号,周期为 40us 、 reset端口设置为逻辑 1 、 read 端口设置为逻辑 0 、 data 端口设置数据为 01 、 02 、 03 、 04 、 05、 06…。仿真通过后可以看到对应输出端口 data 数据发生的变化, UART 的仿真波形如图 9.9 所示。

• 作者使用 Altera公司的 MAX7000SEPM7128SLC84-6完成项目设计,打开 UART.RPT报告文件,可以了解详细的集成电路资源利用与分配情况。

Page 25: 第九章 数字系统设计与实现

图 9.9 UART 的仿真波形

Page 26: 第九章 数字系统设计与实现

• 9.3 人机接口电路的设计与实现• • 9.3.1 接口电路的分析 9.3.2 接口电路的设计

Page 27: 第九章 数字系统设计与实现

9.3 人机接口电路的设计与实现• 人机接口电路在微机系统中应用非常广泛,主要接口有

数码管显示、键盘和 VGA 显示器等。在 CPLD 系统设计中人机接口电路的设计与开发也是一个重要的环节,例如,数码管的静态和动态扫描显示;矩阵方式的键盘扫描、按键去抖动、键码识别等。这里主要讨论矩阵方式的键盘接口电路的设计与实现。

• 9.3.1 接口电路的分析• 矩阵方式的键盘接口电路的设计主要包含的矩阵扫描、去抖动、键码识别及显示功能的设计,下面以 4×4 键盘接口电路的设计为例。

• 接口电路的系统时钟 inclk频率为 22MHz ,接口电路的主要功能是分频和扫描。利用系统时钟 22MHz 的 inclk 分频产生 5ms 的键查询时钟 keyclkout , keyclkout十分频后产生 50ms 的触发时钟 chuclkout 。在触发时钟chuclkout 的

Page 28: 第九章 数字系统设计与实现

高电平期间送出列扫描数据,将得到的行数据送去抖动电路,去抖动后读入,根据行、列数据之间的关系确定其键值。

• 键盘布局如图 9.10 所示,图 9.11 是设计电路 KEY2 编译通过后生产的符号文件。

图 9.10 KBC 键盘电路示意图

Page 29: 第九章 数字系统设计与实现

图 9.11 KEY2 的符号文件

9.3.2 接口电路的设计1. 去抖动电路设计 去抖动电路的基本设计原理:电路采用 5ms 的时钟接收输入数据 A ,如果连续三次数据为零,可以确认数据是稳定的,且可以接收。如图 9.12 所示是去抖动电路的设计,采用图形设计输入。

Page 30: 第九章 数字系统设计与实现

图 9.12 键盘去抖动电路

以上是通用的抖动消除电路设计,由 D触发器构成。信号稳定时间由 D触发器的个数决定。该单元电路命名为 tinglmove ,该电路作为元件将在下面的 VHDL 程序中调用。

Page 31: 第九章 数字系统设计与实现

• 2. 键盘扫描显示电路的设计• 下面是键盘串行扫描显示电路实体的 VHDL描述,具体程序中采用

元件例化语句调用键盘去抖动电路 tinglmove 。

• LIBRARY ieee;• USE ieee.std_logic_1164.all;• USE ieee.std_logic_arith.all;• USE ieee.std_logic_unsigned.all;• -----------------------------------------• ENTITY key2 IS• PORT (inclk :IN std_logic; -- 时钟信号• inkey : IN std_logic_vector(0 to 3);--按键信号• outkey : OUT std_logic_vector( 0 to 3); • -- 键盘扫描输出信号• outled : OUT std_logic_vector(7 downto 0) • --LED 显示输出信号• );• END key2;• ---------------------------------------------

Page 32: 第九章 数字系统设计与实现

• 图 9.13 是 key2.vhd 文件的层次结构。

图 9.13 key2.vhd 文件的层次结构

图 9.14 是 key2 的仿真波形,可以看到输入 clk 端口的设置, inkey 端口设置逻辑信号,仿真通过后可以看出对应输出口 outkey 数据发生的变化。

Page 33: 第九章 数字系统设计与实现

图 9.14 key2.scf 文件的仿真波形

Page 34: 第九章 数字系统设计与实现

• 9.4 8255 并行接口电路的设计与实现

• 9.4.1 8255接口电路的分析

• 9.4.2 8255接口电路的设计

Page 35: 第九章 数字系统设计与实现

9.4 8255 并行接口电路的设计与实现

• 8255是典型的可编程并行接口芯片,广泛用于各种外设接口电路中。用可编程逻辑器件,如 FLEX 和 MAX 系列设计可以实现 8255的设计,设计具有 24 个可编程 I/O 接口、静态读 /写模式、同步处理设计模式等功能的并行接口电路。

• 9.4.1 8255 接口电路的分析• 可编程并行接口芯片 8255 从结构上看主要有四部分组

成:控制寄存器和逻辑分配单元;数据输出多路选通单元;AB 端口输入输出单元以及 C 端口输入输出控制选择单元。图 9.15是 8255的结构框图。表 9.2 是 8255的接口引脚功能类型及其说明。

Page 36: 第九章 数字系统设计与实现

图9.15 8255

结构框图

Page 37: 第九章 数字系统设计与实现

名称 类型 属性 功能说明Clk input / 时钟

Ncs input “0” 片选

Nrd input “0” 读数据控制

Nwr input “0” 写数据控制

Reset input “1” 复位

A[1..0] input “1” 积存器地址总线

Din[7..0] input “1” 数据输入总线

Pain[7..0] input “1” A口输入总线

Pbin[7..0] input “1” B口输入总线

Pcin[7..0] input “1” C口输入总线

Paen output “1” A口数据使能

Pben output “1” B口数据使能

Dout[7..0] output “1” 数据输出总线

Paout[7..0] output “1” A口输出总线

Pbout[7..0] output “1” B口输出总线

Pcent[7..0] output “1” C口数据使能总线

Pcout[7..0] output “1” C口输出总线

表9.2 8255

的引脚功能及类型说明

Page 38: 第九章 数字系统设计与实现

• 8255三种工作方式的时序波形不同,图 9.16给出工作方式 0 的时序波形。读者如果需要了解方式 1 和 2 的时序波形可以查阅相关资料。

( a) 方式 0 输入时序波形

( b) 方式 0 输出时序波形

图 9.16 工作方式 0 的时序波形

Page 39: 第九章 数字系统设计与实现

9.4.2 8255 接口电路的设计

• 8255的 VHDL 程序中的前几条语句说明调用的 IEEE 库及其相关的程序包;接着是 8255的端口描述,其中输入输出端口的定义与 A8255定义相同;其他语句是 8255的功能描述。

• 这里采用元件例化的设计方法,主程序包含相对独立的7 个例化的子程序,这些子程序分别是 dout_mux、 cntl_log 、 partaout 、 partain 、 partbin 、 partbout 和 partcout 。图 9.17给出主程序与子程序之间的层次关系。

Page 40: 第九章 数字系统设计与实现

图 9.17 主程序与子程序的层次关系

图 9.18是 CNTL-LOG.SCF 文件仿真波形。由图可以看出,输入 RESET 端口设置逻辑 0 、 PCIN 端口设置逻辑 0 、 nRD 端口设置逻辑 0 、 CLK 端口设置时钟 40ns 、nWR 端口设置写信号,可以看到输出端口 PortAoouLd数据发生的变化。

Page 41: 第九章 数字系统设计与实现

图 9.18 cntl_log 仿真波形

Page 42: 第九章 数字系统设计与实现

图 9.19 是 cntl_log 生成的符号文件。

图 9.19 cntl_log 的符号文件

Page 43: 第九章 数字系统设计与实现

• 图 9.20 是 dout_mux的仿真波形。输入 UTSelect 端口设置逻辑 0 、 ontrlReg 端口设置逻辑 00 、 rtAinReg 端口设置逻辑 00 、 PAIN 端口设置逻辑 01 、 02 、 03 、 04 、 05、06…,仿真后,可以看出输出端口 DOUT 数据发生的变化。

图 9.20 dout_mux的仿真波形

Page 44: 第九章 数字系统设计与实现

• 图 9.21 是 dout_mux.vhd 文件编译后生成的符号文件。

图 9.21 dout_mux的符号文件

Page 45: 第九章 数字系统设计与实现

图 9.22 是 portain 的仿真波形。输入 RESET 端口设置逻辑 0 ,复位时 RESET 设置为逻辑 1 ; PortALnLd 端口设置逻辑 0 、 PAIN 端口设置为 00 、 01 、 02 、 03 、 04 、 05、06…、 CLK 端口设置逻辑时钟 40ns ,仿真通过后可以看出对应输出口 PortAInReg 数据变化,同时可以观测到输入 RESET 端口设置逻辑 1 时间段内的复位功能。

图 9.22 portain 的仿真波形

Page 46: 第九章 数字系统设计与实现

• 图 9.23 是 portain.vhd 文件编译后产生的符号文件。

图 9.23 portain 的符号文件

Page 47: 第九章 数字系统设计与实现

• 图 9.24 是 portaout 的仿真波形。输入 RESET 端口设置为逻辑 0 ,复位有效时设置 RESET 为逻辑 1 ; PortAOutLd端口设置逻辑 0 、 DIN 端口设置数据 00 、 01 、 02 、 03 、04 、 05、 06…; CLK 端口设置时钟周期 40ns 。仿真通过后,可以看到输出端口 PAOUT 数据发生的变化,同时可以观测到输入 RESET 端口设置逻辑 1 时间段内,信号被复位。

图 9.24 portaout 的仿真波形

Page 48: 第九章 数字系统设计与实现

• 图 9.25是 portout.vhd 文件编译生成的符号文件。

图 9.25 portout 符号文件

Page 49: 第九章 数字系统设计与实现

• 图 9.26 是 portbin 的仿真波形。输入 RESET 端口设置逻辑 0 ,复位有效时 RESET 为逻辑 1 ; PortBLnLd 端口设置逻辑 0 、 PBIN 端口输入 00 、 01 、 02 、 03 、 04 、05、 06…; CLK 端口设置时钟周期 40ns 。仿真通过后,可以看到输出端口 PortBInReg 数据的变化,同时可以看到输入 RESET 端口为逻辑 1 时,信号复位功能。

图 9.26 portbin 仿真波形

Page 50: 第九章 数字系统设计与实现

• 图 9.27 是 portbin.vhd 文件编译后生成的符号文件。

图 9.27 portbin 符号文件

Page 51: 第九章 数字系统设计与实现

• 图 9.28 portbout.vhd 文件的仿真波形。输入 RESET端口设置逻辑 0 ,复位有效时设为逻辑 1 、 PortALnLd端口设置逻辑 0 、 PAIN 端口设置数据 00 、 01 、 02 、03 、 04 、 05、 06…、 CLK 端口设置时钟周期 40ns 。仿真通过后,可以看出输出端口 PBOUT 数据的变化,同时可以观测到输入 RESET 为逻辑 1 时的信号复位功能。

图 9.28 portbout.vhd 文件的仿真波形

Page 52: 第九章 数字系统设计与实现

• 图 9.29 是 portbout.vhd 文件编译后生成的符号文件。

图 9.29 portbout.vhd 的符号文件

Page 53: 第九章 数字系统设计与实现

• 图 9. 30 是输出端口 C子程序 portcout.vhd 文件编译后生成的 portcout 符号文件。

图 9.30 portcout.vhd 的符号文件

Page 54: 第九章 数字系统设计与实现

• 图 9.31 是 portcout.vhd 文件的仿真波形。输入 RESET 端口设置逻辑 0 、 DIN 端口设置数据为 00 、 01 、 02 、 03 、 04 、05、 06…、 PCIN端口设置数据为 00 、01 、 02 、 03 、 04 、05、 06…、 CLK 端口设置时钟周期 40ns 。仿真通过后,看到输出端口 COUT 和 Status 数据按照 DIN 端口和 PCIN 端口的数据发生对应的变化。当RESET 端口设置逻辑1 时,信号复位。 图 9.31 portcout.vhd 文件的仿真波形

Page 55: 第九章 数字系统设计与实现

使用 MAX+pulsII 仿真器对主程序进行仿真,其仿真波形如图 9.32 所示。 RESET 端口设置为低电平, NWR 端口设置为高电平, NCS 端口设置为低电平, CLK 端口设置时钟周期 40ns , PBEN 端口设置为低电平, PAEN 端口设置为高电平, DIN 端口设置数据为 00 , PAIN 端口输入数据为 00 、 02 、 03 、 04 、 05、 06…. 。仿真后可以看到 DOUT 端口数据的变化, PAIN 端口的数据正常发送。读者可以改变数据的设置,进一步观测仿真波形的变化。 上述分析可知, VHDL语言设计描述的 8255接口电路符合设计要求,符合 8255输入输出的工作方式,且仿真结果正确。选择 Altera公司的 MAX7000S 系列的可编程芯片 EPM7128SQC160-6 进行引脚锁定,利用生成的配置文件 *.pof 进行配置与下载。

Page 56: 第九章 数字系统设计与实现

图9.32 8255

仿真波形

Page 57: 第九章 数字系统设计与实现

• 图 9.33 是 8255 主程序编译后生成的符号文件。

图 9.33 8255 主程序生成的符号文件

Page 58: 第九章 数字系统设计与实现

• 选用 EPM7128SQC160-6 器件,编译后,打开 MAX+plus11 生成的报表文件 8255.rep ,可以看到器件内部资源的分配情况。 EPM7128SQC160-6芯片有八个逻辑单元 A 、 B 、 C 、D 、 E 、 F 、 G 和H 。表 9.3 是八个逻辑单元的资源分配情况。

• 表 9.3 八个逻辑单元资源分配情况

名称 阵列模块

逻辑单元

I/O 引脚

分配扩展

外部连接

A LC1 - LC16

14/16( 87%)

12/12(100%)

13/16( 81%)

32/36( 88%)

B LC17 - LC32

15/16( 93%)

12/12(100%)

9/16( 56%)

35/36( 97%)

C LC33 - LC48

14/16( 87%)

12/12(100%)

16/16(100%)

32/36( 88%)

D LC49 - LC64

13/16( 81%)

11/12( 91%)

16/16(100%)

32/36( 88%)

E LC65 - LC80

16/16(100%)

12/12(100%)

16/16(100%)

31/36( 86%)

F LC81 - LC96

16/16(100%)

11/12( 91%)

16/16(100%)

27/36( 75%)

G LC97 - LC112

16/16(100%)

8/12( 66%)

16/16(100%)

36/36(100%)

H LC113 - LC128

16/16(100%)

6/12( 50%)

16/16(100%)

32/36( 88%)

Page 59: 第九章 数字系统设计与实现

• EPM7128SQC160-6资源占用统计如下:专用输入引脚1/4 ,占用 25%;输入输出引脚 84/96占用 87%;逻辑单元 120/128,占用 93%;分配扩展 64/128,占用 50%。