欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    PLD实验报告.doc

    • 资源ID:4079749       资源大小:207.53KB        全文页数:10页
    • 资源格式: DOC        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    PLD实验报告.doc

    PLD实验报告 实验内容:用4*3键盘作为输入,在8*8的LED显示屏上采用动画过度的效果显示相应的字符,并以两个按键作为复位和字符循环播放模式。电路结构:1.4*3数字键盘键盘的按键识别方式采用行扫描,实际电路中由于列输入端在悬空时被内部电路拉高而呈逻辑1,所以需要使用低电平作为行扫描标志,相应的,列接收端以低电平作为有效信号。由于按键存在一定的抖动,所以在扫描时可以采用较低的扫描频率,也可以通过计数器保证一次按键的有效识别。2.8*8的LED显示屏:8*8LED显示屏可采用行扫描来进行显示,行以高电平作为扫描标志连接某一行的二极管的阳极,而列以低电平作为二极管的阴极输出。但由于FPGA驱动能力有限,不可能同时驱动一整排的LED灯管,所以实验板上采用反向器提高其驱动能力,相应的在FPGA端,应使用以低电平作为标志的行扫描信号。3. 普通按键电路板上有四个被电路拉高为逻辑1的按键,在按键时呈现低电平,作为复位信号以及字符循环显示的模式选择。程序结构:1. 字符矩阵采用常量的方式存储大量的字符显示所需的矩阵信息:TYPE romtable IS ARRAY (0 TO 7) OF STD_LOGIC_VECTOR(7 DOWNTO 0);CONSTANT zero:romtable:=romtable'("11000011", "10111101", "10111101", "10111101", "10111101","10111101", "10111101", "11000011");CONSTANT one:romtable:=romtable'("11100111", "11000111", "11100111", "11100111", "11100111","11100111", "11100111", "11000011");CONSTANT two:romtable:=romtable'("11000011", "10011001", "10111001", "11111011", "11110111","11101111", "11011111", "10000001");CONSTANT three:romtable:=romtable'("11000011", "11111001", "11111101", "11100011", "11111101","11111101", "11111001", "11000011");CONSTANT four:romtable:=romtable'("11110111", "11101111", "11011111", "10110111", "10110111","10000001", "11110111", "11110111");CONSTANT five:romtable:=romtable'("11000001", "11011111", "11000011", "11111001", "11111101","11111101", "10111001", "11000011");CONSTANT six:romtable:=romtable'("11110111", "11101111", "11011111", "10100011", "10111101","10111101", "10111101", "11000011");CONSTANT seven:romtable:=romtable'("10000001", "11111101", "11111011", "11110111", "11101111","11011111", "11011111", "11011111");CONSTANT eight:romtable:=romtable'("11000011", "10111101", "10111101", "11000011", "10111101","10111101", "10111101", "11000011");CONSTANT nine:romtable:=romtable'("11000011", "10111101", "10111101", "10111101", "11000001","11111101", "11111101", "11000011");CONSTANT star:romtable:=romtable'("11111111", "11101111", "10101101", "11000011", "11101111","11010111", "10111011", "11111111");CONSTANT sharp:romtable:=romtable'("11111111", "11011011", "10000001", "11011011", "11011011","10000001", "11011011", "11111111");CONSTANT act1:romtable:=romtable'("00000000", "00000000", "00000000", "00011000", "00011000","00000000", "00000000", "00000000");CONSTANT act2:romtable:=romtable'("00000000", "00000000", "00111100", "00111100", "00111100","00111100", "00000000", "00000000");CONSTANT act3:romtable:=romtable'("00000000", "01111110", "01111110", "01111110", "01111110","01111110", "01111110", "00000000");CONSTANT act4:romtable:=romtable'("11111111", "11111111", "11111111", "11111111", "11111111","11111111", "11111111", "11111111");CONSTANT window1:romtable:=romtable'("00000000", "00000000", "00111100", "00100100", "00100100","00111100", "00000000", "00000000");CONSTANT window2:romtable:=romtable'("00000000", "01111110", "01000010", "01000010", "01000010","01000010", "01111110", "00000000");CONSTANT window3:romtable:=romtable'("11111111", "10000001", "10000001", "10000001", "10000001","10000001", "10000001", "11111111");CONSTANT window4:romtable:=romtable'("00000000", "00000000", "00000000", "00000000", "00000000","00000000", "00000000", "00000000");对应的图像如下:其中前12个对应键盘上的字符,而最后8个用作动画的窗。2.分频器整个程序使用一个PROCESS作为分频模块,采用多次渐进分频的方法,提供多种频率信号的输出,程序如下:SIGNAL clk4:STD_LOGIC:='0'SIGNAL clk5:STD_LOGIC:='0'SIGNAL clk6:STD_LOGIC:='0'clocks:PROCESS(clk,reset)VARIABLE clk1:STD_LOGIC_VECTOR(7 DOWNTO 0):="00000000"VARIABLE clk2:STD_LOGIC_VECTOR(7 DOWNTO 0):="00000000"VARIABLE clk3:STD_LOGIC_VECTOR(7 DOWNTO 0):="00000000"BEGINIF reset='0' THEN-在需要的时候重置分频器参数。clk1:="00000000"clk2:="00000000"clk3:="00000000"ELSIF RISING_EDGE(clk) THEN-计数器工作,采用系统时钟50MHz,端口“Y11”clk1:=clk1+1;IF clk1="11111010" THEN-250clk1:="00000000"clk2:=clk2+1;END IF;IF clk2="11111010" THEN-clk2每计数到250时跳变为0clk2:="00000000"clk3:=clk3+1;clk5<=NOT clk5;-clk5产生400Hz的信号,作为8*8LED显示屏的扫描频率的8倍END IF;IF clk3="00100000" THEN-clk3每计数到32时跳变为0clk3:="00000000"clk4<=NOT clk4;-clk4产生12Hz的信号,作为数字键盘的扫描频率的4倍END IF;clk6<=clk3(5);END IF;END PROCESS;3. 数字键盘扫描:采用clk4信号作为扫描时钟,同时使用复位信号reset进行复位,程序如下:SIGNAL rowtemp:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000"scan:PROCESS(clk4,reset)-update rowVARIABLE rowtemp00:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000"-采用内部信号进行计数。BEGINIF reset='0' THEN rowtemp00:="0000"rowtemp<="0000"row<="1000"ELSIF RISING_EDGE(clk4) THENCASE rowtemp00 IS-rowtemp00存储的为每一行所对应的前一地址信息,便于简化计算WHEN"0000"=> rowtemp00:="0011"WHEN"0011"=> rowtemp00:="0110"WHEN"0110"=> rowtemp00:="1001"WHEN"1001"=> rowtemp00:="0000"WHEN OTHERS=> rowtemp00:="0000"END CASE;CASE rowtemp00 ISWHEN"0000"=> row<="0111"-行扫信号输出WHEN"0011"=> row<="1011"WHEN"0110"=> row<="1101"WHEN"1001"=> row<="1110"WHEN OTHERS=> row<="0111"END CASE;rowtemp<=rowtemp00;-行扫信息输出END IF;END PROCESS;4. 按键识别将列输入信号col与行扫描信息rowtemp相加得到字符地址,并输入count中,传入字符输出模块中,程序如下:getkey:PROCESS(clk4)VARIABLE count00:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000"BEGINIF FALLING_EDGE(clk4) THENIF style='1' THENCASE col ISWHEN"110"=> lastcount<=count00;-有新的有效按键输入,存储上一次按键count00:=rowtemp+"0001"-由行地址和列地址生成字符地址dcount<="00"-动画显示计数器WHEN"101"=> lastcount<=count00;count00:=rowtemp+"0010"dcount<="00"WHEN"011"=> lastcount<=count00;count00:=rowtemp+"0011"dcount<="00"WHEN OTHERS=> lastcount<=count00;count00:=count00;IF dcount/="11" THEN dcount<=dcount+1; END IF;END CASE;ELSIF style='0' THEN-字符循环显示功能lastcount<=count00;-用lastcount存储上一次按键的信息CASE count00 ISWHEN"0001"=> count00:="0010"WHEN"0010"=> count00:="0011"WHEN"0011"=> count00:="0100"WHEN"0100"=> count00:="0101"WHEN"0101"=> count00:="0110"WHEN"0110"=> count00:="0111"WHEN"0111"=> count00:="1000"WHEN"1000"=> count00:="1001"WHEN"1001"=> count00:="1010"WHEN"1010"=> count00:="1011"WHEN"1011"=> count00:="1100"WHEN"1100"=> count00:="0001"WHEN OTHERS=> count00:="0001"END CASE;END IF;count<=count00;colout<=col;count2<=count00;END IF;END PROCESS;按键(字符地址)第1列第2列第3列第1行1("0001")2("0010")3("0011")第2行4("0100")5("0101")6("0110")第3行7("0111")8("1000")9("1001")第4行*("1010")0("1011")#("1100")5.字符显示使用50Hz的刷屏速度,将上一个按键所对应的矩阵与本次按键所对应多的矩阵分别与act和lastact相乘后相加,再与边框矩阵window相加得到需要显示的矩阵,示例如下:若上一个字符为0,本次字符为4:若上一个字符为2,本次字符为#:程序如下:showkey:PROCESS(clk5,reset)VARIABLE rowtemp2:STD_LOGIC_VECTOR(7 DOWNTO 0):="00000000"VARIABLE ncol2:INTEGER RANGE 0 TO 7:=0;VARIABLE act:romtable;VARIABLE window:romtable;VARIABLE lastact:romtable;VARIABLE col2temp:STD_LOGIC_VECTOR(7 DOWNTO 0):="00000000"VARIABLE col2temp2:STD_LOGIC_VECTOR(7 DOWNTO 0):="00000000"BEGINIF reset='0' THEN-清除存储的案件所对应的字符信息rowtemp2:="11111111"ncol2:=0;row2<="11111111"col2<="11111111"act:=act4;lastact:=act4;window:=window4;ELSIF RISING_EDGE(clk5) THENCASE rowtemp2 IS-8*8LED显示屏行扫描信号生成WHEN"11111110"=> rowtemp2:="11111101"ncol2:=1;-ncol2便于提取显示字符的每一行信息WHEN"11111101"=> rowtemp2:="11111011"ncol2:=2;WHEN"11111011"=> rowtemp2:="11110111"ncol2:=3;WHEN"11110111"=> rowtemp2:="11101111"ncol2:=4;WHEN"11101111"=> rowtemp2:="11011111"ncol2:=5;WHEN"11011111"=> rowtemp2:="10111111"ncol2:=6;WHEN"10111111"=> rowtemp2:="01111111"ncol2:=7;WHEN"01111111"=> rowtemp2:="11111110"ncol2:=0;WHEN OTHERS=> rowtemp2:="11111110"ncol2:=0;END CASE;row2<=rowtemp2;CASE dcount IS-动画计数器对应相应的动作矩阵act以及边框windowWHEN"00"=> act:=act1;window:=window1;WHEN"01"=> act:=act2;window:=window2;WHEN"10"=> act:=act3;window:=window3;WHEN"11"=> act:=act4;window:=window4;WHEN OTHERS=> act:=act4;window:=window4;END CASE;FOR i IN 0 TO 7 LOOP-lastact = NOT actlastact(i):=NOT act(i);-上一次按键对应的动作矩阵lastact-与本次按键所对应的动作矩阵act相反END LOOP;CASE count IS-形成本次按键所对应字符矩阵的显示范围WHEN"0001"=> col2temp:=one(ncol2) AND act(ncol2);WHEN"0010"=> col2temp:=two(ncol2) AND act(ncol2);WHEN"0011"=> col2temp:=three(ncol2) AND act(ncol2);WHEN"0100"=> col2temp:=four(ncol2) AND act(ncol2);WHEN"0101"=> col2temp:=five(ncol2) AND act(ncol2);WHEN"0110"=> col2temp:=six(ncol2) AND act(ncol2);WHEN"0111"=> col2temp:=seven(ncol2) AND act(ncol2);WHEN"1000"=> col2temp:=eight(ncol2) AND act(ncol2);WHEN"1001"=> col2temp:=nine(ncol2) AND act(ncol2);WHEN"1010"=> col2temp:=star(ncol2) AND act(ncol2);WHEN"1011"=> col2temp:=zero(ncol2) AND act(ncol2);WHEN"1100"=> col2temp:=sharp(ncol2) AND act(ncol2);WHEN OTHERS=> col2temp:="11111111" AND act(ncol2);END CASE;CASE lastcount IS-形成上一次按键所对应字符矩阵的显示范围WHEN"0001"=> col2temp2:=(one(ncol2) AND lastact(ncol2);WHEN"0010"=> col2temp2:=(two(ncol2) AND lastact(ncol2);WHEN"0011"=> col2temp2:=(three(ncol2) AND lastact(ncol2);WHEN"0100"=> col2temp2:=(four(ncol2) AND lastact(ncol2);WHEN"0101"=> col2temp2:=(five(ncol2) AND lastact(ncol2);WHEN"0110"=> col2temp2:=(six(ncol2) AND lastact(ncol2);WHEN"0111"=> col2temp2:=(seven(ncol2) AND lastact(ncol2);WHEN"1000"=> col2temp2:=(eight(ncol2) AND lastact(ncol2);WHEN"1001"=> col2temp2:=(nine(ncol2) AND lastact(ncol2);WHEN"1010"=> col2temp2:=(star(ncol2) AND lastact(ncol2);WHEN"1011"=> col2temp2:=(zero(ncol2) AND lastact(ncol2);WHEN"1100"=> col2temp2:=(sharp(ncol2) AND lastact(ncol2);WHEN OTHERS=> col2temp2:=("11111111" AND lastact(ncol2);END CASE;col2<=(col2temp OR col2temp2) AND (NOT window(ncol2);-添加边框后形成最后的输出矩阵END IF;END PROCESS;6. 实体信息entity numberkeyboard is Port ( clk : in STD_LOGIC; style : in STD_LOGIC; reset : in STD_LOGIC; row : out STD_LOGIC_VECTOR (3 downto 0);-from 1 to 4 col : in STD_LOGIC_VECTOR (2 downto 0); colout : out STD_LOGIC_VECTOR (2 downto 0); count2 : out STD_LOGIC_VECTOR (3 downto 0); row2 : out STD_LOGIC_VECTOR (7 downto 0); col2 : out STD_LOGIC_VECTOR (7 downto 0);end numberkeyboard;实验小结:1. 模块化编程将每一个大的模块分开写便于中间调试,但每一个模块尽量完成一个较为完整的功能,而不必将模块的适应性过于高,从而节省有限的FPGA资源。分频器采用多次渐进分频也是处于这个考虑。2. 状态机每一个模块均采用状态机的方法进行编写,层次清晰也不容易出现综合错误。3. 调试为了便于调试,利用8个发光二极管或其他显示端作为程序内部的一些关键信息的输出,便于快速定位错位的位置。4. 常见综合错误(1) SIGNAL信号在不同的PROCESS中出现赋值语句。(2) 将SIGNAL信号的赋值出现在两块复杂的语句中。

    注意事项

    本文(PLD实验报告.doc)为本站会员(少林足球)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开