




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、南京邮电大学课程设计报告设计类别: EDA-VHDL 专业名称: 通信工程 班级学号: B09010504 学生姓名: 张嫣艳 基本题 : 矩阵键盘按键的数码管显示 综合题 : 数码管学号滚动显示 同小组成员: 学号: B09010502 姓名: 沈沁芳 指导教师: 王奇、梅中辉、周晓燕、孔凡坤 日 期: 2012年3月5日3月30日 目 录一 矩阵键盘按键的数码管显示1实验目的- 3 2实验所用仪器及元器件-3 3实验任务要求-34. 设计思路-35. 模块分析-36. 逻辑仿真图及功能分析-47. 调试过程与问题-88. 实验总结-89. 附录(VHDL源程序)-8二 数码管学号滚动显示1
2、实验目的-122实验所用仪器及元器件-123实验任务要求-134. 设计思路-135. 模块分析-136. 逻辑仿真图及功能分析-167. 调试过程与问题-188. 实验总结-189. 附录(VHDL源程序)-18一 矩阵键盘按键的数码管显示1实验目的 (1).使学生全面了解如何应用该硬件描述语言进行高速集成电路设计; (2).通过软件设计环节与仿真环节使学生熟悉Quartus II设计与仿真环境; (3).通过对基本题、综合题的设计实践,使学生掌握硬件系统设计方法(自底向上或自 顶向下),熟悉VHDL语言三种设计风格,熟悉其芯片硬件实现的过程。 2实验所用仪器及元器件(1)PC机(2)ALt
3、era CPLD硬件实验开发系统 (3)设计软件(Quartus II )3实验任务要求 要求学生设计出4*4矩阵键盘对某一按键按下就在数码管显示一个数字。按键从左上角到右下角依次为1,2,16。4. 设计思路首先一个4*4矩阵键盘中有四行四列,先假设键盘自上至下的第一行的四个键分别代表01,02,03,04;第二行四个键分别代表05,06,07,08;第三行四个键分别代表09,10,11,12;第四行分别代表13,14,15,16。题目的意思是任意按下一个键,输出端会输出相应的数字,而每个键被选中的条件是它的行数和列数被选中,也就是在仿真中可以假设选中的行数和列数是0电平,而其他的行数和列数
4、都是1电平。所以输入端应是行数与列数,而输出端是两个数码管的显示。5. 模块分析(1)输入输出解释 输入: clk -时钟信号 rst -清零 row -行线 column -列线 输出: dataout1 -数码管显示数据,个位 dataout2 -数码管显示数据,十位 en -数码管显示使能 (2)模块解释PROCESS(clk,rst) BEGIN IF (NOT rst = '1') THEN key_code <= "0000" ELSIF(clk'EVENT AND clk='1')THEN -上升沿有效 CASE
5、row IS -检测何处有键按下 WHEN "1110" => CASE column IS WHEN "1110" => key_code <= "0000" WHEN "1101" => key_code <= "0001" WHEN "1011" => key_code <= "0010" WHEN "0111" => key_code <= "0011"
6、WHEN OTHERS => NULL; END CASE; ( 中间省略相同步骤 ) WHEN OTHERS => key_code <= "1111" END CASE; END IF; END PROCESS;(这部分用key_code 这个四位寄存器来代表16个键)PROCESS(key_code) BEGIN CASE key_code IS WHEN "0000" => dataout_tmp1 <= "10011111" dataout_tmp2 <= "00000011&q
7、uot; WHEN "0001" => dataout_tmp1 <= "00100101" dataout_tmp2 <= "00000011" (中间省略相同部分) END CASE; END PROCESS;(这部分中,对于相应的key_code值输出相应的数值)6. 逻辑仿真图及功能分析当选中第一行第一列时,输出端的两个数码管显示是01(00000011 10011111)当选中第一行第二列时,输出端的两个数码管显示是02(00000011 00100101)当选中第一行第三列时,输出端的两个数码管显示是03
8、(00000011 00001101)当选中第一行第四列时,输出端的两个数码管显示是04(00000011 10011001)当选中第二行第一列时,输出端的两个数码管显示是05(00000011 01001001)当选中第二行第二列时,输出端的两个数码管显示是06(00000011 01000001)当选中第二行第三列时,输出端的两个数码管显示是07(00000011 00011111)当选中第二行第四列时,输出端的两个数码管显示是08(00000011 00000001)当选中第三行第一列时,输出端的两个数码管显示是09(00000011 00001001)当选中第三行第二列时,输出端的两个
9、数码管显示是10(00000011 00000011)当选中第三行第三列时,输出端的两个数码管显示是11(00000011 00000011) 当选中第三行第四列时,输出端的两个数码管显示是12(00000011 00100101)当选中第四行第一列时,输出端的两个数码管显示是13(00000011 00001101)当选中第四行第二列时,输出端的两个数码管显示是14(00000011 10011001)当选中第四行第三列时,输出端的两个数码管显示是15(00000011 01001001)当选中第四行第四列时,输出端的两个数码管显示是16(00000011 01000001)7. 调试过程与
10、问题(1)操作问题:由于我是第一次接触这个软件,在操作时会忘了一些必要的步骤,从而导致系统出现error,不能运行下去,但是多操作几次以后这种问题就可以被解决了。(2)设计问题:联系实际,矩阵键盘中的row一般设计成输出,然后采用扫描的方法进行数码管的输出。但在功能仿真的时候出现了只能扫描出1,2,3,4的情况,仔细分析问题后发现,在确定column了以后,扫描都会从第一列开始,所以采用这种方法就只能出现1,2,3,4四个数字,为了使其他的数字也可以在功能仿真的出现,所以我在仿真的时候将row设计成了输入,以确保每一个数字都有出现的机会。(3)时延问题:在功能仿真的时候,在除了01这个数字的显
11、示外,每个数字的显示都会出现一小段的时延。一开始我留意到这个问题时我没有理解,后来我去查看了源代码,然后发现在键盘上的按键按下之前,两个数码管分别默认输出数字是01,如果是按下的是别的键,那么输出的时候会有一定的时延,而它们在真正跳变之前,第一个数码管会显示0,第二个数码管会显示1。8. 实验总结 通过这个设计实验,我学习到了很多知识。在做这个矩阵键盘的实验设计的过程中,我通过查阅资料和搜集有关的文献,培养了自学能力。并且由原先的被动的接受知识转化为主动的寻求知识,这可以说是学习方法上的一个很大的突破。虽然我之前从来没有用过这个软件,也没有接触过VHDL语言,但是我依然可以通过自学,查阅资料和
12、与同学之间讨论交流来做出这个课题,我想将来不管遇到什么样的题目,只要我采用同样的方法和态度,总会可以找到解决的方案的。9. 附录(VHDL源程序)-矩阵键盘按键的数码管显示 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY KEYSCAN IS PORT ( clk : IN std_logic; rst : IN std_logic; row : IN std_logic_vector(3 DOWNTO 0);-行线 colu
13、mn : IN std_logic_vector(3 DOWNTO 0);-列线 dataout1 : OUT std_logic_vector(7 DOWNTO 0); - 数码管显示数据,个位 dataout2 : OUT std_logic_vector(7 DOWNTO 0); - 数码管显示数据,十位 en : OUT std_logic); -数码管显示使能 END KEYSCAN;ARCHITECTURE arch OF KEYSCAN ISSIGNAL key_code : std_logic_vector(3 DOWNTO 0); SIGNAL dataout_tmp1 :
14、std_logic_vector(7 DOWNTO 0); SIGNAL dataout_tmp2 : std_logic_vector(7 DOWNTO 0); BEGINdataout1 <= dataout_tmp1;dataout2 <= dataout_tmp2; en <= '0' PROCESS(clk,rst) BEGIN IF (NOT rst = '1') THEN key_code <= "0000" ELSIF(clk'EVENT AND clk='1')THEN -上升
15、沿有效 CASE row IS -检测何处有键按下 WHEN "1110" => CASE column IS WHEN "1110" => key_code <= "0000" WHEN "1101" => key_code <= "0001" WHEN "1011" => key_code <= "0010" WHEN "0111" => key_code <= "00
16、11" WHEN OTHERS => NULL; END CASE; WHEN "1101" => CASE column IS WHEN "1110" => key_code <= "0100" WHEN "1101" => key_code <= "0101" WHEN "1011" => key_code <= "0110" WHEN "0111" => key_co
17、de <= "0111" WHEN OTHERS => NULL; END CASE; WHEN "1011" => CASE column IS WHEN "1110" => key_code <= "1000" WHEN "1101" => key_code <= "1001" WHEN "1011" => key_code <= "1010" WHEN "0111&q
18、uot; => key_code <= "1011" WHEN OTHERS => NULL; END CASE; WHEN "0111" => CASE column IS WHEN "1110" => key_code <= "1100" WHEN "1101" => key_code <= "1101" WHEN "1011" => key_code <= "1110"
19、WHEN "0111" => key_code <= "1111" WHEN OTHERS => NULL; END CASE; WHEN OTHERS => key_code <= "1111" END CASE; END IF; END PROCESS;-显示键值-00000011 10011111 00100101 00001101 10011001 01001001 01000001 00011111- 0 1 2 3 4 5 6 7-00000001 00001001 - 8 9PROCESS(
20、key_code) BEGIN CASE key_code IS WHEN "0000" => dataout_tmp1 <= "10011111" dataout_tmp2 <= "00000011" WHEN "0001" => dataout_tmp1 <= "00100101" dataout_tmp2 <= "00000011" WHEN "0010" => dataout_tmp1 <= &quo
21、t;00001101" dataout_tmp2 <= "00000011" WHEN "0011" => dataout_tmp1 <= "10011001" dataout_tmp2 <= "00000011" WHEN "0100" => dataout_tmp1 <= "01001001" dataout_tmp2 <= "00000011" WHEN "0101" =>
22、 dataout_tmp1 <= "01000001" dataout_tmp2 <= "00000011" WHEN "0110" => dataout_tmp1 <= "00011111" dataout_tmp2 <= "00000011" WHEN "0111" => dataout_tmp1 <= "00000001" dataout_tmp2 <= "00000011" WHE
23、N "1000" => dataout_tmp1 <= "00001001" dataout_tmp2 <= "00000011" WHEN "1001" => dataout_tmp1 <= "00000011" dataout_tmp2 <= "10011111" WHEN "1010" => dataout_tmp1 <= "10011111" dataout_tmp2 <=
24、"10011111" WHEN "1011" => dataout_tmp1 <= "00100101" dataout_tmp2 <= "10011111" WHEN "1100" => dataout_tmp1 <= "00001101" dataout_tmp2 <= "10011111" WHEN "1101" => dataout_tmp1 <= "10011001&q
25、uot; dataout_tmp2 <= "10011111" WHEN "1110" => dataout_tmp1 <= "01001001" dataout_tmp2 <= "10011111" WHEN "1111" => dataout_tmp1 <= "01000001" dataout_tmp2 <= "10011111" WHEN OTHERS => NULL; END CASE; END P
26、ROCESS;END arch; 二 数码管学号滚动显示1实验目的 (1).使学生全面了解如何应用该硬件描述语言进行高速集成电路设计; (2).通过软件设计环节与仿真环节使学生熟悉Quartus II设计与仿真环境; (3).通过对基本题、综合题的设计实践,使学生掌握硬件系统设计方法(自底向上或自 顶向下),熟悉VHDL语言三种设计风格,熟悉其芯片硬件实现的过程。 2实验所用仪器及元器件(1)PC机(2)ALtera CPLD硬件实验开发系统 (3)设计软件(Quartus II )3实验任务要求 要求学生在六个数码管滚动显示自己的学号(六位),每隔一定时间循环移位一次,学号为奇数则左移,学号
27、为偶数则右移。间隔时间可由开关选择1秒,2秒,3秒和4秒。4. 设计思路 首先需要有六个数码管用于六位的学号的显示,而实现的时候可以在每个脉冲来临的时候使我的学号中六个数字010504依次在六个数码管上输出,而在六个脉冲之后,010504还是依次输出,但是显示的数码管不同,0在第二个数码管显示,1在第三个数码管显示,0在第四个数码管显示,5在第五个数码管显示,0在第六个数码管显示,4在第一个数码管显示。又一组六个脉冲过去以后,输出的位置会再改变一次,0在第三个数码管显示,1在第四个数码管显示,0在第五个数码管显示,5在第六个数码管显示,0在第一个数码管显示,4在第二个数码管显示。依次类推,就达
28、到了学号的右移效果。而间隔时间的改变可以由程序内部的某一步运行时的长短次数来实现。5. 模块分析(1)输入输出解释 输入: clk -时钟信号 column -行列式键盘的4列 输出: led_out -数码管8段显示,可显示09,AF led_sel -选择6个数码管,1表示点亮对应数码管 output -分频后的时钟 Interval -随学号移动而数值改变的寄存器(2) 模块解释A. 模块一PROCESS(clk)-12分频电路VARIABLE counter: std_logic_vector(2 downto 0);-计数寄存器,12分频输入时钟为 1Hz BEGIN IF (clk
29、'EVENT AND clk ='0') THEN -下降沿有效 counter := counter + 1 ; IF (counter = 6) THEN clk_temp <= NOT clk_temp; -分频后的时钟变化 counter := "000" END IF; END IF; END PROCESS; PROCESS(clk)-读取行列式键盘的键值(这段程序是对时钟clock进行分频,进而得到新的时钟clk_temp,并赋值给输出output)B. 模块二BEGIN IF(clk'EVENT AND clk =
30、39;0')THEN CASE column IS WHEN "1110" => key_code <= "00" WHEN "1101" => key_code <= "01" WHEN "1011" => key_code <= "10" WHEN "0111" => key_code <= "11" WHEN OTHERS => key_code <= "
31、;00" END CASE; END IF; END PROCESS;process (clk_temp)VARIABLE time_count : std_logic_vector(1 DOWNTO 0); begin if (clk_temp 'event and clk_temp = '0') then-下降沿有效time_count := time_count + 1; CASE key_code IS WHEN "00" => shift <= shift- 1;-数据右移1位if(shift = "000&
32、quot;) thenshift <="110"end if; WHEN "01" => if(time_count = "10") then time_count := "00" ; shift <= shift - 1;-数据右移1位if(shift = "000") thenshift <="110"end if; end if; WHEN "10" => if(time_count = "11")
33、then time_count := "00" shift <= shift - 1;-数据右移1位if(shift = "000") thenshift <="110"end if; end if; WHEN "11" => if(time_count = "00") then shift <= shift - 1;-数据右移1位if(shift = "000") thenshift <="110"end if; end i
34、f; WHEN OTHERS => shift <= shift - 1;-数据右移1位if(shift = "000") thenshift <="110"end if; END CASE;end if; end process; (这模块利用 key_code的四个数值来控制四个case,由于time_count 初始值是00,在进入运算时是01,根据case的不同,运行次数不同,分别是一次,两次,三次和四次,根据这个来控制移动的间隔时间。并且每次运行时shift的值会减小1,这与数据的右移有关。)C. 模块三process (cl
35、k)-显示学号010504 VARIABLE led_sel_llb :std_logic_vector(3 DOWNTO 0); -信号量,6个数码管显示的选择 begin if (clk 'event and clk='0') then -时钟下降沿有效 if (led_sel_count = "0000") then-轮询6个数码管 led_sel_count <= "0101" else led_sel_count <= led_sel_count - "0001" end if; -0xc
36、0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 空 case led_sel_count is -选择要要显示的值 when "0000" => led_out <= X"99" -位置6,内容4 when "0001" => led_out <= X"c0" -位置5,内容0 when "0010" => led_out <= X"
37、;92" -位置4,内容5 when "0011" => led_out <= X"c0" -位置3,内容0 when "0100" => led_out <= X"f9" -位置2,内容1 when "0101" => led_out <= X"c0" -位置1,内容0 when others => led_out <= X"92" -其他情况下,位置6,内容5 end case; led_sel
38、_llb := led_sel_count + shift;if (led_sel_llb >= "0110") then led_sel_llb := led_sel_llb - "0110"end if; case led_sel_llb is -选择要被点亮的数码管 when "0000" => led_sel <= "000001" -位置6 when "0001" => led_sel <= "000010" -位置5 when &qu
39、ot;0010" => led_sel <= "000100" -位置4 when "0011" => led_sel <= "001000" -位置3 when "0100" => led_sel <= "010000" -位置2 when "0101" => led_sel <= "100000" -位置1 when others => led_sel <= "000001
40、" -其他情况下,位置6,内容5 end case; end if; end process; (这模块中, led_sel用来表示选中的数码管, led_out 表示输出的数值。每一个clock过来,都会输出一个数,依次是0-1-0-5-0-4,而数字输出在哪个数码管是由相同时刻的led_sel决定的。由于时钟的跳动很快,虽然每个时钟来临时只有一个数码管被点亮,但是人眼是无法分辨的,所以在视觉上还是每个数码管都被点亮了,就是亮度没有静态显示的时候亮。这样动态的运用对于节约电能也是有所贡献的。)6. 逻辑仿真图及功能分析(1)右移功能的展示:(led-sel表示选中点亮的数码管,10
41、0000表示点亮左侧第一个,010000表示点亮左侧第二个,一次类推;led-out表示选中数码管显示的数字,11000000表示0,11111001表示1,10010010表示5,10011001表示4)一开始六个数码管从左至右分别为0-1-0-5-0-4第一个时钟output的下降沿来临时时,显示右移一位4-0-1-0-5-0没有时钟output下降沿,显示不变4-0-1-0-5-0第二个时钟output下降沿来临,显示右移一位0-4-0-1-0-5没有output下降沿,显示不改变0-4-0-1-0-5第三个时钟output下降沿来临,显示右移一位5-0-4-0-1-0(2) 四个不同循
42、环间隔功能的展示:(每次数码管显示的数字有改变时,interval的数值都会减小一位,即只要比较interval的数值变化快慢就可以知道移动一位的时间间隔了,令时钟output的一个周期为T。选择间隔是由column来决定的,1110表示循环间隔为1秒,1101表示循环间隔为2秒,1011表示循环间隔为3秒,0111表示循环间隔为4秒)Column为1110,interval=TColumn为1101,interval=2TColumn为1011,interval=3TColumn为0111,interval=4T7. 调试过程与问题(1)操作问题:由于我是第一次接触这个软件,在操作时会忘了一
43、些必要的步骤,从而导致系统出现error,不能运行下去,但是多操作几次以后这种问题就可以被解决了。(2)设计问题:题目要求是间隔时间可由开关选择1秒,2秒,3秒和4秒,虽然我可以做到间隔时间可由开关选择T,2T,3T,4T,但对于如何使T=1秒,我还是没有知道应该如何实现。(3)截图问题:根据实验报告的要求,要把仿真的图截下来,而数码管显示的变化要能够看出来,图片就需要很长,实际上无法截下来,所以,我在完成后增加了一个寄存器interval,每当学号移动时,interval的数值会减小一位,这样,只要将时钟周期变小,压缩图片,观察每个interval所占的周期长短就可以了。8. 实验总结 通过
44、这个设计实验,我学习到了很多知识。在做这个数码管学号滚动显示的实验设计的过程中,我通过查阅资料和搜集有关的文献,培养了自学能力。并且由原先的被动的接受知识转化为主动的寻求知识,这可以说是学习方法上的一个很大的突破。虽然我之前从来没有用过这个软件,也没有接触过VHDL语言,但是我依然可以通过自学,查阅资料和与同学之间讨论交流来做出这个课题,我想将来不管遇到什么样的题目,只要我采用同样的方法和态度,总会可以找到解决的方案的。并且通过这次实验我充分体会到了集思广益的好处。很多时候,并不是只有请教会的人才可以得到答案,往往在大家都不会的时候,讨论着讨论着,就会有灵感出现,而灵感出现的时候一定要去尝试,并且不断的改进。通过这次实验,我对VHDL语言有了进一步的理解,也进一步理解了课堂上关于时序逻辑
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (二模)青岛市2025年高三年级第二次适应性检测历史试卷(含标准答案)
- 技务知识培训试题及答案
- 我的家乡-高淳2
- 当代科学技术试题及答案
- 立体裁剪技法解析试题及答案
- 爆破工考试题库及答案
- 新型电力系统下构网型储能技术研究与应用
- 福建体育笔试试题及答案
- 2024年广告设计师如何提升自我竞争力试题及答案
- 2024国际美术设计师考试FAQ试题及答案
- 2024光伏发电工程质量评价标准细则
- 人工智能基础知到智慧树章节测试课后答案2024年秋北京科技大学
- 呼吸康复指南解读
- 2025年上海市高考语文备考之记、论、说等文言文二知识点汇编(附录24一模文言文二高频分析题汇编)
- 【MOOC】英语畅谈中国-湖北大学 中国大学慕课MOOC答案
- 2024年代耕代种协议书模板范本
- 感恩母亲课件
- 全国青少年信息素养大赛图形化编程专项测试题及答案
- 村镇集市改造项目方案
- 国家安全教育高教-第六章坚持以经济安全为基础
- 期中测试卷-2024-2025学年语文五年级上册统编版
评论
0/150
提交评论