基于FPGA的PS2键盘鼠标控制电子琴_第1页
基于FPGA的PS2键盘鼠标控制电子琴_第2页
基于FPGA的PS2键盘鼠标控制电子琴_第3页
基于FPGA的PS2键盘鼠标控制电子琴_第4页
基于FPGA的PS2键盘鼠标控制电子琴_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、江西制造职业技术学院信息工程系08级毕 业 论 文姓 名: 江 太 平 班 级: 08通信电子 设计题目:基于FPGA的PS/2键盘鼠标控制电子琴 指导教师: 吴 康 二一一年五月目录第一章 FPGA简介1.1 FPGA背景1.2 FPGA芯片结构1.3 FPGA的基本特点第二章 FPGA工作原理2.1 查找表(Look-Up-Table)的原理与结构2.2 FPGA工作原理第三章 PS2键盘通信3.1 PS2 背景3.2 PS2键盘通信3.3 VGA原理第四章 PS2键盘控制模型电子琴顶层电路的设计 4.1 PS2键盘控制电子琴程序结论、参考文献第一章 FPGA简介1.1 FPGA背景FPG

2、A主要生产厂商1、Altera 2、Xilinx 3、Actel 4、Lattice 其中Altera作为世界老牌可编程逻辑器件的厂家,是当前世界范围内市场占有率最大的厂家,它和Xilinx主要生产一般用途FPGA,其主要产品采用RAM工艺。Actel主要提供非易失性FPGA,产品主要基于反熔丝工艺和FLASH工艺。 目前以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC 设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码

3、器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flipflop)或者其他更加完整的记忆块。 系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。 FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,

4、所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。另外一种方法是用CPLD(复杂可编程逻辑器件备)。FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。 1.2 FPGA芯片结构目前主流的FPGA仍是基于查找表技术的,已经远远超出了先前版本的基本性能,并且整合了常用功能(如RAM、时钟管理和DSP)的硬核(ASIC型)模块。如图1-1所示(

5、注:图1-1只是一个示意图,实际上每一个系列的FPGA都有其相应的内部结构),FPGA芯片主 要由6部分完成,分别为:可编程输入输出单元、基本可编程逻辑单元、完整的时钟管理、嵌入块式RAM、丰富的布线资源、内嵌的底层功能单元和内嵌专用硬件模块。 图1-1 FPGA芯片的内部结构    FPGA芯片的内部结构每个模块的功能如下: 1 可编程输入输出单元(IOB) 可编程输入/输出单元简称I/O单元,是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配要求,其示意结构如图1-2所示。 FPGA内的I/O按组分类,每组都能够独立地支持不同的I/O标准。通过软

6、件的灵活配置,可适配不同的电气标准与I/O物理特性,可以调整驱动电流的大小,可以改变上、下拉电阻。目前,I/O口的频率也越来越高,一些高端的FPGA通过DDR寄存器技术可以支持高达2Gbps的数据速率。 图1-2 典型的IOB内部结构示意图    典型的IOB内部结构示意图外部输入信号可以通过IOB模块的存储单元输入到FPGA的内部,也可以直接输入FPGA 内部。当外部输入信号经过IOB模块的存储单元输入到FPGA内部时,其保持时间(Hold Time)的要求可以降低,通常默认为0。 为了便于管理和适应多种电器标准,FPGA的IOB被划分为若干个组(bank),每个bank

7、的接口标准由其接口电压VCCO决定,一个bank只能有 一种VCCO,但不同bank的VCCO可以不同。只有相同电气标准的端口才能连接在一起,VCCO电压相同是接口标准的基本条件。 2 可配置逻辑块(CLB) CLB是FPGA内的基本逻辑单元。CLB的实际数量和特性会依器件的不同而不同,但是每个CLB都包含一个可配置开关矩阵,此矩阵由4或6个输入、一些 选型电路(多路复用器等)和触发器组成。 开关矩阵是高度灵活的,可以对其进行配置以便处理组合逻辑、移位寄存器或RAM。在Xilinx公司的FPGA器件中,CLB由多个(一般为4个或2个)相同的Slice和附加逻辑构成,如图1-3所示。每个CLB模

