FPGA电气技术实践实验报告院(系)名称宇航学院专业名称飞行器设计与工程(航天)学生学号XXXXXXXX学生姓名XXXXXX指导教师XXXX2017年11月XX日实验一四位二进制加法计数器与一位半加器的设计实验时间:2017.11.08(周三)晚实验编号20一、实验目的1、熟悉QuartusII的VHDL的文本编程及图形编程流程全过程。
2、掌握简单逻辑电路的设计方法与功能仿真技巧。
3、学习并掌握VHDL语言、语法规则。
4、参照指导书实例实现四位二进制加法计数器及一位半加器的设计。
二、实验原理.略三、实验设备1可编程逻辑实验箱EP3C55F484C8 一台(包含若干LED指示灯,拨码开关等)2计算机及开发软件QuartusII 一台套四、调试步骤1四位二进制加法计数器(1)参照指导书实例1进行工程建立与命名。
(2)VHDL源文件编辑由于实验箱上LED指示灯的显示性质为“高电平灭,低电平亮”,为实现预期显示效果应将原参考程序改写为减法器,且”q1<= q1+1”对应改为”q1<= q1-1”,以实现每输入一个脉冲“亮为1,灭为0”。
由于参考程序中的rst清零输入作用并未实现,所以应将程序主体部分的最外部嵌套关于rst输入是否为1的判断,且当rst为1时,给四位指示灯置数”1111”实现全灭,当rst为0时,运行原计数部分。
(3)参照指导书进行波形仿真与管脚绑定等操作,链接实验箱并生成下载文件(4)将文件下载至实验箱运行,观察计数器工作现象,调试拨动开关查看是否清零。
可以通过改变与PIN_P20(工程中绑定为clk输入的I/O接口)相连导线的另一端所选择的实验箱频率时钟的输出口位置,改变LED灯显示变化频率。
并且对照指导书上对实验箱自带时钟频率的介绍,可以通过改变导线接口转换输入快慢,排查由于clk输入管脚损坏而可能引起的故障。
2一位半加器(1)参照指导书实例1进行工程建立与命名。
(2)图形源文件编辑:由于实验箱上LED指示灯的显示性质为“高电平灭,低电平亮”,为实现预期显示效果应将原电路图中两个输出管脚与非门串联以实现原参考输出“高电平亮,低电平灭”。
(3)参照指导书进行波形仿真与管脚绑定等操作,链接实验箱并生成下载文件(4)将文件下载至实验箱运行,观察半加器工作现象,调试拨动开关查看进位与置数指示是否正常工作。
五、实验现象1.四位二进制加法计数器SW1下拨为0时,四个LED指示灯可以对输入脉冲从”0000”到”1111”进行十六位循环计数(其中亮为1,灭为0)。
SW1上拨为1时可以实现四个LED灯保持全灭清零。
且四位二进制加法计数器功能成功实现2.一位半加器SW1与SW2输入分别为”00”、”01”、”10”、”11”时,进位指示与置数指示灯分别显示”00”、”01”、”01”、”10”(其中亮为1,灭为0)。
且一位半加器功能成功实现。
六、实验代码1四位二进制加法计数器(已修改)entity count4 isport(clk:in std_logic;--waishizhong,fpga_ex2_6rst:in std_logic;--F1 pin-ab15q:out std_logic_vector(3 downto 0));--led4-1end;architecture b1 of count4 issignal q1:std_logic_vector(3 downto 0);beginprocess(clk,rst)beginif(rst='0')thenif (clk'event and clk='1')then q1<= q1-1;end if;else q1<="1111";end if;end process;q<=q1;end2一位半加器七、结果分析1若在加载运行文件后实验箱上无反应,可以通过更换不同频率输入管脚查看是否为实验箱自带时钟的故障。
2实验箱上LED显示灯与设计逻辑相反时可以通过修改程序逻辑或给电路图添加非门实现正逻辑显示。
实验二16×16LED点阵四字循环显示实验时间:2017.11.08(周三)晚实验编号20一、实验目的1、掌握VHDL编程技巧和各种输入输出显示方法。
2、学习并分析指导书中实例,从中发现感兴趣的题目,并以此自设计一个有内容,功能稍复杂的主、子程序综合应用例程,实现调试与验证。
3、实现LED点阵“高山仰止”四字清晰循环显示。
二、实验原理.1 LED显示原理16×16扫描LED点阵的工作原理同8位扫描数码管类似,其结构示意图(图1)与等效电路图(图2)如下。
它有16个共阴极输出端口,每个共阴极对应有16个LED 显示灯,所以其扫描译码地址需4位信号线(管脚对应COL1-COL4),从右起为第一列且COL1-4对应”0000”。
其汉字扫描码由16位段地址(从下至上管脚对应ROW1-ROW16)输入。
本设计选用的LED列扫描,汉字信号行输入的方式,显示完整汉字。
图1 16×16LED点阵图2 16×16点阵LED等效电路列循环扫描,通过对每一列的扫描来完成对字母的现实,本设计为使列扫描符合视觉暂留要求,扫描频率至少大于16×8=128Hz,周期小于7.8ms,以此给人以连续的感觉。
2 汉字的信息储存用动态分时扫描技术使LED点阵模块显示图像,需要进行两步工作。
第一步是在程序中建立汉字数据库。
第二步是在扫描模块的控制下,配合列扫描的次序正确地输出这些数据。
获得图像数据的步骤是,先将要显示的每一幅图像画在一个如(图3)所示的被分成16×16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布,汉字取模可由专用软件进行。
图3 16*16点阵显示模块由于本实验箱为从右至左依次对应”0000”列到”1111”列,从下至上为最高位到最低位,于平时习惯的认字方向相反,所以注意在逐列扫描的设计中要对字取“反模”。
例如要在右边起第2列的从上到下数2、4、6、8行亮,则列编号为”0001”、行输入为”0000000010101010”就可以实现了。
3延时环节为使汉字不断地循环显示,并且使每个汉子显示后停留,就需要在中间加一定的延时和循环环节。
在这一环节中,可以通过修改每个显示和停留周期包含的总时钟脉冲数值来控制每个字的显示时间,运用状态机设计方法给四个汉字对应的不同输入状态进行编码,即可使汉字依次清晰显示。
三、实验设备1可编程逻辑实验箱EP3C55F484C8 一台(包含16×16LED点阵一组等)2计算机及开发软件QuartusII 一台套四、调试步骤1建立工程,命名为ledgrq1616。
建立VHDL程序文件命名为1ed1616grq.vhd。
2按照第六部分原程序输入代码,并按所示表格绑定管脚。
编写程序及绑定管脚时时注意第二部分中所叙述的扫描显示顺序以及对应取反字模的方法。
3编译无误后开启实验箱,生成.sof传输文件并下载至实验箱,确保运行模式为1,且CPRL_SW拨码开关为”00XX”。
4观察实验箱上现象,通过改接不同频率的脉冲输入管脚或改变每个字符停留周期包含的总脉冲数来保证有足够快的扫描频率与大约每个字大约一秒多的充足停留时间,并查看是否有“高山仰止”四字依次有停顿的清晰的循环显示。
五、实验现象当时钟输入线接FRQH_Q2(3000000Hz)管脚时,设定每个周期为5000000个脉冲时,实现“高山仰止”在16×16LED点阵上清晰循环显示。
六、实验代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity led1616grq is port(clk: in std_logic;--时钟data: out std_logic_vector(15 downto 0);--行输入addrs: out std_logic_vector(3 downto 0));--列地址end led1616grq;architecture chw_arc of led1616grq issignal fenpin:std_logic_vector(1 downto 0);--分频信号signal ad:std_logic_vector(3 downto 0);--地址中转信号beginprocess(clk)--产生一个大约1s的分频信号模块variable cnt:integer:=0;variable tmp:std_logic_vector(1 downto 0);beginif clk'event and clk='1' thenif cnt<5000000 thencnt:=cnt+1;elsecnt:=0;if tmp="11" thentmp:="00";elsetmp:=tmp+1;end if;end if;end if;fenpin<=tmp;end process;process(clk)--送16位地址程序variable js:integer:=0;variable cnt:std_logic_vector(3 downto 0);beginif clk'event and clk='1' thenif js<10000 thenjs:=js+1;elsejs:=0;if cnt="1111" thencnt:="0000";else cnt:=cnt+1;end if;end if;end if;ad<=cnt;end process;process(fenpin,ad)begincase fenpin is--besure to get the opposite model of the word--and exchange the hight 8bit to the low 8bit--then write begin 1111 to 0000when "00"=>case ad is--”高”的字模when "0000"=>data<="0000000000000000";--00 00when "0001"=>data<="0000000000000100";--04 00when "0010"=>data<="1111111000000100";--04 FEwhen "0011"=>data<="1000001000000100";--04 82when "0100"=>data<="0000001000000100";--04 02when "0101"=>data<="0111101011110100";--F4 7Awhen "0110"=>data<="0100101010010100";--94 4Awhen "0111"=>data<="0100101010010100";--94 4Awhen "1000"=>data<="0100101010010110";--96 4Awhen "1001"=>data<="0100101010010101";--95 4Awhen "1010"=>data<="0100101010010100";--94 4Awhen "1011"=>data<="0111101011110100";--F4 7Awhen "1100"=>data<="0000001000000100";--04 02when "1101"=>data<="0000001000000100";--04 02when "1110"=>data<="1111111000000100";--04 FEwhen "1111"=>data<="0000000000000100";--04 00when others=>null;end case;when "01"=>case ad iswhen "0000"=>data<="0000000000000000";--0000 “山”的字模when "0001"=>data<="0000000000000000";--0000when "0010"=>data<="0111111111110000";--7FF0when "0011"=>data<="0010000000000000";--2000when "0100"=>data<="0010000000000000";--2000when "0101"=>data<="0010000000000000";--2000when "0110"=>data<="0010000000000000";--2000when "0111"=>data<="0011111111111111";--3FFFwhen "1000"=>data<="0010000000000000";--2000when "1001"=>data<="0010000000000000";--2000when "1010"=>data<="0010000000000000";--2000when "1011"=>data<="0010000000000000";--2000when "1100"=>data<="0011111111110000";--3FF0when "1101"=>data<="0000000000000000";--0000when "1110"=>data<="0000000000000000";--0000when "1111"=>data<="0000000000000000";--0000when others=>null;end case;when "10"=>case ad iswhen "0000"=>data<="0000000000000000";--0000 “仰”的字模when "0001"=>data<="0000000000000000";--0000when "0010"=>data<="0000011111111100";--07FCwhen "0011"=>data<="0000100000000010";--0804when "0100"=>data<="0000001000000010";--0404when "0101"=>data<="1111111111001111";--FFCFwhen "0110"=>data<="0000000000000000";--0000when "0111"=>data<="0000010000000010";--0402when "1000"=>data<="0000100000000100";--0804when "1001"=>data<="0001111111001111";--1FCFwhen "1010"=>data<="0000000000000000";--0000when "1011"=>data<="0000000000000111";--0007when "1100"=>data<="1111111111111000";--FFF8when "1101"=>data<="0000000001100000";--0060when "1110"=>data<="0000000010000000";--0080when "1111"=>data<="0000000100000000";--0100when others=>null;end case;when "11"=>case ad iswhen "0000"=>data<="0000000000000000";--0000"止"的字模when "0001"=>data<="0100000000000000";--4000when "0010"=>data<="0100000000000000";--4000when "0011"=>data<="0100000001000000";--4040when "0100"=>data<="0100000001000000";--4040when "0101"=>data<="0100000001000000";--4040when "0110"=>data<="0100000001000000";--4040when "0111"=>data<="0100000001000000";--4040when "1000"=>data<="0111111111111111";--7FFFwhen "1001"=>data<="0100000000000000";--0400when "1010"=>data<="0100000000000000";--0400when "1011"=>data<="0100000000000000";--0400when "1100"=>data<="0111111111111111";--7FFFwhen "1101"=>data<="0100000000000000";--4000when "1110"=>data<="0100000000000000";--4000when "1111"=>data<="0100000000000000";--4000when others=>null;end case;when others=>null;end case;end process;addrs<=ad;end chw_arc;管脚绑定如下:七、结果分析设备调试与程序调试一样均为FPGA目标器件功能实现的必须工作,根据加载后实际显示情况,同样可以反推出QuartusII无法直接报错的引脚绑定方面的问题以及程序书写逻辑问题,实验中具体出现的情况如下:(1)显示为一团不断闪烁的重叠形状原因:可能为间隔时间太短措施:应增大间隔周期数,延长停顿(2)字符形状与设计不同/错位原因:如果为行顺序错位或乱序,但每一列仍为从右至左扫描,可能为ROW1-15管脚绑定错位:如果为列出现顺序及显示正确但位置错位,可能为CLK1-3管脚绑定错位;上述两种情况也可同时发生。