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

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

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

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

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%。