8、块不仅可以用于实现组合逻辑、时序逻辑,还可以配置为分布式RAM和分布式ROM。 图1-3 典型的CLB结构示意图    典型的CLB结构示意图Slice是Xilinx公司定义的基本逻辑单位,其内部结构如图1-4所示,一个Slice由两个4输入的函数、进位逻辑、算术逻辑、存储逻辑和函数复用器组成。算术逻辑包括一个异或门(XORG)和一个专用与门(MULTAND),一个异或门可以使一个Slice实现 2bit全加操作,专用与门用于提高乘法器的效率;进位逻辑由专用进位信号和函数复用器(MUXC)组成,用于实现快速的算术加减法操作;4输入函数发生 器用于实现4输入LUT、分布式RA

9、M或16比特移位寄存器(Virtex-5系列芯片的Slice中的两个输入函数为6输入,可以实现6输入LUT或 64比特移位寄存器);进位逻辑包括两条快速进位链,用于提高CLB模块的处理速度。 图1-4 典型的4输入Slice结构示意图    典型的4输入Slice结构示意图3 数字时钟管理模块(DCM) 业内大多数FPGA均提供数字时钟管理(Xilinx的全部FPGA均具有这种特性)。Xilinx推出最先进的FPGA提供数字时钟管理和相位环路锁定。相位环路锁定能够提供精确的时钟综合,且能够降低抖动,并实现过滤功能。 4 嵌入式块RAM(BRAM) 大多数FPGA都具有内嵌的

10、块RAM,这大大拓展了FPGA的应用范围和灵活性。块RAM可被配置为单端口RAM、双端口RAM、内容地址存储器 (CAM)以及FIFO等常用存储结构。RAM、FIFO是比较普及的概念,在此就不冗述。CAM存储器在其内部的每个存储单元中都有一个比较逻辑,写入 CAM中的数据会和内部的每一个数据进行比较,并返回与端口数据相同的所有数据的地址,因而在路由的地址交换器中有广泛的应用。除了块RAM,还可以将 FPGA中的LUT灵活地配置成RAM、ROM和FIFO等结构。在实际应用中,芯片内部块RAM的数量也是选择芯片的一个重要因素。 单片块RAM的容量为18k比特,即位宽为18比特、深度为1024,可以

11、根据需要改变其位宽和深度,但要满足两个原则:首先,修改后的容量(位宽 深度)不能大于18k比特;其次,位宽最大不能超过36比特。当然,可以将多片块RAM级联起来形成更大的RAM,此时只受限于芯片内块RAM的数量,而 不再受上面两条原则约束。 5 丰富的布线资源 布线资源连通FPGA内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA芯片内部有着丰富的布线资源,根据工艺、长度、宽度和分布位置的不同而划分为类不同的类别。第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;第二类是长线资源,用以完成芯片 Bank间的高速信号和第二全局时钟信号的布线;第三类

12、是短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;第四类是分布式的布线资源,用于专有时钟、复位等控制信号线。 在实际中设计者不需要直接选择布线资源,布局布线器可自动地根据输入逻辑网表的拓扑结构和约束条件选择布线资源来连通各个模块单元。从本质上讲,布线资源的使用方法和设计的结果有密切、直接的关系。 6 底层内嵌功能单元 内嵌功能模块主要指DLL(Delay Locked Loop)、PLL(Phase Locked Loop)、DSP和CPU等软处理核(SoftCore)。现在越来越丰富的内嵌功能单元,使得单片FPGA成为了系统级的设计工具,使其具备了软硬件联合设计的能力,逐步向SOC平台过

