1、EDA 技术课程设计报告题目: LED 点阵汉字显示 姓 名 学 号 班 级 指导教师 2012 年 1 月 12 日要求:1指导教师按照课程设计大纲要求完成学生课程设计指导工作。2课程设计任务书由指导教师照大纲要求填写,内容要全面。3课程设计报告由参加本学生填写。课程设计结束时交指导教师。4指导教师要根据每一位学生课程设计任务完成情况,认真审核设计报告,并在课程设计结束时,给出客观、准确的评语和成绩。5课程设计任务书和报告要语言流畅,图表正确规范。课程设计任务书课程设计内容与要求要求:1 及格:在实验箱上 16*16 点阵模块上显示汉字“电” ;2 中:设置不同的清屏方式;3 良:滚动显示汉
2、字“电” ;4 优:滚动显示“电子信息工程” ;2011 年 12 月 26 日一、设计原理与技术方法:1.电路工作原理分析与原理图1.1.LED 点阵屏原理实验室用的是一个 16*16 的点阵,是用四个 8*8 点阵组合而成,点阵内部结构及外形如图 1,点阵共由 256 个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置 1 电平,某一列置 0 电平,则相应的二极管就亮。图 1 内部连接后效果图图 2 内部连接图 图 3 实物图如要将第一个点点亮,则行的 1 脚接高电平,列的 1 脚接低电平,则第一个点就亮了;如果要将第一行点亮,则行的 1 脚要接高电平,而 1
3、6 列引脚全接低电平,那么第一行就会点亮;如要将第一列点亮,则列的 1 脚接低电平,行全接高电平,那么第一列就会点亮. 。实验箱的接法是:通过一个四十六译码电路(译码器)选中列,再给行赋值十六个位数据,所以如要将第一列点亮,只需译码电路的输入是“0000”选中第一列,送数据“0000000000000000 ”,通过对软件设置,取阴码后,送数据“1111111111111111”效果一样。(软件的使用在下面说明)1.2.点阵 LED 扫描法介绍 :点阵 LED 一般采用扫描式显示,实际运用分为三种方式: (1)点扫描(2)行扫描(3)列扫描若使用第一种方式,其扫描频率必须大于 1664=102
4、4Hz,周期小于 1ms 即可。若使用第二和第三种方式,则频率必须大于 168=128Hz,周期小于 7.8ms 即可符合视觉暂留要求。此外一次驱动一列或一行(8 颗 LED)时需外加驱动电路提高电流,否则LED 亮度会不足。1.3 汉字的显示一般我们使用点阵显示汉字是用的 16*16 的点阵宋体字库,所谓 16*16,是每一个汉字在纵、横各 16 点的区域内显示的。如图四所示,要显示“电”则相应的点就要点亮,所以要显示“ 电” 字的话, 第一时刻选中第一列, 列送数据“0000000000000000” x“0000“(十六进制表示)第二时刻选中第一列, 列送数据“0000000000000
5、000” x“0000“第三时刻选中第一列, 列送数据“00001111111111000” x“0FF8“;第四时刻选中第一列, 列送数据“0000010001001000” x“0448“第五时刻选中第一列, 列送数据“0000010001001000” x“0448“第六时刻选中第一列, 列送数据“0000010001001000” x“0448“第七时刻选中第一列, 列送数据“0000010001001000” x“0448“第八时刻选中第一列, 列送数据“00111111111111111” x“3FFF“第九时刻选中第一列, 列送数据“0100010001001000” x“444
6、8“第十时刻选中第一列, 列送数据“0100010001001000” x“4448“第十一时刻选中第一列,列送数据“0100010001001000” x“4448“第十二时刻选中第一列,列送数据“0100010001001000” x“4448“第十三时刻选中第一列,列送数据“01001111111111000” x“4FF8“第十四时刻选中第一列,列送数据“0100000000000000” x“4000“第十五时刻选中第一列,列送数据“0111000000000000” x“7000“第十六时刻选中第一列,列送数据“0000000000000000” x“0000“单独显示:当送数据的
7、频率够大时(每秒大于二十四次) ,肉眼看到的效果就是一个静态显示的“电”字;左右清屏:在第一个 16 个时钟送电的十六列代码,下一个 16 个时钟送电的后十五列代码,在下一个 16 个时钟送电的后 14 列代码,第十五个 16 个时钟只送电的最后一列代码,就是电的左清屏显示。上下清屏:在第一个 16 个时钟送电的十六列代码,下一个 16 个时钟送抹掉第一行的电的后十六列代码,在下一个 16 个时钟送抹掉前两行的电的十六列代码,第十五个16 个时钟只送抹掉前十五行的电的十六列代码,就是电的上清屏显示。左右滚动:下一个十六个时钟,每列数据前移一次,后一列补零即是滚动显示滚动六个字:同单个字的滚动显
8、示,只不过是每列数据前移一次,后一列补下一个字的第一列,以此类推,即是六个字的滚动显示。推荐一款汉字取模的软件:图 4 取模软件界面图1.4.程序源代码(1)电单独显示编程思路:每一个时钟沿,列计数器加一,选中下一列,通过 CASE 语句,送入相应的列数据。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dian isport(clk0,clr:in std_logic;sel:out std_logic_vector(3 downto 0); -列选信号line:out std_l
9、ogic_vector(15 downto 0); - 行选信号end dian;architecture rtl of dian issignal q: std_logic_vector(3 downto 0); -内部计数器(16 进制) beginp1:process(clk0,clr) beginif(clr=1)thenq“1111“)thenqlinelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;end process p2;sel if counter=0 then line i
10、f counter=1 then line if counter=2 then line if counter=3 then line if counter=4 then line if counter=5 then line if counter=6 then line if counter=7 then line if counter=8 then line if counter=9 then line if counter=10 then line if counter=11 then line if counter=12 then line if counter=13 then lin
11、e if counter=14 then line if counter=15 then line null;end case;end if;end process;sel if counter=0 then line if counter=1 then line if counter=2 then line if counter=3 then line if counter=4 then line if counter=5 then line if counter=6 then line if counter=7 then line if counter=8 then line if cou
12、nter=9 then line if counter=10 then line if counter=11 then line if counter=12 then line if counter=13 then line if counter=14 then line if counter=15 then line null;end case;end if;end process;sel“1111“)thenq -case 语句case q is -嵌套的 case 语句when “0000“=linelinelinelinelinelinelinelinelinelinelineline
13、linelinelinelinenull;end case;when “0001“=case q is -向下移一位when “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “0010“=case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “0011“=case q iswhen “0000“=lineline
14、linelinelinelinelinelinelinelinelinelinelinelinelinelinenull; end case;when “0100“=case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “0101“=case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “0
15、110“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “0111“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1000“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinel
16、inelinelinelinenull;end case;when “1001“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1010“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1011“= case q iswhen “0000“=linelinelinel
17、inelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1100“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1101“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1110“
18、= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1111“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when others=null;end case;end process p2;end rtl;2-4 电显示、清屏、滚动整合设计两个四选一模块,用两个开关控制需要的输出的
19、模块,原理图如图 5 所示。图 5 整合原理图电路说明:四个功能模块分别是电单独显示,电左清屏,电右清屏,电右滚动,分别输出列选值和列数据值,电路由统一时钟驱动,每个模块内部有分频计数器;SEL5是个五路选择器,由三个开关 SEL2,SEL1.SEL0 选择哪个输出,其关系如表 1 所示。开关状态 输出SEL1 SEL00 0 电单独显示0 1 电左清屏1 0 电右清屏1 1 电滚动其他 无表 1 开关状态和输出的关系四选一模块程序代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;enti
20、ty choose isport(key:in std_logic_vector(1 downto 0);data1,data2,data3:in std_logic_vector(15 downto 0);line:out std_logic_vector(15 downto 0);end choose;architecture bev of choose issignal q: std_logic_vector(15 downto 0);beginline“1111“)thenchoose“1111“)thenqcase q iswhen “0000“=linelinelinelineli
21、nelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “0001“=case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “0010“=case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “0011“=case q
22、 iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “0100“=case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “0101“=case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelin
23、enull;end case;when “0110“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “0111“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1000“= case q iswhen “0000“=linelinelinelinelinelinelin
24、elinelinelinelinelinelinelinelinelinenull;end case;when “1001“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1010“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1011“= case q iswhe
25、n “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1100“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1101“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenul
26、l;end case;when “1110“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when “1111“= case q iswhen “0000“=linelinelinelinelinelinelinelinelinelinelinelinelinelinelinelinenull;end case;when others=null;end case;end process p2;end rtl;方法二:(此种用到二维数组实现,
27、缺陷是滚动过快很难调节,这点由于时间关系没能继续改进)程序代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity final is port( clk0,clr:in std_logic; -时钟sel:out std_logic_vector( 3 downto 0); -四十六译码后决定是哪一列line :out std_logic_vector(15 downto 0) -显示所需的列数据);end final;arc
28、hitecture behavior of final issignal fline: std_logic_vector(0 to 3); type date112_16 is array(0 to 111)of std_logic_vector(15 downto 0); -定义 128*16 的数组存放代码signal d:date112_16;signal q: std_logic_vector(3 downto 0);begind(0)=“0000000000000000“;d(1)=“0000000000000000“;d(2)=“0000000000000000“;d(3)=“00
29、00000000000000“;d(4)=“0000000000000000“;d(5)=“0000000000000000“;d(6)=“0000000000000000“;d(7)=“0000000000000000“;d(8)=“0000000000000000“;d(9)=“0000000000000000“;d(10)=“0000000000000000“;d(11)=“0000000000000000“;d(12)=“0000000000000000“;d(13)=“0000000000000000“;d(14)=“0000000000000000“;d(15)=“00000000
30、00000000“;d(16)=“0000000100000000“; -电d(17)=“0000000100000000“;d(18)=“0000000100000000“;d(19)=“0011111111111000“;d(20)=“0010000100001000“;d(21)=“0010000100001000“;d(22)=“0011111111111000“;d(23)=“0010000100001000“;d(24)=“0010000100001000“;d(25)=“0010000100001000“;d(26)=“0011111111111000“;d(27)=“00100
31、00100001000“;d(28)=“0000000100000010“;d(29)=“0000000100000010“;d(30)=“0000000011111110“;d(31)=“0000000000000000“;d(32)=“0000000000000000“; -子d(33)=“0011111111110000“;d(34)=“0000000000100000“;d(35)=“0000000001000000“;d(36)=“0000000010000000“;d(37)=“0000000100000000“;d(38)=“0000000100000000“;d(39)=“0000000100000100“;d(40)=“1111111111111110“;d(41)=“0000000100000000“;