收藏 分销(赏)

课程设计-基于fpga的vga图形显示大学论文.doc

上传人:a199****6536 文档编号:6883697 上传时间:2024-12-23 格式:DOC 页数:18 大小:1.69MB 下载积分:8 金币
下载 相关 举报
课程设计-基于fpga的vga图形显示大学论文.doc_第1页
第1页 / 共18页
课程设计-基于fpga的vga图形显示大学论文.doc_第2页
第2页 / 共18页


点击查看更多>>
资源描述
电子信息工程专业综合设计(报告) (课 程 设 计) 题目 基于FPGA的VGA图形显示 二级学院 电气与电子工程学院 专 业 电子信息工程 班 级 学生姓名 学号 同组姓名 指导教师 时 间 1 基于FPGA的VGA图形显示 摘要: 本次的题目是基于FPGA的VGA图形显示,实现VGA图像显示与控制。本文介绍的主要内容围绕着显示特定图片,且图片可受控制的相关原理与方法展开。根据VGA显示原理,利用VHDL作为逻辑描述手段,设计了一种基于现场可编程器件FPGA的VGA接口控制器。实现VGA图像显示控制器是通过Altera公司的QuartusII软件环境下对VGA模块的设计和顶层逻辑框图设计。FPGA的嵌入式系统中能代替VGA的专用显示芯片,节约硬件成本,节省计算机处理时间,加快数据处理速度并具有显示面积大,色彩丰富、承载信息量大、接口简单等优点。除此以外FPGA芯片和EDA设计方法的使用,可根据用户的需求,为设计提供了有针对性的VGA显示控制器,可不需要依靠计算机,它可以大大降低成本,并可以满足生产实践中不断改变的需要。 关键字:FPGA VGA 图像控制器 一、 前言 本次课程设计主要是通过Altera公司的QuartusII软件环境下对VGA模块的设计和顶层逻辑框图设计。VGA是IBM于1987年提出的一个使用模拟信号的电脑显示标准。在性能上,VGA将16色模式的分辨率提高到了640×480,同时VGA新提供了一种具有320×200分辨率、256种颜色的图形模式,且所显示的每一种颜色都可从262144(18位)种颜色中选择,VGA的这种色彩显示能力对微机图形/图象软件的发展起到了很大的促进作用先后分别经历了EGA, EGA, VGA, SVGA, XGA, SXGA, UXGA, QXGA, WQXGA, QSXGA, WQSXGA, QUXGA, WQUXGA, 1080P。 目前大多数计算机与外部显示设备之间都是通过模拟VGA接口连接,计算机内部以数字方式生成的显示图像信息,被显卡中的数字/模拟转换器转变为R,G,B三原色信号和行、场同步信号,信号通过电缆传输到显示设备中。对于模拟显示设备,如模拟CRT显示器,信号被直接送到相应的处理电路,驱动控制显像管生成图像。而对于LCD、DLP等数字显示设备,显示设备中需配置相应的A/D(模拟/数字)转换器,将模拟信号转变为数字信号。在经过D/A和A/D2次转换后,不可避免地造成了一些图像细节的损失。VGA接口应用于CRT显示器无可厚非,但用于连接液晶之类的显示设备,则转换过程的图像损失会使显示效果略微下降。 Quartus II 是Altera公司的综合性PLD/FPGA开发软件,原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware 支持Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。 自1985年Xilinx公司推出第一片现场可编程逻辑器件(FPGA)至今,FPGA历史已经经历了十几年的发展历史。FPGA不仅可以解决电子系统小型化、低功耗、高可靠性等问题,而且其开发周期短、开发软件投入少、芯片价格不断降低,促使FPGA越来越多地取代了ASIC的市场,特别是对小批量、多品种的产品需求,是FPGA成为首选。自发明PFGA以来,就不断的推出新器件和开发工具,力求芯片的速度更高、功耗更低。主要推出了Virex系列和SparanTM系列的FPGA,Vriex系列突破了传统FPGA密度和性能限制,使FPGA不仅仅是逻辑模块,而成为一种系统元件。而Spartan系列为替代ASIC的大容量FPGA树立了一个新的低成本标准。 二、 方案设计及工作原理 (一) 设计方案 此设计要实现某一分辨率下(如640*480@60Hz)的VGA显示驱动。利用VHDL硬件描述语言对每个功能模块进行描述,并逐一对每个功能模块进行编译仿真,使顶层VGA显示控制器的模块实体仿真综合得以顺利通过。使用的为百科融创实验箱(Cyclone III EP3C16Q240C8)要用到4×4键盘、VGA显示控制、ROM等模块。 本次课程设计的实现功能如下: 1. 在白色背景下显示“重庆理工大学”的彩色字体并且可以每间隔3秒变换字体颜色; 2. 显示设计者的学号与姓名; 3.显示四张128*128像素大小的彩色图片,通过实验箱上的4x4键盘控制可以选择不同的图片显示,且图像可以在屏幕上移动。按键A:选择第一幅图片,按键B:选择第二幅图片,按键C:选择第三幅图片,按键D:选择第四幅图片,按键2:增大垂直移动速度,按键8:减小垂直移动速度,按键4:增大水平移动速度,按键6:减小水平移动速度,按键*:暂停/移动。(水平和垂直方向每帧分别移动“H_Step”点和“V_Step”点),通过键盘改变“H_Step”和“V_Step”的值即可改变其移动速度和方向。图像碰到屏幕边沿会反弹回去。 (二)工作原理 (1) VGA显示图像 常见的彩色显示器,一般由CRT(阴极射线管)构成。彩色是有R,G.B(红:RED,绿:GREEN,蓝:BLUE)三基色组成。显示是用逐行扫描的方式解决,阴极射线枪发出电子束打在涂有银光粉的荧光屏幕上,产生R,G,B三基色,合成一个彩色像素[7-8]。扫描从屏幕的左上方开始,从左到右,从上到下,进行扫描,每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行同步,扫描完所有行,用场同步信号进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,预备下一场的扫描。VGA接口是一种D型接口,上面共有15针空,分成三排,每排五个。VGA接口是显卡上应用最为广泛的接口类型,多数的显卡都带有此种接口。有些不带VGA接口而带有DVI(Digital Visual Interface数字视频接口)接口的显卡,也可以通过一个简单的转接头将DVI接口转成VGA接口,通常没有VGA接口的显卡会附赠这样的转接头 (2) FPGA(Filed Programmable Gate Array) FPGA现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半订制电路而出现的,既解决了订制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 FPGA的工作机理基于查找(Look-Up-Table,LUT),LUT其实就是一个RAM。目前很多FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线、大小位16×1的RAM、当用户通过HDL语言描述了一个逻辑电路以后,FPGA的开发软件会自动计算逻辑电路所有可能的结果,并事先把计算好的结果记入RAM中。这样,每当有信号输入需要进行逻辑运算时,不必再用门去搭电路了,只要把输入作为一个地址进行查表,找出对应地址所存储的内容,然后输出即可。对于一个LUT无法完成的电路,则需要通过进行逻辑信号将多个单元相连,这样FPGA就可以实现复杂的逻辑了。 (3)VHDL语言 Verilog HDL是目前应用最为广泛的硬件描述语言.Verilog HDL可以用来进行各种层次的逻辑设计,也可以进行数字系统的逻辑综合,仿真验证和时序分析等。Verilog HDL适合算法级,寄存器级,逻辑级,门级和版图级等各个层次的设计和描述.Verilog HDL进行设计最大的优点是其工艺无关性.这使得工程师在功能设计,逻辑验证阶段可以不必过多考虑门级及工艺实现的具体细节,只需根据系统设计的要求施加不同的约束条件,即可设计出实际电路.Verilog HDL是一种硬件描述语言(hardware description language),为了制作数字电路而用来描述FPGA的设计之用[17]。 显示控制器是一个较大的数字系统,采用模块化设计原则、借鉴自顶向下的程序设计思想,进行功能分离并按层次设计。利用Verilog硬件描述语言对每个功能模块进行描述,并逐一对每个功能模块进行编译仿真,使顶层VGA显示控制器的模块实体仿真综合得以顺利通过[18]。VGA显示控制器主要由以下模块组成:分频模块、VGA时序控制器模块、彩条图形生成模块、VGA显示模块、存储模块等,如下图2.1所示。 HS,VS R B G VGA 接口 D/A 显示器 VGA时序 控制 ROM读取 控制 二分频 EEPROM ADDR DATA CLK 50MHz (图2.1) 三、 各功能模块设计和仿真 图3.1为整个设计的顶层电路,主要由“imagController”模块、VGA模块、“Keyboard_Manage”模块、“Read_Keyboard”模块、“div_24000”模块、“PLL”模块、“SEL_ROM”模块、6个四个ROM模块、“digital”模块。 (图3.1) (一) 、 时钟信号类 (1)“div_24000”模块: 用于将24MHz时钟分频输出1KHz用于键盘扫描。 (2)“PLL”模块: 锁相环用于将24MHz时钟信号变频为25MHz。 (3)“digital”模块: 计时功能,实现“imagController”模块里的“重庆理工大学”字样间隔3秒变色。sec_1为计时秒数的个位数, sec_10为计时秒数的十位数,将其传入到“imagController”模块中,实现文字的变色。 (二) 、ROM模块 ROM模块使用宏功能模块实现。对于可移动的图片,先选择所需要的图片,裁剪成128*128大小的,使用“BmpToMif”软件生成对应的“mif”文件,存入工程所在的文件夹。并设置其内存初始化文件分别为“hua01.mif”、“hua02.mif” 、“hua03.mif” 、“hua04.mif”,根据图片的大小选择ROM的位数与存储大小。在显示“重庆理工大学”字样时,先使用字模工具对图片进行转换,将其数据存入一个ROM模块中。使用同样的方式将含名字学号的图片模块化。ROM模块用于存储图片信息。将其数据线与地址线输入“imagController”模块中,实现图像数据的传输。 (三) 、控制部分 (1) “Read_Keyboard”模块 读入4*4键盘的数据,根据按键情况输出不同的数据。 (2) “Keyboard_Manage”模块 用于接收键盘输入,根据键盘输入设置图像显示及移动参数。 (3) “SEL_ROM”模块 用于选通四个图像ROM,即根据SEL[1..0]的值,从Q1~Q4中选择一个输出到ROM_DATA端口。 (四)、“imagController”模块 此模块为一个核心图片控制部分,包含有对图片的各类处理,使其到达不同的显示效果。 端口VS、hcnt、vcnt是“VGA”模块的输出,用于确定扫描点位置;H_Step、V_Step、Pause端口由“Keyboard_Manage” 模块输出,用于设置图像块移动的速度和方向;ROM_DATA是来自于4个存储128*128大小图片的ROM模块中的图像数据。ROM_DATA1是来自于存储“重庆理工大学”字样的ROM模块的图像数据。ROM_DATA1是来自学号名字的图像数据。sec_1为计时秒数的个位数, sec_10为计时秒数的十位数,计时,实现文字的变色。 (1) 多张图片的显示 需要在屏幕上同时显示出3张图片,如在显示128*128大小的图片,设定显示图片的大小。 if (imag_X+128>hcnt and hcnt>=imag_X and imag_Y+128>vcnt and vcnt>=imag_Y) then--扫描到图像块内 imag_RGB<=ROM_DATA; (2)图片的移动 按键A:选择第一幅图片,按键B:选择第二幅图片,按键C:选择第三幅图片,按键D:选择第四幅图片,按键2:增大垂直移动速度,按键8:减小垂直移动速度,按键4:增大水平移动速度,按键6:减小水平移动速度,按键*:暂停/移动。(水平和垂直方向每帧分别移动“H_Step”点和“V_Step”点),通过键盘改变“H_Step”和“V_Step”的值即可改变其移动速度和方向。图像碰到屏幕边沿会反弹回去 。 实现程序如下: (3) 文字的变色 在对含“重庆理工大学”字样的图片进行mif格式转化的时候,设置为黑白图片,用‘0’表示黑色,即有字显示的地方。选择出屏幕显示文字的位置,“digital”模块开始计时,当秒的十位数字为0,个位数为3时(sec1_1<=3 and sec10_10<=0)即表示3秒,将原来的黑色字体变为红色。于是随着计时器的计时,秒数在一直变化,就实现了字体颜色的间隔3秒改变一次并以60秒为一次循环。具体程序段如下: (五) VGA模块 将“imagController”模块处理的数据通过imag_rgb[2..0]端口输入外部电路当前颜色值;hcnt和vcnt端口的作用为将屏幕行列位置输出,由外部电路计算当前颜色值,根据行列位置确定扫描点的颜色使其显示在640*480的屏幕上,达到预期效果。 四、 结果分析与调试 在完成各部分的程序编写后,将其模块化在底层设计图中按照设计方案连接,之后进行编译无误后对各管角进行绑定。 (一) 运行的方式与结果 完成管脚绑定后,运行程序,运行的效果图(4.1): 在白色的背景下显示有128*128大小的图片,“重庆理工大学”的字样和含有学号与名字的图片,“重庆理工大学”的字样将随着时间3秒变化一次颜色。 图(4.1) 当按下按键A时在128*128大小的区域内显示第一幅图片,按下按键B时切换到第二幅图片,按下按键C时切换第三幅图片,按下按键D切换到第四幅图片。 当按下按键2,图片开始上下移动,按下多次增大垂直移动速度,按下按键8则减小垂直移动速度;按下按键4,图片在上下移动的基础上开始左右移动,按下多次则增大水平移动速度,按下按键6则减小水平移动速度;按下按键*图片暂停移动,再按一次则恢复移动。 (二) 调试及问题解决 在调试时出现的问题: (1) 想要在屏幕上同时显示多张图片 希望在移动图片的背景上添加上“重庆理工大学”的字样与姓名和学号,通过在原有基础上增加2个ROM存放这2张图片的数据,然后在“imagController”模块上多定义2个地址线端口和数据线端口再在其中添加语句,编译完成后运行程序就可以在一个屏幕上显示3张图片了。 (2) “重庆理工大学”字样不能完整显示在指定的区域内,出现字的重叠。 调试多次后,发现问题出现在实现根据扫描行列计算图像ROM地址功能的程序段中 通过更改TEMP_Y1和TEMP_X1所减的数据值来调整“重庆理工大学”字样的位置,多次更改直到最合适为止。 (3) 使“重庆理工大学”字样每间隔3秒换一次颜色 通过添加一个计时器的模块,将其秒的数据接入到“imagController”模块上去,添加程序如下,实现字体变色功能。 五、心得体会 经过三周的时间,从最初的题目选定到每天的程序完善到最后得到理想的运行效果,完成了基于FPGA的VGA图形显示的课程设计。 经过这次课程设计,我感到受益匪浅,对自己各方面的提高都有着巨大的帮助。比如Quartus II的使用,虽然在以前的实验课程中有学习与使用过,但当时都是在老师一步一步的演示下直接使用现有程序进行的,所以缺少对其更深刻与熟练的使用。本次课程设计是在QuartusII软件环境下对VGA模块的设计和顶层逻辑框图设,这让我经过这次课程设计让我对Quartus II软件的使用更加深入与熟练。除此以外还有对FPGA的嵌入式系统的优点与特性有新的认识,FPGA的嵌入式系统中能代替VGA的专用显示芯片,节约硬件成本,节省计算机处理时间,加快数据处理速度并具有显示面积大,色彩丰富、承载信息量大、接口简单等优点。除此以外FPGA芯片和EDA设计方法的使用,可根据用户的需求,为设计提供了有针对性的VGA显示控制器,可不需要依靠计算机,它可以大大降低成本,并可以满足生产实践中不断改变的需要。 在这次课程设计的过程中,在一开始选择课题的过程中就存在着困难,我并不清楚哪种题目更加适合我,于是就在图书馆和网络上查找资料,题目经过了多次修改才最终确定下来。在做课程设计的途中也遇到了一样阻碍,比如一开始不知从何下手,比如忘记了Quartus II的一些使用方法和利用VHDL作为逻辑描述手段,设计了一种基于现场可编程器件FPGA的VGA接口控制器等。在通过结合图书资料下,在老师的悉心指导下,在和同学的讨论中,每一天给自己定个目标,最终完成了,达到了预期的效果。当看到普通的图片经过自己的处理后变的多姿多彩,我们的内心是开心愉快的。 总的来说,这次课程设计让我进一步了解了FPGA的嵌入式系统的相关知识,发现它多种多样的运用,与我们的日常生活息息相关。 经过这次课程设计,我感到受益匪浅,对自己各方面的提高都有着巨大的帮助,给以后的学习与工作奠定了良好的基础。 六、参考文献 [1] 刘福奇主编. FPGA嵌入式项目开发实战[M]. 北京:电子工业出版社,2009.4 [2] 潘松,黄继业,潘明主编. EDA技术实用教程—Verilog HDL版[M]. 北京:科学出版社,2008.11 [3]纪志成,高春能主编. FPGA数字信号处理设计教程—System Generater入门与提高[M]. 西安:西安电子科技大学出版社,2008.4 [4] 田耕,徐文波编著. FPGA 数字电子系统设计与开发实例导航[M]. 北京:电子工业出版社,2005.6 [5] 刘韬,楼兴华主编. FPGA 数字电子系统设计与开发实例导航[M]. 北京:人民邮电出版社,2005.6 [6] 徐志军,徐光晖编著. CPLD/FPGA的开发与应用[M]. 北京:电子工业出版社,2012.1 [7] 姜立东等编著. Verilog语言程序设计及应用[M]. 北京:北京邮电大学出版社,2009.6 [8] 褚振勇,翁木云编著. FPGA设计及应用[M]. 西安:西安电子科技大学出版社,2007.7 [9] 张文爱:基于FPGA的VGA显示控制器的设计,电子工业出版社,2006.9 [10] 王 亮:VGA汉字显示的FPGA 设计与实现,南方工业出版社,2009.2 七 、附录 “imagController”模块 LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; ENTITY imagController IS PORT ( VS : IN STD_LOGIC;--行同步信号 hcnt : IN STD_LOGIC_VECTOR(9 downto 0);--扫描到的列数 vcnt : IN STD_LOGIC_VECTOR(9 downto 0);--扫描到的行数 ROM_DATA : IN STD_LOGIC_VECTOR(2 downto 0); ROM_DATA1 : IN STD_LOGIC; ROM_DATA2 : IN STD_LOGIC_VECTOR(2 downto 0); sec1_1,sec10_10 : in integer range 0 to 9; H_Step,V_Step : in STD_LOGIC_VECTOR(3 downto 0);--水平、竖直移动点数 pause : in std_logic;--暂停 ROM_ADDR : OUT STD_LOGIC_VECTOR(13 downto 0);--图像ROM地址 ROM_ADDR1 : OUT STD_LOGIC_VECTOR(15 downto 0);--图像ROM地址 ROM_ADDR2 : OUT STD_LOGIC_VECTOR(14 downto 0);--图像ROM地址 imag_RGB : OUT STD_LOGIC_VECTOR(2 downto 0)--当前行、列位置的显示值(可能是图像、也可能是背景“000”); ); END imagController; ARCHITECTURE imagController_architecture OF imagController IS signal movedown,moveright : STD_LOGIC;--为0表示向下(向右),为1表示向上(向左) constant imag_width : STD_LOGIC_VECTOR(7 downto 0) :="10000000";--图像宽度128; constant imag_height : STD_LOGIC_VECTOR(7 downto 0) :="10000000";--图像高度128; signal imag_X,imag_Y : STD_LOGIC_VECTOR(9 downto 0);--图像在屏幕上左上角坐标 signal TEMP_Y,TEMP_X : STD_LOGIC_VECTOR(9 downto 0);--临时存储vcnt-imag_Y、hcnt-imag_X,并扩展到10位 signal TEMP_Y1,TEMP_X1 :integer range 0 to 400;--STD_LOGIC_VECTOR(9 downto 0); signal TEMP_Y2,TEMP_X2 :integer range 0 to 200;--STD_LOGIC_VECTOR(9 downto 0); BEGIN --根据扫描行列计算图像ROM TEMP_Y2<=conv_integer(vcnt); TEMP_X2<=conv_integer(hcnt); ROM_ADDR2<=conv_std_logic_vector((TEMP_Y2-120)*200+(TEMP_X2-200),15); TEMP_Y1<=conv_integer(vcnt); TEMP_X1<=conv_integer(hcnt); ROM_ADDR1<=conv_std_logic_vector((TEMP_Y1-40)*400+(TEMP_X1-112),16); TEMP_Y<=vcnt-imag_Y; TEMP_X<=hcnt-imag_X; ROM_ADDR<=(TEMP_Y(6 downto 0)&"0000000")+TEMP_X; --(*128通过左移7位实现) PROCESS(hcnt,vcnt,ROM_DATA)--根据扫描行列确定输出ROM图像数据还是消隐(RGB=“000”) begin if (imag_X+128>hcnt and hcnt>=imag_X and imag_Y+128>vcnt and vcnt>=imag_Y) then--扫描到图像块内 imag_RGB<=ROM_DATA; else if (510>=hcnt and hcnt>=120 and 189>=vcnt and vcnt>=40) then if (sec1_1<=3 and sec10_10<=0) then if ROM_DATA1='0' then imag_RGB<="100"; else imag_RGB<="111"; end if; elsif (sec1_1<=6 and sec10_10<=0) then if ROM_DATA1='0' then imag_RGB<="010"; else imag_RGB<="111"; end if; elsif (sec1_1<=9 and sec10_10<=0) then if ROM_DATA1='0' then imag_RGB<="001"; else imag_RGB<="111"; end if; elsif (sec1_1<=2 and sec10_10<=1) then if ROM_DATA1='0' then imag_RGB<="011"; else imag_RGB<="111"; end if; ................. elsif (sec1_1<=9 and sec10_10<=5) then if ROM_DATA1='0' then imag_RGB<="011"; else imag_RGB<="111"; end if; end if; else if (200>=hcnt and hcnt>=0 and 475>=vcnt and vcnt>=380) then if ROM_DATA2="000" then imag_RGB<="010"; else imag_RGB<="111"; end if; else imag_RGB<="111"; end if; end if; end if; End process; PROCESS(VS) begin if (VS'EVENT AND VS= '1') then --以帧同步信号作为工作时钟 if(pause='1')then if(movedown='0')then--图像块下移 if(imag_Y + imag_height = "0111100000")then--刚好移到下边沿,imag_Y + imag_height = 480 movedown<='1'; --移动方向改为向上 imag_Y<=imag_Y - V_Step;--向上移动“V_Step”个点 elsif(imag_Y + imag_height + V_Step > "0111100000")then--超过下边沿,imag_Y + imag_height > 480 imag_Y<="0111100000" - imag_height;--移动到下边沿 else imag_Y<=imag_Y + V_Step; --向下移动“V_Step”个点 end if; ELSE--图像块上移 if(imag_Y = "0000000000")then--刚好移到上边沿,imag_Y = 0 movedown<='0';--移动方向改为向下 imag_Y<="000000"&V_Step;--向下移动“V_Step”个点 elsif(imag_Y < V_Step)then--超过上边沿 imag_Y<="0000000000";--移动到上边沿 else imag_Y<=imag_Y - V_Step; end if; end if; if(moveright='0')then--图像块右移 if(imag_X + imag_width = "1010000000")then--刚好移到右边沿 moveright<='1';--移动方向改为向左 imag_X<=imag_X - H_Step;--向左移动“H_Step”个点 elsif(imag_X + imag_width + H_Step > "1010000000")then--超过右边沿 imag_X<="1010000000" - imag_width;--移动到右边沿 else imag_X<=imag_X+ H_Step;--向右移动“H_Step”个点 end if; ELSE--图像块左移 if(imag_X = "0000000000")then--刚好移到左边沿 moveright<='0';--移动方向改为向右 imag_X<="000000"&H_Step;--向右移动“H_Step”个点 elsif(imag_X < H_Step)then--超过左边沿 imag_X<="0000000000";--移动到左边沿 else imag_X<=imag_X - H_Step; end if; end if; end if; end if; End process; END imagController_architecture; “Keyboard_Manage”模块 LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; ENTITY Keyboard_Manage IS PORT ( clk : IN STD_LOGIC; Key : IN STD_LOGIC_VECTOR(4 downto 0);--按键值 KEY_State : IN STD_LOGIC;--按键指示 H_Step,V_Step : buffer STD_LOGIC_VECTOR(3 downto 0);--水平(垂直)移动点数 Pause : buffer STD_LOGIC;--0暂停(1移动) SEL : out STD_LOGIC_VECTOR(1 downto 0)--四个图像ROM选通信号 ); END Keyboard_Manage; ARCHITECTURE Keyboard_Manage_architecture OF Keyboard_Manage IS signal LAST_KEY_State : std_logic; --上一刻的按键状态 BEGIN process(clk) begin if rising_edge(clk) then LAST_KEY_State<=KEY_State;--存储上一刻的按键状态 if(KEY_State='1' and LAST_KEY_State='0') then--键盘按下时读取键值 case key is when "00010" =>--按键“2”,增大垂直移动速度V_Step if(V_Step < 15)then V_Step<=V_Step + 1; end if; when "01000" =>--按键“8”,减小垂直移动速度V_Step if(V_Step > 0)then V_Step<=V_Step - 1; end if; when "00110" =>--按键“6”,增大水平移动速度H_Step if(H_Step < 15)then H_Step<=H_Step + 1; end if; when "00100" =>--按键“4”,减小水平移动速度H_Step if(H_Step > 0)then H_Step<=H_Step - 1; end if; when "01111" =>--按键“*”,暂停(继续),Pause取反 pause<='0'; pause<= not pause; when "01110" =>--按键“#”,恢复设置 pause<='0'; V_Step<=(others=>'0');
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服