13、渡。 DLL和PLL具有类似的功能,可以完成时钟高精度、低抖动的倍频和分频,以及占空比调整和移相等功能。Xilinx公司生产的芯片上集成了 DLL,Altera公司的芯片集成了PLL,Lattice公司的新型芯片上同时集成了PLL和DLL。PLL 和DLL可以通过IP核生成的工具方便地进行管理和配置。DLL的结构如图1-5所示。 图1-5 典型的DLL模块示意图    典型的DLL模块示意图7. 内嵌专用硬核 内嵌专用硬核是相对底层嵌入的软核而言的,指FPGA处理能力强大的硬核(Hard Core),等效于ASIC电路。为了提高FPGA性能,芯片生产商在芯片内部集成了一些专

14、用的硬核。例如:为了提高FPGA的乘法速度,主流的FPGA 中都集成了专用乘法器;为了适用通信总线与接口标准,很多高端的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

15、)采用FPGA设计ASIC电路(专用集成电路),用户不需要投片生产,就能得到合用的芯片。 2)FPGA可做其它全定制或半定制ASIC电路的中试样片。 3)FPGA内部有丰富的触发器和IO引脚。 4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。 5) FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。 可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。 FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。 加电时,FPGA芯片将EPRO

16、M中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。 FPGA配置模式FPGA有多种配置模式:并行主模式为一片FPGA加一片EPROM的方式;主从模式可以支持一片PROM编程多片FPGA;串行模式可以采用串行PROM编程FPGA;外设模式可以将FPGA作为微处理器的外设,由微处理器对其

17、编程。 如何实现快速的时序收敛、降低功耗和成本、优化时钟管理并降低FPGA与PCB并行设计的复杂性等问题,一直是采用FPGA的系统设计工程师需要考虑的关键问题。如今,随着FPGA向更高密度、更大容量、更低功耗和集成更多IP的方向发展,系统设计工程师在从这些优异性能获益的同时,不得不面对由于FPGA前所未有的性能和能力水平而带来的新的设计挑战。 例如,领先FPGA厂商Xilinx最近推出的Virtex-5系列采用65nm工艺,可提供高达33万个逻辑单元、1,200个I/O和大量硬IP块。超大容量和密度使复杂的布线变得更加不可预测,由此带来更严重的时序收敛问题。此外,针对不同应用而集成的更多数量的

18、逻辑功能、DSP、嵌入式处理和接口模块,也让时钟管理和电压分配问题变得更加困难。 幸运地是,FPGA厂商、EDA工具供应商正在通力合作解决65nm FPGA独特的设计挑战。不久以前,Synplicity与Xilinx宣布成立超大容量时序收敛联合工作小组,旨在最大程度地帮助系统设计工程师以更快、更高效的方式应用65nm FPGA器件。设计软件供应商Magma推出的综合工具Blast FPGA能帮助建立优化的布局,加快时序的收敛。 最近FPGA的配置方式已经多元化!第二章 FPGA工作原理FPGA工作原理FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配

19、置逻辑模块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。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的16x1的RAM。当用户通过原理图或HDL语言描述了一个逻辑电路以后,

20、PLD/FPGA开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。下面是一个4输入与门的例子,实际逻辑电路LUT的实现方式a,b,c,d 输入逻辑输出地址RAM中存储的内容00000000000001000010.0.01111111111一.基于查找表(LUT)的FPGA的结构我们看一看xilinx Spartan-II的内部结构,如下图:xilinx Spartan-II 芯片内部结构Slices结构Spartan-II主要包括CLBs,I/O块,RAM块和可编程连线(未表示出)

21、。在spartan-II中,一个CLB包括2个Slices,每个slices包括两个LUT,两个触发器和相关逻辑。 Slices可以看成是SpartanII实现逻辑的最基本结构 (xilinx其他系列,如SpartanXL,Virtex的结构与此稍有不同,具体请参阅数据手册)altera的FLEX/ACEX等芯片的结构如下图: altera FLEX/ACEX 芯片的内部结构 逻辑单元(LE)内部结构FLEX/ACEX的结构主要包括LAB,I/O块,RAM块(未表示出)和可编程行/列连线。在FLEX/ACEX中,一个LAB包括8个逻辑单元(LE),每个LE包括一个LUT,一

