《基于FPGA的PS2键盘鼠标控制电子琴9649.pdf》由会员分享,可在线阅读,更多相关《基于FPGA的PS2键盘鼠标控制电子琴9649.pdf(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1/28 XX 制造职业技术学院信息工程系 08 级 毕 业 论 文 姓 名:江 太 平 班 级:08 通信电子 设计题目:基于 FPGA 的 PS/2 键盘鼠标控制电子琴 指导教师:*二一一年五月 2/28 目录 第一章 FPGA 简介 1.1 FPGA 背景 1.2 FPGA 芯片结构 1.3 FPGA 的基本特点 第二章 FPGA 工作原理 2.1 查找表(Look-Up-Table)的原理与结构 2.2FPGA 工作原理 第三章 PS2 键盘通信 3.1 PS2 背景 3.2 PS2 键盘通信 3.3VGA 原理 第四章 PS2 键盘控制模型电子琴顶层电路的设计 4.1 PS2 键盘控
2、制电子琴程序 结论、参考文献 3/28 第一章 FPGA 简介 1.1 FPGA 背景 FPGA 主要生产厂商 1、Altera 2、Xilinx 3、Actel 4、Lattice 其中 Altera 作为世界老牌可编程逻辑器件的厂家,是当前世界 X 围内市场占有率最大的厂家,它和 Xilinx 主要生产一般用途 FPGA,其主要产品采用 RAM 工艺。Actel 主要提供非易失性 FPGA,产品主要基于反熔丝工艺和 FLASH 工艺。目前以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC 设计验证的技术
3、主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如 AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的 FPGA 里面,这些可编辑的元件里也包含记忆元件例如触发器(Flipflop)或者其他更加完整的记忆块。系统设计师可以根据需要通过可编辑的连接把 FPGA 内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品 FPGA的逻辑块和连接可以按照设计者而改变,所以 FPGA 可以完成所需要的逻辑功能。FPGA 一般来说比 ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多的优点比如可
4、以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的 FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的 FPGA 上完成的,然后将设计转移到一个类似于ASIC 的芯片上。另外一种方法是用 CPLD(复杂可编程逻辑器件备)。FPGA 采用了逻辑单元阵列 LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块 CLB(Configurable Logic Block)、输出输入模块 IOB(Input Output Block)和内部连线(Interconnect)三个部分。1.2FPGA芯片结构 4/28
5、目前主流的 FPGA 仍是基于查找表技术的,已经远远超出了先前版本的基本性能,并且整合了常用功能(如 RAM、时钟管理和 DSP)的硬核(ASIC型)模块。如图 1-1 所示(注:图 1-1 只是一个示意图,实际上每一个系列的 FPGA 都有其相应的内部结构),FPGA 芯片主 要由 6 部分完成,分别为:可编程输入输出单元、基本可编程逻辑单元、完整的时钟管理、嵌入块式 RAM、丰富的布线资源、内嵌的底层功能单元和内嵌专用硬件模块。图 1-1 FPGA 芯片的内部结构 FPGA 芯片的内部结构 每个模块的功能如下:1 可编程输入输出单元(IOB)可编程输入/输出单元简称 I/O 单元,是芯片与
6、外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配要求,其示意结构如图1-2 所示。FPGA 内的 I/O 按组分类,每组都能够独立地支持不同的 I/O 标准。通过软件的灵活配置,可适配不同的电气标准与 I/O 物理特性,可以调整驱动电流的大小,可以改变上、下拉电阻。目前,I/O 口的频率也越来越高,一些高端的 FPGA 通过 DDR 寄存器技术可以支持高达 2Gbps 的数据速率。图 1-2 典型的 IOB 内部结构示意图 典型的 IOB 内部结构示意图 外部输入信号可以通过 IOB 模块的存储单元输入到 FPGA 的内部,也可以直接输入 FPGA 内部。当外部输入信号经过
7、IOB 模块的存储单元输入到 FPGA内部时,其保持时间(Hold Time)的要求可以降低,通常默认为 0。为了便于管理和适应多种电器标准,FPGA 的 IOB 被划分为若干个组(bank),每个 bank 的接口标准由其接口电压 VCCO 决定,一个 bank 只能5/28 有 一种 VCCO,但不同 bank 的 VCCO 可以不同。只有相同电气标准的端口才能连接在一起,VCCO 电压相同是接口标准的基本条件。2 可配置逻辑块(CLB)CLB 是 FPGA 内的基本逻辑单元。CLB 的实际数量和特性会依器件的不同而不同,但是每个 CLB 都包含一个可配置开关矩阵,此矩阵由 4 或 6 个
8、输入、一些 选型电路(多路复用器等)和触发器组成。开关矩阵是高度灵活的,可以对其进行配置以便处理组合逻辑、移位寄存器或 RAM。在 Xilinx公司的 FPGA 器件中,CLB 由多个(一般为 4 个或 2 个)相同的 Slice 和附加逻辑构成,如图 1-3 所示。每个 CLB 模块不仅可以用于实现组合逻辑、时序逻辑,还可以配置为分布式 RAM 和分布式 ROM。图 1-3 典型的 CLB 结构示意图 典型的 CLB 结构示意图 Slice 是 Xilinx 公司定义的基本逻辑单位,其内部结构如图 1-4 所示,一个 Slice 由两个 4 输入的函数、进位逻辑、算术逻辑、存储逻辑和函数复用
9、器组成。算术逻辑包括一个异或门(XORG)和一个专用与门(MULTAND),一个异或门可以使一个 Slice 实现 2bit 全加操作,专用与门用于提高乘法器的效率;进位逻辑由专用进位信号和函数复用器(MUXC)组成,用于实现快速的算术加减法操作;4 输入函数发生 器用于实现 4 输入 LUT、分布式 RAM 或 16 比特移位寄存器(Virtex-5 系列芯片的 Slice 中的两个输入函数为 6 输入,可以实现 6 输入 LUT 或 64 比特移位寄存器);进位逻辑包括两条快速进位链,用于提高 CLB 模块的处理速度。图 1-4 典型的 4 输入 Slice 结构示意图 6/28 典型的
10、4 输入 Slice 结构示意图 3 数字时钟管理模块(DCM)业内大多数 FPGA 均提供数字时钟管理(Xilinx 的全部 FPGA 均具有这种特性)。Xilinx 推出最先进的 FPGA 提供数字时钟管理和相位环路锁定。相位环路锁定能够提供精确的时钟综合,且能够降低抖动,并实现过滤功能。4 嵌入式块 RAM(BRAM)大多数 FPGA 都具有内嵌的块 RAM,这大大拓展了 FPGA 的应用 X 围和灵活性。块 RAM 可被配置为单端口 RAM、双端口 RAM、内容地址存储器(CAM)以及 FIFO 等常用存储结构。RAM、FIFO 是比较普及的概念,在此就不冗述。CAM 存储器在其内部的
11、每个存储单元中都有一个比较逻辑,写入 CAM 中的数据会和内部的每一个数据进行比较,并返回与端口数据相同的所有数据的地址,因而在路由的地址交换器中有广泛的应用。除了块 RAM,还可以将 FPGA 中的 LUT 灵活地配置成 RAM、ROM 和 FIFO 等结构。在实际应用中,芯片内部块 RAM 的数量也是选择芯片的一个重要因素。单片块 RAM 的容量为 18k 比特,即位宽为 18 比特、深度为 1024,可以根据需要改变其位宽和深度,但要满足两个原则:首先,修改后的容量(位宽 深度)不能大于 18k 比特;其次,位宽最大不能超过 36 比特。当然,可以将多片块 RAM 级联起来形成更大的 R
12、AM,此时只受限于芯片内块 RAM 的数量,而 不再受上面两条原则约束。5 丰富的布线资源 布线资源连通 FPGA 内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA 芯片内部有着丰富的布线资源,根据工艺、长度、宽度和分布位置的不同而划分为类不同的类别。第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;第二类是长线资源,用以完成芯片 Bank 间的高速信号和第二全局时钟信号的布线;第三类是短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;第四类是分布式的布线资源,用于专有时钟、复位等控制信号线。在实际中设计者不需要直接选择布线资源,布局布线器可
13、自动地根据输入逻辑网表的拓扑结构和约束条件选择布线资源来连通各个模块单元。从本质上讲,布线资源的使用方法和设计的结果有密切、直接的关系。6 底层内嵌功能单元 内嵌功能模块主要指 DLL(Delay Locked Loop)、PLL(Phase Locked Loop)、DSP 和 CPU 等软处理核(SoftCore)。现在越来越丰富的内嵌功能单元,使得单片 FPGA 成为了系统级的设计工具,使其具备了软硬件联合设计的能力,逐步向 SOC 平台过渡。DLL 和 PLL 具有类似的功能,可以完成时钟高精度、低抖动的倍频和分频,以及占空比调整和移相等功能。Xilinx 公司生产的芯片上集成了 DL
14、L,7/28 Altera 公司的芯片集成了 PLL,Lattice 公司的新型芯片上同时集成了 PLL和 DLL。PLL 和 DLL 可以通过 IP 核生成的工具方便地进行管理和配置。DLL的结构如图 1-5 所示。图 1-5 典型的 DLL 模块示意图 典型的 DLL 模块示意图 7.内嵌专用硬核 内嵌专用硬核是相对底层嵌入的软核而言的,指 FPGA 处理能力强大的硬核(Hard Core),等效于 ASIC 电路。为了提高 FPGA 性能,芯片生产商在芯片内部集成了一些专用的硬核。例如:为了提高 FPGA 的乘法速度,主流的 FPGA 中都集成了专用乘法器;为了适用通信总线与接口标准,很
15、多高端的 FPGA 内部都集成了串并收发器(SERDES),可以达到数十 Gbps 的收发速度。Xilinx 公司的高端产品不仅集成了 Power PC 系列 CPU,还内嵌了 DSP Core 模块,其相应的系统级设计工具是 EDK 和 Platform Studio,并依此提出了片上系统(System on Chip)的概念。通过 PowerPC、Miroblaze、Picoblaze 等平台,能够开发标准的 DSP 处理器及其相关应用,达到 SOC 的开发目 的。1.3 FPGA 的基本特点 FPGA的基本特点:1)采用 FPGA 设计 ASIC 电路(专用集成电路),用户不需要投片生产
16、,就能得到合用的芯片。2)FPGA 可做其它全定制或半定制 ASIC 电路的中试样片。3)FPGA 内部有丰富的触发器和 IO 引脚。4)FPGA 是 ASIC 电路中设计周期最短、开发费用最低、风险最小的器件之一。5)FPGA 采用高速 CHMOS 工艺,功耗低,可以与 CMOS、TTL 电平兼容。8/28 可以说,FPGA 芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。FPGA 是由存放在片内 RAM 中的程序来设置其工作状态的,因此,工作时需要对片内的 RAM 进行编程。用户可以根据不同的配置模式,采用不同的编程方式。加电时,FPGA 芯片将 EPROM 中数据读入片内编程 RA
17、M 中,配置完成后,FPGA 进入工作状态。掉电后,FPGA 恢复成白片,内部逻辑关系消失,因此,FPGA 能够反复使用。FPGA 的编程无须专用的 FPGA 编程器,只须用通用的EPROM、PROM 编程器即可。当需要修改 FPGA 功能时,只需换一片 EPROM 即可。这样,同一片 FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA 的使用非常灵活。FPGA配置模式 FPGA 有多种配置模式:并行主模式为一片 FPGA 加一片 EPROM 的方式;主从模式可以支持一片 PROM 编程多片 FPGA;串行模式可以采用串行 PROM编程 FPGA;外设模式可以将 FPGA 作为微
18、处理器的外设,由微处理器对其编程。如何实现快速的时序收敛、降低功耗和成本、优化时钟管理并降低 FPGA与 PCB 并行设计的复杂性等问题,一直是采用 FPGA 的系统设计工程师需要考虑的关键问题。如今,随着 FPGA 向更高密度、更大容量、更低功耗和集成更多 IP 的方向发展,系统设计工程师在从这些优异性能获益的同时,不得不面对由于 FPGA 前所未有的性能和能力水平而带来的新的设计挑战。例如,领先 FPGA 厂商 Xilinx 最近推出的 Virtex-5 系列采用 65nm 工艺,可提供高达 33 万个逻辑单元、1,200 个 I/O 和大量硬 IP 块。超大容量和密度使复杂的布线变得更加
19、不可预测,由此带来更严重的时序收敛问题。此外,针对不同应用而集成的更多数量的逻辑功能、DSP、嵌入式处理和接口模块,也让时钟管理和电压分配问题变得更加困难。幸运地是,FPGA 厂商、EDA 工具供应商正在通力合作解决 65nm FPGA独特的设计挑战。不久以前,Synplicity 与 Xilinx 宣布成立超大容量时序收敛联合工作小组,旨在最大程度地帮助系统设计工程师以更快、更高效的方式应用 65nm FPGA 器件。设计软件供应商 Magma 推出的综合工具 Blast FPGA 能帮助建立优化的布局,加快时序的收敛。最近 FPGA 的配置方式已经多元化!9/28 第二章 FPGA 工作原
20、理 FPGA 工作原理 FPGA 采用了逻辑单元阵列 LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块 CLB(Configurable Logic Block)、输出输入模块 IOB(Input Output Block)和内部连线(Interconnect)三个部分。2.1 查找表(Look-Up-Table)的原理与结构 采用这种结构的 PLD 芯片我们也可以称之为 FPGA:如 altera 的ACEX,APEX 系列,xilinx 的 Spartan,Virtex 系列等。查找表(Look-Up-Table)简称为 LUT,LUT 本质上就是一个 RAM
21、。目前 FPGA中多使用 4 输入的 LUT,所以每一个 LUT 可以看成一个有 4 位地址线的 16x1的 RAM。当用户通过原理图或 HDL 语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入 RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。下面是一个 4 输入与门的例子,实际逻辑电路 LUT 的实现方式 a,b,c,d 输入 逻辑输出 地址 RAM 中存储的内容 0000 0 0000 0 0001 0 0001 0.0.0 1111 1 1111 1 一.基于查找表(LUT)的
22、FPGA 的结构 10/28 我们看一看 xilinx Spartan-II 的内部结构,如下图:xilinx Spartan-II 芯片内部结构 Slices 结构 Spartan-II 主要包括 CLBs,I/O 块,RAM 块和可编程连线(未表示出)。在 spartan-II 中,一个 CLB 包括 2 个 Slices,每个 slices 包括两个 LUT,两个触发器和相关逻辑。Slices 可以看成是 SpartanII 实现逻辑的最基本结构(xilinx 其他系列,如 SpartanXL,Virtex 的结构与此稍有不同,具体11/28 请参阅数据手册)altera 的 FLEX/
23、ACEX 等芯片的结构如下图:altera FLEX/ACEX 芯片的内部结构 逻辑单元(LE)内部结构 12/28 FLEX/ACEX 的结构主要包括 LAB,I/O 块,RAM 块(未表示出)和可编程行/列连线。在 FLEX/ACEX 中,一个 LAB 包括 8 个逻辑单元(LE),每个 LE 包括一个 LUT,一个触发器和相关的相关逻辑。LE 是 FLEX/ACEX 芯片实现逻辑的最基本结构(altera 其他系列,如 APEX 的结构与此基本相同,具体请参阅数据手册)二.查找表结构的 FPGA 逻辑实现原理 我们还是以这个电路的为例:A,B,C,D 由 FPGA 芯片的管脚输入后进入可
24、编程连线,然后作为地址线连到到 LUT,LUT 中已经事先写入了所有可能的逻辑结果,通过地址查找到相应的数据然后输出,这样组合逻辑就实现了。该电路中 D 触发器是直接利用LUT 后面 D 触发器来实现。时钟信号 CLK 由 I/O 脚输入后进入芯片内部的时钟专用通道,直接连接到触发器的时钟端。触发器的输出与 I/O 脚相连,把结果输出到芯片管脚。这样 PLD 就完成了图 3 所示电路的功能。(以上这些步骤都是由软件自动完成的,不需要人为干预)这个电路是一个很简单的例子,只需要一个 LUT 加上一个触发器就可以完成。对于一个 LUT 无法完成的的电路,就需要通过进位逻辑将多个单元相连,这样 FP
25、GA 就可以实现复杂的逻辑。由于 LUT 主要适合 SRAM 工艺生产,所以目前大部分 FPGA 都是基于 SRAM 工艺的,而 SRAM 工艺的芯片在掉电后信息就会丢失,一定需要外加一片专用配置芯片,在上电的时候,由这个专用配置芯片把数据加载到 FPGA 中,然后 FPGA 就可以正常工作,由于配置时间很短,不会影响系统正常工作。也有少数 FPGA 采用反熔丝或 Flash 工艺,对这种 FPGA,就不需要外加专用的配置芯片。第三章 PS2 键盘通信 3.1PS2 背景 13/28 PS2 背景 PS/2 接口是目前最常见的鼠标接口,最初是 IBM 公司的专利,俗称“小口”。这是一种鼠标和键
26、盘的专用接口,是一种 6 针的圆型接口。但鼠标只使用其中的 4 针传输数据和供电,其余 2 个为空脚。PS/2 接口的传输速率比接口稍快一些,而且是 ATX 主板的标准接口,是目前应用最为广泛的鼠标接口之一,但仍然不能使高档鼠标完全发挥其性能,而且不支持热插拔。在 BTX 主板规 X 中,这也是即将被淘汰掉的接口。需要注意的是,在连接 PS/2 接口鼠标时不能错误地插入键盘 PS/2接口(当然,也不能把 PS/2 键盘插入鼠标 PS/2 接口)。一般情况下,符合 PC99 规 X 的主板,其鼠标的接口为绿色、键盘的接口为紫色,另外也可以从 PS/2 接口的相对位置来判断:靠近主板 PCB 的是
27、键盘接口,其上方的是鼠标接口。PS2 设备有主从之分,主设备采用 Female 插座,从设备采用 Male 插头,现在广泛实用的 PS2 键盘鼠标均在从设备方式下工作。PS2 接口的时钟与数据线都是集电极开路结构。主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生。a.从设备到主设备的通信 当从设备向主设备发送数据时,首先检查时钟线,以确认时钟线是否为高电平。如果是高电平,从设备就可以开始传输数据;反之,从设备要等待获得总线的控制权,才能开始传输数据。传输的每一帧由 11位组成,发送时序及每一位的含义如图 2 所示。14/28 每一帧数据中开始位总是为 0,数据校验采用奇校验方
28、式,停止位始终为 1。从设备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟下降沿读入数据线状态。如表 1 所示:3.2PS2 键盘通信 目前,键盘有许多种,PS2 键盘是当今 PC 机最常用的种类,这里仅涉及最常用的键盘,也就是 6 引脚发送数据的键盘。键盘通信时需要四根连接线:电源线、地线、时钟线 CLK、数据线 DATA。DATA 和 CLK 是可双向通信的 I/O 线,也就是说,通过这两根线,即可以把主机的数据发送到 PS2 设备,又可以把设备的数据发向主机。在无键按下时,DATA 和 CLK 一直处于高电平状态。但有键按下时,键盘先检查 CLK,看它是否处于处于高
29、电平,如果是处在低电平,说明主机无空闲接受数据,这时键盘将会把数据放在自己的缓冲区,直到 CLK 重新被拉高。键盘 CLK 首先产生下降沿,这时已在数据线上产生信号,如:起始位总是为 0,之后每一个时钟周期时钟电平为高时数据线上加将要输出的电平,在时钟的下降沿它将被主机读取。3.3原理 扫描是从屏幕的左上方开始的,从左到右、从上到下地进行扫描。每扫描完一行,电子束就会回到屏幕左边下一行的起始位置。在这期间,CRT 对电子束进行消隐。每行结束时,用行同步信号进行行同步。扫描完所有行后,用场同步信号进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,预备下一次的扫描。15/28 PS2 键盘控制
30、模型电子琴顶层电路的设计 如图所示,该图是电子琴顶层设计电路。按实现功能电路主要分成这几个模块:1)锁相环、用宏模块搭建的 22 位.23 位.24 位计数器、用 Verilog 写的时钟分频模块 fdiv:提供 25MHz 的时钟信号驱动 VGA 显示 与 24 位计数器结合提供 1Hz 给数字时钟用以计时 与 23 位计数器结合提供 2MHz 给 T138T 与 rom_qupu 以控制节奏 与 22 位计数器结合提供 4MHz 给 t10b 以控制 RAM 的地址 与 fdiv 结合提供 1MHz 给 SPEAK 2)模块 PS2_2:PS2 通信模块,将键盘输出码转换为 ASCII 码
31、,只处理字16/28 母 3)二进制编码器 CODE3:根据键盘码的 ASCII 码,用 verilog 写高、中、低三个音阶的分别对应的键盘字母代码,与 F_CODE 模块相对应,以此来扩大音域 4)模块 F_CODE:模块 F_CODE 的功能首先是为模块 SPKER 提供决定所发音符的分频预置数,而此数在 SPKER 输入口停留的时间即为此音符的节拍长度。同时,F_CODE 把 CODE3 中音符的代码转化为音符频率所对应的数值 与模块 DECL7S 结合显示音符 H3.0显示 0,1,2 表示高、中、低三个音阶 5)模块 DECL7S:7 段译码显示模块,在数码管上显示 1,2,3,4
32、,5,6,7 音符 6)模块 RAM:与模块 t10b 结合记录弹奏的乐曲 7)模块 ROM:与模块 t138b 结合可自动播放储存的音乐 8)模块 shizhong:可记录弹奏时间 9)模块 VGA:显示按键的位置,当音乐响时同步显示对应的音的键盘位置 10)模块 SPEAK 输出每一个音符的音调 11)模块 MUX21 选择播放中的音乐或中的储存音乐 第四章 PS2 键盘控制电子琴(VHDL)4.1 PS2 键盘控制电子琴程序 共分为 DIV1、DIV2 分频模块,PS2 键盘控制模块,music 发音模块,tone音符分频模块,spk 发声模块。library IEEE;use IEEE
33、.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-Unment the following library declaration if instantiating 17/28-any Xilinx primitives in this code.-library UNISIM;-use UNISIM.Vponents.all;entity Div1 is PORT(clk_50mhz:IN STD_LOGIC;-输入时钟为 50MHZ;c0:OUT STD_LOGIC;c1:OU
34、T STD_LOGIC);END Div1;architecture art of Div1 is begin D1:PROCESS(clk_50mhz)-工作进程开始,将 50MHZ时钟 50 分频,=1MHZ;VARIABLE count6:INTEGER RANGE 0 TO 50;BEGIN IF(clk_50mhz EVENT AND clk_50mhz=1)THEN count6:=count6+1;IF count6=25 THEN c0=1;ELSIF count6=50 THEN c0=0;count6:=0;END IF;END IF;END PROCESS;D2:PROC
35、ESS(clk_50mhz)-将 50MHZ 时钟100 分频,=0.5MHZ;VARIABLE count7:INTEGER RANGE 0 TO 100;BEGIN IF(clk_50mhz EVENT AND clk_50mhz=1)THEN count7:=count7+1;IF count7=50 THEN c1=1;ELSIF count7=100 THEN 18/28 c1=0;count7:=0;END IF;END IF;END PROCESS;END art;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGI
36、C_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-Unment the following library declaration if instantiating-any Xilinx primitives in this code.-library UNISIM;-use UNISIM.Vponents.all;entity Div2 is PORT(clk4:IN STD_LOGIC;-输入时钟为1MHZ;c2:OUT STD_LOGIC;-输出 100khz;c3ut std_logic);-输出时钟为 4HZ;END Div2;ARCHITEC
37、TURE art OF Div2 IS begin D1:PROCESS(clk4)-工作进程开始,将 1MHZ 时钟 10分频;VARIABLE count8:INTEGER RANGE 0 TO 10;BEGIN IF(clk4 EVENT AND clk4=1)THEN count8:=count8+1;IF count8=5 THEN c2=1;ELSIF count8=10 THEN c2=0;count8:=0;END IF;END IF;19/28 END PROCESS;D2:PROCESS(clk4)-250000 分频;VARIABLE count9:INTEGER RAN
38、GE 0 TO 250000;BEGIN IF(clk4 EVENT AND clk4=1)THEN count9:=count9+1;IF count9=125000 THEN c3=1;ELSIF count9=250000 THEN c3=0;count9:=0;END IF;END IF;END PROCESS;END art;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-Unment the following library
39、 declaration if instantiating-any Xilinx primitives in this code.-library UNISIM;-use UNISIM.Vponents.all;entity ps2 is Port(sysclk:in std_logic;ps2clk:in std_logic;ps2data:in std_logic;reset:in std_logic;result:out std_logic_vector(7 downto 0);end ps2;20/28 architecture art of ps2 is signal ps2clk_
40、r:std_logic_vector(2 downto 0);signal ps2clkfall:std_logic;signal q:std_logic_vector(11 downto 0);signal ps2serialdata:std_logic_vector(10 downto 0);begin process(sysclk,reset)begin if reset=0 then ps2clk_r=000;elsif rising_edge(sysclk)then ps2clk_r(2)=ps2clk_r(1);ps2clk_r(1)=ps2clk_r(0);ps2clk_r(0)
41、=ps2clk;end if;end process;ps2clkfall=1 when ps2clk_r=110 else 0;process(sysclk)begin if rising_edge(sysclk)then if reset=0 then q 0);elsif ps2clkfall=1 then if q(0)=0 then q=ps2data&;else q=ps2data&q(11 downto 1);end if;end if;end if;end process;process(q)begin 21/28 if q(0)=0 then ps2serialdata=q(
42、11 downto 1);result=not ps2serialdata(8 downto 1);else result=11111111;end if;end process;end art;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-Unment the following library declaration if instantiating-any Xilinx primitives in this code.-libra
43、ry UNISIM;-use UNISIM.Vponents.all;entity music is PORT(clk2:IN STD_LOGIC;-4HZ 时钟信号 index1:IN STD_LOGIC_VECTOR(7 DOWNTO 0);-键盘输入信号 index2:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);-音符信号输出 END music;ARCHITECTURE art OF music IS SIGNAL count3:INTEGER RANGE 0 TO 31;-定义信号计数器,有 32个元素 BEGIN M1ROCESS(count3,clk2,in
44、dex1)-music工作进程开始 22/28 BEGIN IF(clk2 EVENT AND clk2=1)THEN -时钟信号 2 为1 IF(count3=31)THEN -计数器值为 31 count3=0;-计数器清 0 ELSE count3index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index2 index
45、2 index2 index2 index2 index2 index2 index2 index2NULL;END CASE;ELSE-index2index2index2index2index2index2index2index2index2index2index2index2index2index2index2index2index2index2index2index2index2index2index2 tone1=1191;code1=1001111;high1 tone1=1702;code1=0010010;high1 tone1=1517;code1=0000110;high1
46、 tone1=1432;code1=1001100;high1 tone1=1276;code1=0100100;high1 tone1=1136;code1=0100000;high1 tone1=1012;code1=0001111;high1 tone1=955;code1=1001111;high1 tone1=851;code1=0010010;high1 tone1=758;code1=0000110;high1 tone1=716;code1=1001100;high1 tone1=638;code1=0100100;high1 tone1=568;code1=0100000;h
47、igh1 tone1=506;code1=0001111;high1 tone1=478;code1=1001111;high1 tone1=426;code1=0010010;high1 tone1=379;code1=0000110;high1 tone1=358;code1=1001100;high1 tone1=319;code1=0100100;high1 tone1=284;code1=0100000;26/28 high1 tone1=253;code1=0001111;high1 tone1=2047;code1=0000000;high1=000;END CASE;END P
48、ROCESS;END art;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-Unment the following library declaration if instantiating-any Xilinx primitives in this code.-library UNISIM;-use UNISIM.Vponents.all;entity speaker is PORT(clk3:IN STD_LOGIC;-0.5MHZ
49、 时钟信号;tone2:IN INTEGER RANGE 0 TO 2047;-音符分频系数 spk:OUT STD_LOGIC);-驱动扬声器的音频信号 END speaker;ARCHITECTURE art OF speaker IS SIGNAL fullclk:STD_LOGIC;BEGIN S1ROCESS(clk3,tone2)VARIABLE count4:INTEGER RANGE 0 TO 2047;-定义变量频率计数器2047Hz BEGIN IF(clk3EVENT AND clk3=1)THEN -clk3 脉冲上27/28 升沿触发 IF count4tone2 T
50、HEN -若计数器 11值小于音符信 1 count4:=count4+1;fullclk=1;-计数器加 1,音频信号为 1 ELSE count4:=0;fullclk=0;END IF;END IF;END PROCESS;S2ROCESS(fullclk)-音频信号输出进程开始 VARIABLE count5:STD_LOGIC:=0;-定义变量计数器 2,初值0 BEGIN IF(fullclkEVENT AND fullclk=1)THEN -音频信号输出上升沿有效时 count5:=NOT count5;IF count5=1THEN spk=1;ELSE spk=0;END I