22、个触发器和相关的相关逻辑。LE是FLEX/ACEX芯片实现逻辑的最基本结构(altera其他系列,如APEX的结构与此基本相同,具体请参阅数据手册) 二.查找表结构的FPGA逻辑实现原理 我们还是以这个电路的为例:A,B,C,D由FPGA芯片的管脚输入后进入可编程连线,然后作为地址线连到到LUT,LUT中已经事先写入了所有可能的逻辑结果,通过地址查找到相应的数据然后输出,这样组合逻辑就实现了。该电路中D触发器是直接利用LUT后面D触发器来实现。时钟信号CLK由I/O脚输入后进入芯片内部的时钟专用通道,直接连接到触发器的时钟端。触发器的输出与I/O脚相连,把结果输出到芯片管脚

23、。这样PLD就完成了图3所示电路的功能。(以上这些步骤都是由软件自动完成的,不需要人为干预)这个电路是一个很简单的例子,只需要一个LUT加上一个触发器就可以完成。对于一个LUT无法完成的的电路,就需要通过进位逻辑将多个单元相连,这样FPGA就可以实现复杂的逻辑。由于LUT主要适合SRAM工艺生产,所以目前大部分FPGA都是基于SRAM工艺的,而SRAM工艺的芯片在掉电后信息就会丢失,一定需要外加一片专用配置芯片,在上电的时候,由这个专用配置芯片把数据加载到FPGA中,然后FPGA就可以正常工作,由于配置时间很短,不会影响系统正常工作。也有少数FPGA采用反熔丝或Flash工艺,对这种FPGA,

24、就不需要外加专用的配置芯片。 第三章 PS2键盘通信3.1 PS2背景PS2背景PS/2接口是目前最常见的鼠标接口,最初是IBM公司的专利,俗称“小口”。这是一种鼠标和键盘的专用接口,是一种6针的圆型接口。但鼠标只使用其中的4针传输数据和供电,其余2个为空脚。PS/2接口的传输速率比COM接口稍快一些,而且是ATX主板的标准接口,是目前应用最为广泛的鼠标接口之一,但仍然不能使高档鼠标完全发挥其性能,而且不支持热插拔。在BTX主板规范中,这也是即将被淘汰掉的接口。     需要注意的是,在连接PS/2接口鼠标时不能错误地插入键盘PS/2接口(当然,也不能把

25、PS/2键盘插入鼠标PS/2接口)。一般情况下,符合PC99规范的主板,其鼠标的接口为绿色、键盘的接口为紫色,另外也可以从PS/2接口的相对位置来判断:靠近主板PCB的是键盘接口,其上方的是鼠标接口。  PS2设备有主从之分,主设备采用Female插座,从设备采用Male插头,现在广泛实用的PS2键盘鼠标均在从设备方式下工作。PS2接口的时钟与数据线都是集电极开路结构。主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生。a.从设备到主设备的通信当从设备向主设备发送数据时,首先检查时钟线,以确认时钟线是否为高电平。如果是高电平,从设备就可以开始传输数据;反之,

26、从设备要等待获得总线的控制权,才能开始传输数据。传输的每一帧由11位组成,发送时序及每一位的含义如图2所示。每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1。从设备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟下降沿读入数据线状态。如表1所示:3.2 PS2键盘通信目前,键盘有许多种,PS2键盘是当今PC机最常用的种类,这里仅涉及最常用的键盘,也就是6引脚发送数据的键盘。键盘通信时需要四根连接线:电源线、地线、时钟线CLK、数据线DATA。DATA和CLK是可双向通信的I/O线,也就是说,通过这两根线,即可以把主机的数据发送到PS2设备,又可以把设备的数

27、据发向主机。在无键按下时,DATA和CLK一直处于高电平状态。但有键按下时,键盘先检查CLK,看它是否处于处于高电平,如果是处在低电平,说明主机无空闲接受数据,这时键盘将会把数据放在自己的缓冲区,直到CLK重新被拉高。键盘CLK首先产生下降沿,这时已在数据线上产生信号,如:起始位总是为0,之后每一个时钟周期时钟电平为高时数据线上加将要输出的电平,在时钟的下降沿它将被主机读取。3.3 原理扫描是从屏幕的左上方开始的,从左到右、从上到下地进行扫描。每扫描完一行,电子束就会回到屏幕左边下一行的起始位置。在这期间,CRT对电子束进行消隐。每行结束时,用行同步信号进行行同步。扫描完所有行后,用场同步信号

28、进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,预备下一次的扫描。PS2键盘控制模型电子琴顶层电路的设计如图所示,该图是电子琴顶层设计电路。按实现功能电路主要分成这几个模块:1) 锁相环、用宏模块搭建的22位.23位.24位计数器、用Verilog写的时钟分频模块fdiv:1 提供25MHz的时钟信号驱动VGA显示2 与24位计数器结合提供1Hz给数字时钟用以计时3 与23位计数器结合提供2MHz给CNT138T与rom_qupu以控制节奏4 与22位计数器结合提供4MHz给cnt10b以控制RAM的地址5 与fdiv结合提供1MHz给SPEAK2) 模块PS2_2:PS2通信模块,将键

29、盘输出码转换为ASCII码,只处理字母3) 二进制编码器CODE3:根据键盘码的ASCII码,用verilog写高、中、低三个音阶的分别对应的键盘字母代码,与F_CODE模块相对应,以此来扩大音域4) 模块F_CODE:1 模块F_CODE的功能首先是为模块SPKER提供决定所发音符的分频预置数,而此数在SPKER输入口停留的时间即为此音符的节拍长度。2 同时,F_CODE把CODE3中音符的代码转化为音符频率所对应的数值3 与模块DECL7S结合显示音符4 H3.0显示0,1,2表示高、中、低三个音阶5) 模块DECL7S:7段译码显示模块,在数码管上显示1,2,3,4,5,6,7音符6)

30、模块RAM:与模块cnt10b结合记录弹奏的乐曲7) 模块ROM:与模块cnt138b结合可自动播放储存的音乐8) 模块shizhong:可记录弹奏时间9) 模块VGA:显示按键的位置,当音乐响时同步显示对应的音的键盘位置10)模块SPEAK输出每一个音符的音调11)模块MUX21选择播放中的音乐或中的储存音乐第四章 PS2键盘控制电子琴(VHDL)4.1 PS2键盘控制电子琴程序共分为DIV1、DIV2分频模块,PS2键盘控制模块,music发音模块,tone音符分频模块,spk发声模块。library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.ST

31、D_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity Div1 is    PORT(clk_50mhz: IN STD_LOGIC;           

32、0;-输入时钟为50MHZ;     c0: OUT STD_LOGIC;c1: OUT STD_LOGIC);      END Div1;architecture art of Div1 isbeginD1: PROCESS(clk_50mhz)          -工作进程开始,将50MHZ时钟50分频,=1MHZ;  VARIABLE count6:INTEGER RANGE 0 TO 50;   BEGIN

33、  IF(clk_50mhz 'EVENT AND clk_50mhz ='1')THEN         count6:=count6+1;                     IF count6=25 THEN               

34、;    c0 <='1'   ELSIF count6=50 THEN     c0 <='0' count6:=0;END IF;END IF;END PROCESS;D2: PROCESS(clk_50mhz)                -将50MHZ时钟100分频,=0.5MHZ;VARIABLE count7: INTEGER RANGE 0 TO

35、100;BEGINIF(clk_50mhz 'EVENT AND clk_50mhz ='1')THEN         count7:=count7+1;                     IF count7=50 THEN                &

36、#160;  c1<='1'   ELSIF count7=100 THEN     c1 <='0' count7:=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;- Uncomment the following library declar

37、ation if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity Div2 is    PORT(clk4: IN STD_LOGIC;            -输入时钟为1MHZ;     c2: OUT STD_LOGIC;         

38、  -输出100khz;          c3ut std_logic);       -输出时钟为4HZ;END Div2;ARCHITECTURE art OF Div2 ISbeginD1: PROCESS(clk4)          -工作进程开始,将1MHZ时钟10分频;  VARIABLE count8:INTEGER RANGE 0 TO 10;   BEGI

39、N  IF(clk4 'EVENT AND clk4 ='1')THEN         count8:=count8+1;                     IF count8=5 THEN                 &#

40、160; c2 <='1'   ELSIF count8=10 THEN     c2 <='0' count8:=0;END IF;END IF;END PROCESS;D2: PROCESS(clk4)                -250000分频;VARIABLE count9: INTEGER RANGE 0 TO 250000;BEGINIF(clk4 'EVE

41、NT AND clk4 ='1')THEN         count9:=count9+1;                     IF count9=125000 THEN                   c3<='1&

42、#39;   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;- Uncomment the following library declaration if instantiating- any

43、Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity ps2 is    Port ( sysclk: in std_logic;                                      ps2clk: in s

44、td_logic;                                      ps2data: in std_logic;                         

45、          reset: in std_logic;       result: out std_logic_vector(7 downto 0); end ps2;architecture art of ps2 issignal ps2clk_r : std_logic_vector(2 downto 0);            signal ps2clkfall : std_logic;

46、60;                           signal q : std_logic_vector(11 downto 0);                  signal ps2serialdata : std_logic_vector(10 downto 0) ;   

47、;  begin        process(sysclk,reset) beginif 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) <= ps2

48、clk;end if;end process;ps2clkfall<='1' when ps2clk_r="110" else '0' process(sysclk) beginif rising_edge(sysclk) then                         if reset='0' then q <= (other

49、s =>'0');            elsif ps2clkfall='1' then                   if q(0)='0' then                     &

50、#160;      q <= ps2data & "01111111111"          else      q <= ps2data & q(11 downto 1);            end if;        end if;  &

51、#160; end if;end process;process(q)beginif q(0) = '0' then  ps2serialdata <= q(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_LOG

52、IC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity music is    PORT(clk2:   IN STD_LOGIC;           &

53、#160;           -4HZ时钟信号          index1: IN STD_LOGIC_VECTOR(7 DOWNTO 0);   -键盘输入信号       index2: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);  -音符信号输出END music;ARCHITECTURE art OF music ISSIGNAL coun

54、t3:INTEGER RANGE 0 TO 31;  -定义信号计数器,有32个元素BEGINM1ROCESS(count3,clk2,index1)               -music工作进程开始BEGIN  IF(clk2 'EVENT AND clk2 ='1')THEN       -时钟信号2为1    IF(count3=31)THEN  

55、60;                -计数器值为31      count3<=0;                        -计数器清0ELSE      count3<=count3+1;END IF;END IF;END PROCES

56、S;M2ROCESS(count3,index1)-除去了敏感信号auto1BEGINIF index1="01001101" THEN                      按下P键生效CASE count3 IS          -由计数器从0到31的取?断音符信号?制? WHEN 0=>index2<="00000011"&

57、#160;   -3WHEN 1=> index2<="00000011"    -3WHEN 2=> index2<="00000011"    -3WHEN 3=> index2<="00000011"    -3WHEN 4=> index2<="00000101"    -5WHEN 5=> index2<="00000101" 

58、   -5WHEN 6=> index2<="00000101"    -5WHEN 7=> index2<="00000110"    -6WHEN 8=> index2<="00001000"    -8WHEN 9=> index2<="00001000"    -8WHEN 10=> index2<="00001000"  

59、60;-8WHEN 11=> index2<="00000011"   -3WHEN 12=> index2<="00000010"   -2WHEN 13=> index2<="00000010"   -2WHEN 14=> index2<="00000001"   -1WHEN 15=> index2<="00000001"   -1

60、WHEN 16=> index2<="00000101"   -5WHEN 17=> index2<="00000101"   -5WHEN 18=> index2<="00000100"   -4WHEN 19=> index2<="00000100"   -4WHEN 20=> index2<="00000100"   -4WHEN

61、21=> index2<="00000011"   -3WHEN 22=> index2<="00000010"   -2WHEN 23=> index2<="00000010"   -2WHEN 24=> index2<="00000101"   -5WHEN 25=> index2<="00000101"   -5WHEN 26=&g

62、t; index2<="00000100"   -4WHEN 27=> index2<="00000100"   -4WHEN 28=> index2<="00000011"   -3WHEN 29=> index2<="00000011"   -3WHEN 30=> index2<="00000010"   -2WHEN 31=> in

63、dex2<="00000010"   -2WHEN OTHERS=>NULL;END CASE;ELSE -index2<=index1; case index1 iswhen"00010101"=>index2<="00000001"-qwhen"00011101"=>index2<="00000010"-wwhen"00100100"=>index2<="00000011"-ew

64、hen"00101101"=>index2<="00000100"-rwhen"00101100"=>index2<="00000101"-twhen"00110101"=>index2<="00000110"-ywhen"00111100"=>index2<="00000111"-uwhen"00011100"=>index2<="0000100

65、0"-awhen"00011011"=>index2<="00001001"-swhen"00100011"=>index2<="00001010"-dwhen"00101011"=>index2<="00001011"-fwhen"00110100"=>index2<="00001100"-gwhen"00110011"=>index2<=&qu

66、ot;00001101"-hwhen"00111011"=>index2<="00001110"-jwhen"00011010"=>index2<="00001111"-zwhen"00100010"=>index2<="00010000"-xwhen"00100001"=>index2<="00010001"-cwhen"00101010"=>inde

67、x2<="00010010"-vwhen"00110010"=>index2<="00010011"-bwhen"00110001"=>index2<="00010100"-nwhen"00111010"=>index2<="00010101"-mwhen         others=>index2<="11111111"end case;&

68、#160;                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;- Uncomment the following library declaration if instantiating- any Xilinx primitiv

69、es in this code.-library UNISIM;-use UNISIM.VComponents.all;entity tone is    Port (index3: IN STD_LOGIC_VECTOR(7 DOWNTO 0);  -音符输入信号     code1:  OUT STD_LOGIC_VECTOR(6 DOWNTO 0);  -音符显示信号     high1:  OUT STD_LOGIC_

70、VECTOR(2 DOWNTO 0);   -高低音显示信号     tone1:  OUT INTEGER RANGE 0 TO 2047);       -音符的分频系数end tone;architecture art of tone isbeginT1:process(index3)begincase index3 iswhen"00000001"=> tone1<=1191; code1<="1001111"

71、 high1<="001"WHEN"00000010"=> tone1<=1702; code1<="0010010" high1<="001"WHEN"00000011"=> tone1<=1517; code1<="0000110" high1<="001"WHEN"00000100"=> tone1<=1432; code1<="1001100&qu

72、ot; high1<="001"WHEN"00000101"=> tone1<=1276; code1<="0100100" high1<="001"WHEN"00000110"=> tone1<=1136; code1<="0100000" high1<="001"WHEN"00000111"=> tone1<=1012;  code1<=&q

73、uot;0001111" high1<="001"WHEN"00001000"=> tone1<=955;  code1<="1001111" high1<="010"WHEN"00001001"=> tone1<=851;  code1<="0010010" high1<="010"  WHEN"00001010"

74、;=> tone1<=758;  code1<="0000110" high1<="010"WHEN"00001011"=> tone1<=716;  code1<="1001100" high1<="010"WHEN"00001100"=> tone1<=638;  code1<="0100100" high1<="

75、;010"WHEN"00001101"=> tone1<=568;  code1<="0100000" high1<="010"WHEN"00001110"=> tone1<=506;  code1<="0001111" high1<="010"WHEN"00001111"=> tone1<=478;  code1<="1001111" high1<="100"WHEN"0001

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论